Skip to content

Commit

Permalink
feature: refactoring in dashboard raw data endpoint
Browse files Browse the repository at this point in the history
  • Loading branch information
AlanJaeger committed Jan 23, 2024
1 parent c8e58ba commit d813076
Show file tree
Hide file tree
Showing 5 changed files with 290 additions and 153 deletions.
20 changes: 19 additions & 1 deletion chats/apps/api/v1/dashboard/dto.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
from dataclasses import dataclass

from chats.apps.projects.models import ProjectPermission


@dataclass
class Agent:
Expand All @@ -18,4 +20,20 @@ class Filters:
sector: str = None
tag: str = None
is_weni_admin: bool = None
user_request: str = None
user_request: ProjectPermission = None
project: str = None


@dataclass
class ClosedRoomData:
closed_rooms: dict = None


@dataclass
class TransferRoomData:
transfer_count: dict = None


@dataclass
class QueueRoomData:
queue_rooms: dict = None
160 changes: 158 additions & 2 deletions chats/apps/api/v1/dashboard/repository.py
Original file line number Diff line number Diff line change
@@ -1,13 +1,14 @@
from typing import List

from django.db.models import Count, OuterRef, Q, Subquery
from django.db.models import Count, OuterRef, Q, Subquery, Sum
from django.utils import timezone
from pendulum.parser import parse as pendulum_parse

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

from .dto import Agent, Filters
from .dto import Agent, ClosedRoomData, Filters, QueueRoomData, TransferRoomData


class AgentRepository:
Expand Down Expand Up @@ -78,3 +79,158 @@ def get_agents_data(self, filters: Filters, project) -> List[Agent]:
]

return user_agents


class ClosedRoomsRepository:
def __init__(self) -> None:
self.model = Room.objects
self.rooms_filter = {}

def _filter_date_range(self, filters, tz):
initial_datetime = (
timezone.now()
.astimezone(tz)
.replace(hour=0, minute=0, second=0, microsecond=0)
)
self.rooms_filter["is_active"] = False

if filters.start_date and filters.end_date:
start_time = pendulum_parse(filters.start_date, tzinfo=tz)
end_time = pendulum_parse(filters.end_date + " 23:59:59", tzinfo=tz)
self.rooms_filter["ended_at__range"] = [start_time, end_time]

return self.rooms_filter

self.rooms_filter["ended_at__gte"] = initial_datetime
return self.rooms_filter

def _filter_sector(self, filters):
if filters.sector:
self.rooms_filter["queue__sector"] = filters.get("sector")
if filters.tag:
self.rooms_filter["tags__uuid"] = filters.get("tag")
if filters.queue:
self.rooms_filter["queue"] = filters.get("queue")
return self.rooms_filter

self.rooms_filter["queue__sector__project"] = filters.project
return self.rooms_filter

def _filter_agents(self, filters):
if filters.agent:
self.rooms_filter["user"] = filters.get("agent")
return self.rooms_filter

def closed_rooms(self, filters):
tz = filters.project.timezone

self._filter_date_range(filters, tz)
self._filter_sector(filters)
self._filter_agents(filters)

user_agents = []
if filters.user_request:
rooms_query = self.model.filter(
queue__sector__in=filters.user_request.manager_sectors()
)
closed_rooms = rooms_query.filter(**self.rooms_filter).count()
user_agents = [ClosedRoomData(closed_rooms=closed_rooms)]
return user_agents

return user_agents


class TransferCountRepository:
def __init__(self) -> None:
self.model = Room.objects
self.rooms_filter = {}

def _filter_date_range(self, filters, tz):
initial_datetime = (
timezone.now()
.astimezone(tz)
.replace(hour=0, minute=0, second=0, microsecond=0)
)

if filters.start_date and filters.end_date:
start_time = pendulum_parse(filters.start_date, tzinfo=tz)
end_time = pendulum_parse(filters.end_date + " 23:59:59", tzinfo=tz)
self.rooms_filter["created_on__range"] = [start_time, end_time]
return self.rooms_filter

self.rooms_filter["created_on__gte"] = initial_datetime
return self.rooms_filter

def _filter_sector(self, filters):
if filters.sector:
self.rooms_filter["queue__sector"] = filters.get("sector")
if filters.tag:
self.rooms_filter["tags__uuid"] = filters.get("tag")
if filters.queue:
self.rooms_filter["queue"] = filters.get("queue")
return self.rooms_filter

self.rooms_filter["queue__sector__project"] = filters.project
return self.rooms_filter

def transfer_count(self, filters):
tz = filters.project.timezone

self._filter_date_range(filters, tz)
self._filter_sector(filters)

transfer_count = []
if filters.user_request:
rooms_query = self.model.filter(
queue__sector__in=filters.user_request.manager_sectors()
)

transfer_metric = rooms_query.filter(**self.rooms_filter).aggregate(
transfer_count=Sum("metric__transfer_count")
)["transfer_count"]

transfer_count = [TransferRoomData(transfer_count=transfer_metric)]
return transfer_count

return transfer_count


class QueueRoomsRepository:
def __init__(self) -> None:
self.model = Room.objects
self.rooms_filter = {}

def _filter_date_range(self, filters, tz):
self.rooms_filter["user__isnull"] = True
self.rooms_filter["is_active"] = True

if filters.start_date and filters.end_date:
start_time = pendulum_parse(filters.start_date, tzinfo=tz)
end_time = pendulum_parse(filters.end_date + " 23:59:59", tzinfo=tz)
self.rooms_filter["created_on__range"] = [start_time, end_time]
return self.rooms_filter

def _filter_sector(self, filters):
if filters.sector:
self.rooms_filter["queue__sector"] = filters.get("sector")
return self.rooms_filter

self.rooms_filter["queue__sector__project"] = filters.project
return self.rooms_filter

def queue_rooms(self, filters):
tz = filters.project.timezone

self._filter_date_range(filters, tz)
self._filter_sector(filters)
queue_rooms = []
if filters.user_request:
rooms_query = self.model.filter(
queue__sector__in=filters.user_request.manager_sectors()
)

queue_rooms_metric = rooms_query.filter(**self.rooms_filter).count()
queue_rooms = [QueueRoomData(queue_rooms=queue_rooms_metric)]
return queue_rooms

return queue_rooms
157 changes: 24 additions & 133 deletions chats/apps/api/v1/dashboard/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@

import pendulum
from django.conf import settings
from django.db.models import Avg, F, Sum
from django.db.models import Avg, F
from django.utils import timezone
from django_redis import get_redis_connection
from rest_framework import serializers
Expand Down Expand Up @@ -114,6 +114,16 @@ class DashboardAgentsSerializer(serializers.Serializer):
opened_rooms = serializers.IntegerField(allow_null=True, required=False)


class DashboardRawDataSerializer(serializers.Serializer):
closed_rooms = serializers.IntegerField(allow_null=True, required=False)
transfer_count = serializers.IntegerField(allow_null=True, required=False)
queue_rooms = serializers.IntegerField(allow_null=True, required=False)

class Meta:
model = Room
fields = ["closed_rooms", "transfer_count", "queue_rooms"]


# Maybe separate each serializer in it's own serializer module/file


Expand Down Expand Up @@ -169,144 +179,25 @@ def dashboard_division_data(context, project=None):
)


class DashboardRawDataSerializer(serializers.ModelSerializer):
closed_rooms = serializers.SerializerMethodField()
transfer_count = serializers.SerializerMethodField()
queue_rooms = serializers.SerializerMethodField()
class DashboardRawDataSerializer1(serializers.ModelSerializer):
closed_rooms = serializers.IntegerField(allow_null=True, required=False)

class Meta:
model = Room
fields = ["closed_rooms", "transfer_count", "queue_rooms"]
fields = ["closed_rooms"]

def get_closed_rooms(self, project):
tz = project.timezone
initial_datetime = (
timezone.now()
.astimezone(tz)
.replace(hour=0, minute=0, second=0, microsecond=0)
)

user_request = ProjectPermission.objects.get(
user=self.context.get("user_request"), project=project
)
rooms_query = Room.objects

rooms_filter = {}
rooms_filter["is_active"] = False

if self.context.get("start_date") and self.context.get("end_date"):
start_time = pendulum.parse(self.context.get("start_date")).replace(
tzinfo=tz
)
end_time = pendulum.parse(
self.context.get("end_date") + " 23:59:59"
).replace(tzinfo=tz)
rooms_filter["ended_at__range"] = [start_time, end_time]
else:
rooms_filter["ended_at__gte"] = initial_datetime

if self.context.get("sector"):
rooms_filter["queue__sector"] = self.context.get("sector")
if self.context.get("tag"):
rooms_filter["tags__uuid"] = self.context.get("tag")
if self.context.get("queue"):
rooms_filter["queue"] = self.context.get("queue")
else:
rooms_filter["queue__sector__project"] = project

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

if user_request:
rooms_query = rooms_query.filter(
queue__sector__in=user_request.manager_sectors()
)

closed_rooms = rooms_query.filter(**rooms_filter).count()

return closed_rooms

def get_transfer_count(self, project):
tz = project.timezone

tz = project.timezone
initial_datetime = (
timezone.now()
.astimezone(tz)
.replace(hour=0, minute=0, second=0, microsecond=0)
)
rooms_filter = {}
class DashboardRawDataSerializer2(serializers.ModelSerializer):
transfer_count = serializers.IntegerField(allow_null=True, required=False)

user_request = ProjectPermission.objects.get(
user=self.context.get("user_request"), project=project
)
rooms_query = Room.objects

if self.context.get("start_date") and self.context.get("end_date"):
start_time = pendulum.parse(self.context.get("start_date")).replace(
tzinfo=tz
)
end_time = pendulum.parse(
self.context.get("end_date") + " 23:59:59"
).replace(tzinfo=tz)
rooms_filter["created_on__range"] = [
start_time,
end_time,
]
else:
rooms_filter["created_on__gte"] = initial_datetime

if self.context.get("sector"):
rooms_filter["queue__sector"] = self.context.get("sector")
if self.context.get("tag"):
rooms_filter["tags__uuid"] = self.context.get("tag")
else:
rooms_filter["queue__sector__project"] = project

if user_request:
rooms_query = rooms_query.filter(
queue__sector__in=user_request.manager_sectors()
)

transfer_metric = rooms_query.filter(**rooms_filter).aggregate(
count=Sum("metric__transfer_count")
)
class Meta:
model = Room
fields = ["transfer_count"]

return transfer_metric["count"]

def get_queue_rooms(self, project):
tz = project.timezone
rooms_filter = {}
rooms_filter["user__isnull"] = True
rooms_filter["is_active"] = True
class DashboardRawDataSerializer3(serializers.ModelSerializer):
queue_rooms = serializers.IntegerField(allow_null=True, required=False)

user_request = ProjectPermission.objects.get(
user=self.context.get("user_request"), project=project
)
rooms_query = Room.objects

if self.context.get("start_date") and self.context.get("end_date"):
start_time = pendulum.parse(self.context.get("start_date")).replace(
tzinfo=tz
)
end_time = pendulum.parse(
self.context.get("end_date") + " 23:59:59"
).replace(tzinfo=tz)
rooms_filter["created_on__range"] = [
start_time,
end_time,
]

if self.context.get("sector"):
rooms_filter["queue__sector"] = self.context.get("sector")
else:
rooms_filter["queue__sector__project"] = project

if user_request:
rooms_query = rooms_query.filter(
queue__sector__in=user_request.manager_sectors()
)

queue_rooms_metric = rooms_query.filter(**rooms_filter).count()

return queue_rooms_metric
class Meta:
model = Room
fields = ["queue_rooms"]
Loading

0 comments on commit d813076

Please sign in to comment.