From d48da63909a251136269ef6163ef4309b5c56cc5 Mon Sep 17 00:00:00 2001 From: Corban-Lee Jones Date: Thu, 18 Jan 2024 12:16:32 +0000 Subject: [PATCH] Improved filter count API --- apps/api/urls.py | 2 +- apps/api/views.py | 35 +++++++++++++---------------------- 2 files changed, 14 insertions(+), 23 deletions(-) diff --git a/apps/api/urls.py b/apps/api/urls.py index 4c91e5d..d2e9fc9 100644 --- a/apps/api/urls.py +++ b/apps/api/urls.py @@ -11,5 +11,5 @@ urlpatterns = [ path("api-token-auth/", obtain_auth_token), path("tickets/", views.TicketListApiView.as_view(), name="tickets"), - path("filter-counts/", views.FilterCountApiView.as_view(), name="filter-counts"), + path("filter-counts/", views.FilterCountListApiView.as_view(), name="filter-counts"), ] \ No newline at end of file diff --git a/apps/api/views.py b/apps/api/views.py index acb9c31..f1a1b92 100644 --- a/apps/api/views.py +++ b/apps/api/views.py @@ -57,32 +57,23 @@ class TicketListApiView(generics.ListAPIView): return queryset -class FilterCountApiView(APIView): +class FilterCountListApiView(generics.ListAPIView): + authentication_classes = [SessionAuthentication, TokenAuthentication] permission_classes = [permissions.IsAuthenticated] - @method_decorator(cache_page(60 * 5)) def get(self, request): + self._tickets = Ticket.objects.all() + data = {"tickets": self._tickets.count()} - priorities = TicketPriority.objects.all() - tags = TicketTag.objects.all() - departments = Department.objects.all() + self._fill_data(TicketPriority, data, "priority") + self._fill_data(TicketTag, data, "tags") + self._fill_data(Department, data, "department", model_key="author__department") - tickets = Ticket.objects.all() + return Response(data, status.HTTP_200_OK) - data = { - "priority_counts": {}, - "tag_counts": {}, - "department_counts": {}, - "ticket_count": tickets.count() - } - for priority in priorities: - data["priority_counts"][str(priority.uuid)] = tickets.filter(priority=priority).count() - - for tag in tags: - data["tag_counts"][str(tag.uuid)] = tickets.filter(tags__in=[tag]).count() - - for department in departments: - data["department_counts"][str(department.uuid)] = tickets.filter(author__department=department).count() - - return Response(data, status=status.HTTP_200_OK) + def _fill_data(self, model, data: dict, key: str, *, model_key:str=None): + data[key] = {} # prevent KeyError + objects = model.objects.all() + for obj in objects: + data[key][str(obj.uuid)] = self._tickets.filter(**{model_key or key: obj}).count()