Skip to content

Commit

Permalink
feature: new query to agents endpoint (#246)
Browse files Browse the repository at this point in the history
* feature: new query to agents endpoint

* fix: resolving bug that did not bring all agents when listing
  • Loading branch information
AlanJaeger authored Jul 10, 2023
1 parent 24a834c commit 837fee9
Show file tree
Hide file tree
Showing 2 changed files with 50 additions and 49 deletions.
49 changes: 27 additions & 22 deletions chats/apps/api/v1/dashboard/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,14 @@

import pendulum
from django.conf import settings
from django.db.models import Avg, Count, F, Q, Sum
from django.db.models import Avg, Count, F, OuterRef, Q, Subquery, Sum
from django.utils import timezone
from django_redis import get_redis_connection
from rest_framework import serializers

from chats.apps.accounts.models import User
from chats.apps.dashboard.models import RoomMetrics
from chats.apps.projects.models import ProjectPermission
from chats.apps.rooms.models import Room


Expand Down Expand Up @@ -99,46 +101,49 @@ def dashboard_agents_data(context, project):
timezone.now().astimezone(tz).replace(hour=0, minute=0, second=0, microsecond=0)
)

rooms_filter = {"user__isnull": False}
closed_rooms = {}
opened_rooms = {}
rooms_filter = {}
closed_rooms = {"rooms__queue__sector__project": project}
opened_rooms = {"rooms__queue__sector__project": project}
if context.get("start_date") and context.get("end_date"):
start_time = pendulum.parse(context.get("start_date")).replace(tzinfo=tz)
end_time = pendulum.parse(context.get("end_date") + " 23:59:59").replace(
tzinfo=tz
)

rooms_filter["created_on__range"] = [start_time, end_time]
rooms_filter["is_active"] = False
closed_rooms["ended_at__range"] = [start_time, end_time]
rooms_filter["rooms__created_on__range"] = [start_time, end_time]
rooms_filter["rooms__is_active"] = False
closed_rooms["rooms__ended_at__range"] = [start_time, end_time]

else:
closed_rooms["ended_at__gte"] = initial_datetime
opened_rooms["is_active"] = True
closed_rooms["is_active"] = False
closed_rooms["rooms__ended_at__gte"] = initial_datetime
opened_rooms["rooms__is_active"] = True
closed_rooms["rooms__is_active"] = False

if context.get("agent"):
rooms_filter["user"] = context.get("agent")
rooms_filter["rooms__user"] = context.get("agent")

if context.get("sector"):
rooms_filter["queue__sector"] = context.get("sector")
rooms_filter["rooms__queue__sector"] = context.get("sector")
if context.get("tag"):
rooms_filter["tags__name"] = context.get("tag")
else:
rooms_filter["queue__sector__project"] = project
rooms_filter["rooms__tags__name"] = context.get("tag")

project_permission_subquery = ProjectPermission.objects.filter(
project_id=project,
user_id=OuterRef("email"),
).values("status")[:1]

agents_query = Room.objects
agents_query = User.objects
if not context.get("is_weni_admin"):
agents_query = agents_query.exclude(user__email__endswith="weni.ai")
agents_query = agents_query.exclude(email__endswith="weni.ai")

agents_query = (
Room.objects.filter(**rooms_filter)
.values("user")
agents_query.filter(project_permissions__project=project)
.annotate(
user__first_name=F("user__first_name"),
closed_rooms=Count("uuid", filter=Q(**closed_rooms)),
opened_rooms=Count("uuid", filter=Q(**opened_rooms)),
agent_status=Subquery(project_permission_subquery),
closed_rooms=Count("rooms", filter=Q(**closed_rooms, **rooms_filter)),
opened_rooms=Count("rooms", filter=Q(**opened_rooms, **rooms_filter)),
)
.values("first_name", "email", "agent_status", "closed_rooms", "opened_rooms")
)

return agents_query
Expand Down
50 changes: 23 additions & 27 deletions chats/apps/dashboard/tests/test_serializers.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
from unittest.mock import patch

from django.test import TestCase

from chats.apps.api.v1.dashboard.serializers import DashboardRoomsSerializer
from chats.apps.api.v1.dashboard.serializers import dashboard_agents_data
from chats.apps.projects.models import Project


Expand All @@ -22,29 +20,27 @@ class SerializerTests(TestCase):
def setUp(self):
self.project = Project.objects.get(pk="34a93b52-231e-11ed-861d-0242ac120002")

@patch("chats.apps.api.v1.dashboard.serializers.get_redis_connection")
def test_init_function(self, mock):
"""
Verify if the init function its working properly.
"""
mock.return_value = RedisMock()
serializer = DashboardRoomsSerializer()
self.assertTrue(isinstance(serializer.redis_connection, RedisMock))

def test_active_chats_function_passing_sector(self):
serializer = DashboardRoomsSerializer.get_active_chats(
self=DashboardRoomsSerializer(
context={
"sector": "d49049f0-c601-4e05-a293-98c1dea5fe4f",
}
),
project=self.project,
def test_returned_fields_from_dashboard_agent_serializer(self):
project = Project.objects.get(uuid="34a93b52-231e-11ed-861d-0242ac120002")
instance = dashboard_agents_data(
project=project,
context={"is_weni_admin": True},
)
self.assertEqual(serializer, 0)

def test_active_chats_function_without_filter(self):
serializer = DashboardRoomsSerializer.get_active_chats(
self=DashboardRoomsSerializer(context={}),
project=self.project,
self.assertEqual(list(instance[0].keys())[0], "first_name")
self.assertEqual(list(instance[0].keys())[1], "email")
self.assertEqual(list(instance[0].keys())[2], "agent_status")
self.assertEqual(list(instance[0].keys())[3], "closed_rooms")
self.assertEqual(list(instance[0].keys())[4], "opened_rooms")

def test_field_value_from_dashboard_agent_serializer(self):
project = Project.objects.get(uuid="34a93b52-231e-11ed-861d-0242ac120002")
instance = dashboard_agents_data(
project=project,
context={"is_weni_admin": True},
)
self.assertEqual(serializer, 1)

self.assertEqual(instance[0]["first_name"], "")
self.assertEqual(instance[0]["email"], "[email protected]")
self.assertEqual(instance[0]["agent_status"], "OFFLINE")
self.assertEqual(instance[0]["closed_rooms"], 0)
self.assertEqual(instance[0]["opened_rooms"], 1)

0 comments on commit 837fee9

Please sign in to comment.