Skip to content

Commit

Permalink
feat: new list rooms external endpoint (#315)
Browse files Browse the repository at this point in the history
* feat: new list rooms external endpoint

* feat: remove user import on externa rooms filter
  • Loading branch information
helllllllder authored Dec 4, 2023
1 parent b0a2524 commit 455bec2
Show file tree
Hide file tree
Showing 4 changed files with 81 additions and 2 deletions.
9 changes: 9 additions & 0 deletions chats/apps/api/v1/external/rooms/filters.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
from django_filters import rest_framework as filters

from chats.apps.rooms.models import Room


class RoomFilter(filters.FilterSet):
class Meta:
model = Room
fields = ["urn", "is_active"]
25 changes: 25 additions & 0 deletions chats/apps/api/v1/external/rooms/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
from chats.apps.api.v1.accounts.serializers import UserSerializer
from chats.apps.api.v1.contacts.serializers import ContactRelationsSerializer
from chats.apps.api.v1.queues.serializers import QueueSerializer
from chats.apps.api.v1.sectors.serializers import TagSimpleSerializer
from chats.apps.contacts.models import Contact
from chats.apps.dashboard.models import RoomMetrics
from chats.apps.queues.models import Queue
Expand Down Expand Up @@ -76,6 +77,30 @@ def get_room_user(
return user if permission else None


class RoomListSerializer(serializers.ModelSerializer):
contact = serializers.CharField(source="contact.name")
contact_external_id = serializers.CharField(source="contact.external_id")
waiting_time = serializers.IntegerField(source="metric.waiting_time")
interaction_time = serializers.IntegerField(source="metric.interaction_time")
tags = TagSimpleSerializer(many=True, required=False)

class Meta:
model = Room
fields = [
"uuid",
"user",
"contact",
"contact_external_id",
"urn",
"is_active",
"ended_at",
"created_on",
"waiting_time",
"interaction_time",
"tags",
]


class RoomFlowSerializer(serializers.ModelSerializer):
user = UserSerializer(many=False, required=False, read_only=True)
user_email = serializers.SlugRelatedField(
Expand Down
43 changes: 41 additions & 2 deletions chats/apps/api/v1/external/rooms/viewsets.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,20 @@
from django.core.exceptions import ObjectDoesNotExist, ValidationError
from django.db import IntegrityError
from django.utils import timezone
from rest_framework import status, viewsets
from django_filters.rest_framework import DjangoFilterBackend
from rest_framework import filters, status, viewsets
from rest_framework.decorators import action
from rest_framework.pagination import CursorPagination
from rest_framework.response import Response

from chats.apps.accounts.authentication.drf.authorization import (
ProjectAdminAuthentication,
)
from chats.apps.api.v1.external.permissions import IsAdminPermission
from chats.apps.api.v1.external.rooms.serializers import RoomFlowSerializer
from chats.apps.api.v1.external.rooms.serializers import (
RoomFlowSerializer,
RoomListSerializer,
)
from chats.apps.dashboard.models import RoomMetrics
from chats.apps.rooms.models import Room
from chats.apps.rooms.views import (
Expand All @@ -22,6 +27,8 @@
update_flows_custom_fields,
)

from .filters import RoomFilter


def add_user_or_queue_to_room(instance, request):
# TODO Separate this into smaller methods
Expand Down Expand Up @@ -252,3 +259,35 @@ def partial_update(self, request, pk=None):
{"Detail": "Custom Field edited with success"},
status.HTTP_200_OK,
)


class ExternalListRoomsViewSet(viewsets.ReadOnlyModelViewSet):
model = Room
queryset = Room.objects
serializer_class = RoomListSerializer
lookup_field = "uuid"
authentication_classes = [ProjectAdminAuthentication]

filter_backends = [
filters.OrderingFilter,
filters.SearchFilter,
DjangoFilterBackend,
]
ordering = ["-created_on"]
search_fields = [
"contact__external_id",
"contact__name",
"user__email",
"urn",
]
filterset_class = RoomFilter

pagination_class = CursorPagination
pagination_class.page_size = 5

def get_queryset(self):
return (
super()
.get_queryset()
.filter(queue__sector__project=self.request.auth.project)
)
6 changes: 6 additions & 0 deletions chats/apps/api/v1/routers.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
from chats.apps.api.v1.external.queues.viewsets import QueueFlowViewset
from chats.apps.api.v1.external.rooms.viewsets import (
CustomFieldsUserExternalViewSet,
ExternalListRoomsViewSet,
RoomFlowViewSet,
RoomUserExternalViewSet,
)
Expand Down Expand Up @@ -141,6 +142,11 @@ def get_lookup_regex(self, viewset, lookup_prefix=""):
CustomFieldsUserExternalViewSet,
basename="external_custom_field",
)
router.register(
"external/list_rooms",
ExternalListRoomsViewSet,
basename="external_room_list",
)
router.register("external/sectors", SectorFlowViewset, basename="external_sector")
router.register("external/queues", QueueFlowViewset, basename="external_queue")
router.register("external/agents", AgentFlowViewset, basename="external_agent")

0 comments on commit 455bec2

Please sign in to comment.