Skip to content

Commit

Permalink
feat: room list optimization
Browse files Browse the repository at this point in the history
  • Loading branch information
helllllllder committed Oct 1, 2024
1 parent bd434b6 commit d1bcc77
Show file tree
Hide file tree
Showing 4 changed files with 69 additions and 10 deletions.
6 changes: 0 additions & 6 deletions chats/apps/api/v1/accounts/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,21 +14,15 @@ class Meta:


class UserSerializer(serializers.ModelSerializer):
status = serializers.SerializerMethodField()

class Meta:
model = User
fields = [
"first_name",
"last_name",
"email",
"status",
]
ref_name = None

def get_status(self, user: User):
return ""


class UserNameSerializer(serializers.ModelSerializer):
class Meta:
Expand Down
14 changes: 11 additions & 3 deletions chats/apps/api/v1/projects/viewsets.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@
import json

from django.core.exceptions import ObjectDoesNotExist, ValidationError
from django.db.models import CharField, Value
from django.db.models.functions import Concat
from django_filters.rest_framework import DjangoFilterBackend
from drf_yasg import openapi
from drf_yasg.utils import swagger_auto_schema
from rest_framework import status, viewsets, mixins
from rest_framework import filters, mixins, status, viewsets
from rest_framework.decorators import action
from rest_framework.pagination import LimitOffsetPagination
from rest_framework.permissions import IsAuthenticated
Expand Down Expand Up @@ -426,10 +429,15 @@ def partial_update(self, request, uuid=None):


class ProjectPermissionViewset(viewsets.ReadOnlyModelViewSet):
queryset = ProjectPermission.objects.all()
queryset = ProjectPermission.objects.all().annotate(
full_name=Concat(
"user__first_name", Value(" "), "user__last_name", output_field=CharField()
)
)
serializer_class = ProjectPermissionReadSerializer
permission_classes = []
filter_backends = [DjangoFilterBackend]
filter_backends = [DjangoFilterBackend, filters.SearchFilter]
search_fields = ["user__email", "full_name"]
filterset_fields = ["project", "role", "status"]
lookup_field = "uuid"

Expand Down
56 changes: 55 additions & 1 deletion chats/apps/api/v1/rooms/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,10 @@

from chats.apps.accounts.models import User
from chats.apps.api.v1.accounts.serializers import UserSerializer
from chats.apps.api.v1.contacts.serializers import ContactRelationsSerializer
from chats.apps.api.v1.contacts.serializers import (
ContactRelationsSerializer,
ContactSimpleSerializer,
)
from chats.apps.api.v1.queues.serializers import QueueSerializer
from chats.apps.api.v1.sectors.serializers import DetailSectorTagSerializer
from chats.apps.queues.models import Queue
Expand Down Expand Up @@ -87,6 +90,57 @@ def get_can_edit_custom_fields(self, room: Room):
return room.queue.sector.can_edit_custom_fields


class ListRoomSerializer(serializers.ModelSerializer):
user = UserSerializer(many=False, read_only=True)
contact = ContactSimpleSerializer(many=False, read_only=True)
unread_msgs = serializers.SerializerMethodField()
last_message = serializers.SerializerMethodField()
is_waiting = serializers.SerializerMethodField()
is_24h_valid = serializers.SerializerMethodField()
last_interaction = serializers.DateTimeField(read_only=True)
can_edit_custom_fields = serializers.SerializerMethodField()

class Meta:
model = Room
fields = [
"uuid",
"user",
"contact",
"unread_msgs",
"last_message",
"is_waiting",
"is_24h_valid",
"last_interaction",
"can_edit_custom_fields",
"custom_fields",
"urn",
"transfer_history",
"protocol",
"service_chat",
]

def get_is_24h_valid(self, room: Room) -> bool:
return room.is_24h_valid

def get_is_waiting(self, room: Room):
return room.get_is_waiting()

def get_unread_msgs(self, room: Room):
return room.messages.filter(seen=False).count()

def get_last_message(self, room: Room):
last_message = (
room.messages.order_by("-created_on")
.exclude(user__isnull=True, contact__isnull=True)
.exclude(text="")
.first()
)
return "" if last_message is None else last_message.text

def get_can_edit_custom_fields(self, room: Room):
return room.queue.sector.can_edit_custom_fields


class TransferRoomSerializer(serializers.ModelSerializer):
user = UserSerializer(many=False, required=False, read_only=True)
user_email = serializers.SlugRelatedField(
Expand Down
3 changes: 3 additions & 0 deletions chats/apps/api/v1/rooms/viewsets.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
from chats.apps.api.v1.msgs.serializers import ChatCompletionSerializer
from chats.apps.api.v1.rooms import filters as room_filters
from chats.apps.api.v1.rooms.serializers import (
ListRoomSerializer,
RoomMessageStatusSerializer,
RoomSerializer,
TransferRoomSerializer,
Expand Down Expand Up @@ -68,6 +69,8 @@ def get_queryset(self):
def get_serializer_class(self):
if "update" in self.action:
return TransferRoomSerializer
elif "list" in self.action:
return ListRoomSerializer
return super().get_serializer_class()

@action(
Expand Down

0 comments on commit d1bcc77

Please sign in to comment.