Improved filter count API

This commit is contained in:
Corban-Lee Jones 2024-01-18 12:16:32 +00:00
parent e5ffbc9005
commit d48da63909
2 changed files with 14 additions and 23 deletions

View File

@ -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"),
]

View File

@ -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()