Skip to content

Commit

Permalink
feat: update room serializers and list action
Browse files Browse the repository at this point in the history
  • Loading branch information
helllllllder committed Jul 14, 2023
1 parent c8518c6 commit 4bc0414
Show file tree
Hide file tree
Showing 9 changed files with 85 additions and 41 deletions.
10 changes: 10 additions & 0 deletions chats/apps/api/v1/accounts/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,3 +36,13 @@ def get_status(self, user: User):

def get_last_interaction(self, user: User):
return user.last_interaction


class UserSimpleSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = [
"first_name",
"last_name",
"email",
]
11 changes: 10 additions & 1 deletion chats/apps/api/v1/contacts/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@


class ContactSerializer(serializers.ModelSerializer):

room = serializers.SerializerMethodField()

class Meta:
Expand Down Expand Up @@ -87,3 +86,13 @@ class ContactWSSerializer(serializers.ModelSerializer):
class Meta:
model = Contact
fields = "__all__"


class ContactSimpleSerializer(serializers.ModelSerializer):
class Meta:
model = Contact
fields = [
"uuid",
"external_id",
"name",
]
2 changes: 1 addition & 1 deletion chats/apps/api/v1/external/msgs/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ def create(self, validated_data):
validated_data["contact"] = room.contact

is_waiting = room.get_is_waiting()
was_24h_valid = room.is_24h_valid
was_24h_valid = room.validate_24h
msg = super().create(validated_data)
media_list = [MessageMedia(**media_data, message=msg) for media_data in medias]
medias = MessageMedia.objects.bulk_create(media_list)
Expand Down
2 changes: 1 addition & 1 deletion chats/apps/api/v1/projects/viewsets.py
Original file line number Diff line number Diff line change
Expand Up @@ -262,7 +262,7 @@ def start_flow(self, request, *args, **kwargs):
{"Detail": "There already is an active flow start for this room"},
status.HTTP_400_BAD_REQUEST,
)
if not room.is_24h_valid:
if not room.validate_24h:
flow_start_data["room"] = room
room.request_callback(room.serialized_ws_data)
except (ObjectDoesNotExist, ValidationError):
Expand Down
7 changes: 6 additions & 1 deletion chats/apps/api/v1/queues/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@


class QueueSerializer(serializers.ModelSerializer):

sector_name = serializers.CharField(source="sector.name", read_only=True)

class Meta:
Expand Down Expand Up @@ -99,3 +98,9 @@ class Meta:

def get_user(self, auth):
return UserSerializer(auth.permission.user).data


class QueueSimpleSerializer(serializers.ModelSerializer):
class Meta:
model = Queue
fields = ["uuid", "name"]
32 changes: 11 additions & 21 deletions chats/apps/api/v1/rooms/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,12 @@
from rest_framework import serializers

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.queues.serializers import QueueSerializer
from chats.apps.api.v1.accounts.serializers import UserSerializer, UserSimpleSerializer
from chats.apps.api.v1.contacts.serializers import (
ContactRelationsSerializer,
ContactSimpleSerializer,
)
from chats.apps.api.v1.queues.serializers import QueueSerializer, QueueSimpleSerializer
from chats.apps.api.v1.sectors.serializers import DetailSectorTagSerializer
from chats.apps.queues.models import Queue
from chats.apps.rooms.models import Room
Expand All @@ -21,15 +24,14 @@ class RoomMessageStatusSerializer(serializers.Serializer):


class RoomSerializer(serializers.ModelSerializer):
user = UserSerializer(many=False, read_only=True)
contact = ContactRelationsSerializer(many=False, read_only=True)
queue = QueueSerializer(many=False, read_only=True)
user = UserSimpleSerializer(many=False, read_only=True)
contact = ContactSimpleSerializer(many=False, read_only=True)
queue = QueueSimpleSerializer(many=False, read_only=True)
tags = DetailSectorTagSerializer(many=True, read_only=True)
unread_msgs = serializers.IntegerField(required=False, default=0)
linked_user = serializers.CharField(read_only=True)
is_24h_valid = serializers.BooleanField(default=True)
last_message = serializers.SerializerMethodField()
is_waiting = serializers.SerializerMethodField()
linked_user = serializers.SerializerMethodField()
is_24h_valid = serializers.SerializerMethodField()
flowstart_data = serializers.SerializerMethodField()
last_interaction = serializers.DateTimeField(read_only=True)

Expand All @@ -46,9 +48,6 @@ class Meta:
"last_interaction",
]

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

def get_flowstart_data(self, room: Room) -> bool:
try:
flowstart = room.flowstarts.get(is_deleted=False)
Expand All @@ -60,15 +59,6 @@ def get_flowstart_data(self, room: Room) -> bool:
"created_on": flowstart.created_on,
}

def get_linked_user(self, room: Room):
try:
return room.contact.get_linked_user(room.queue.sector.project).full_name
except AttributeError:
return ""

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

def get_last_message(self, room: Room):
last_message = (
room.messages.order_by("-created_on")
Expand Down
58 changes: 44 additions & 14 deletions chats/apps/api/v1/rooms/viewsets.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,18 @@

from django.conf import settings
from django.db import connection, reset_queries
from django.db.models import Count, F, Max, Q, Sum
from django.db.models import (
Count,
F,
Max,
Q,
Sum,
CharField,
Value,
Case,
When,
BooleanField,
)
from django.utils import timezone
from django_filters.rest_framework import DjangoFilterBackend
from rest_framework import filters, mixins, permissions, status
Expand All @@ -22,6 +33,12 @@
from chats.apps.msgs.models import Message
from chats.apps.rooms.models import Room

from rest_framework.pagination import CursorPagination

from django.db.models.functions import Concat

from datetime import timedelta


def database_debug(func, *args, **kwargs):
def inner_func(*args, **kwargs):
Expand All @@ -43,18 +60,7 @@ class RoomViewset(
mixins.UpdateModelMixin,
GenericViewSet,
):
queryset = (
Room.objects.all()
.select_related(
"user",
"contact",
"queue",
"metric",
"queue__sector",
"queue__sector__project",
)
.prefetch_related("messages", "flowstarts")
)
queryset = Room.objects.all()
serializer_class = RoomSerializer
filter_backends = [
OrderingFilter,
Expand All @@ -65,6 +71,8 @@ class RoomViewset(
search_fields = ["contact__name", "urn"]
ordering_fields = "__all__"
ordering = ["user", "-last_interaction"]
pagination_class = CursorPagination
pagination_class.page_size_query_param = "limit"

@database_debug
def list(self, request, *args, **kwargs):
Expand All @@ -83,10 +91,32 @@ def get_queryset(self):
if self.action != "list":
self.filterset_class = None
qs = super().get_queryset()
return qs.annotate(

last_24h = timezone.now() - timedelta(days=1)

qs = qs.annotate(
last_interaction=Max("messages__created_on"),
unread_msgs=Count("messages", filter=Q(messages__seen=False)),
linked_user=Concat(
"contact__linked_users__user__first_name",
Value(" "),
"contact__linked_users__user__last_name",
filter=Q(contact__linked_users__project=F("queue__sector__project")),
output_field=CharField(),
),
last_contact_interaction=Max(
"messages__created_on", filter=Q(messages__contact__isnull=False)
),
is_24h_valid=Case(
When(last_contact_interaction__lt=last_24h, then=True),
default=False,
output_field=BooleanField(),
),
)
# import pdb

# pdb.set_trace()
return qs

def get_serializer_class(self):
if "update" in self.action:
Expand Down
2 changes: 1 addition & 1 deletion chats/apps/msgs/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ class Meta:
def save(self, *args, **kwargs) -> None:
if self.room.is_active is False:
raise ValidationError({"detail": _("Closed rooms cannot receive messages")})
if self.room.is_24h_valid is False and self.user is not None:
if self.room.validate_24h is False and self.user is not None:
raise ValidationError(
{
"detail": _(
Expand Down
2 changes: 1 addition & 1 deletion chats/apps/rooms/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -119,7 +119,7 @@ def trigger_default_message(self):
sent_message.notify_room("create", True)

@property
def is_24h_valid(self) -> bool:
def validate_24h(self) -> bool:
"""Validates is the last contact message was sent more than a day ago"""
if not self.urn.startswith("whatsapp"):
return True
Expand Down

0 comments on commit 4bc0414

Please sign in to comment.