Improved filter count API
This commit is contained in:
parent
e5ffbc9005
commit
d48da63909
@ -11,5 +11,5 @@ urlpatterns = [
|
|||||||
path("api-token-auth/", obtain_auth_token),
|
path("api-token-auth/", obtain_auth_token),
|
||||||
|
|
||||||
path("tickets/", views.TicketListApiView.as_view(), name="tickets"),
|
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"),
|
||||||
]
|
]
|
@ -57,32 +57,23 @@ class TicketListApiView(generics.ListAPIView):
|
|||||||
return queryset
|
return queryset
|
||||||
|
|
||||||
|
|
||||||
class FilterCountApiView(APIView):
|
class FilterCountListApiView(generics.ListAPIView):
|
||||||
|
authentication_classes = [SessionAuthentication, TokenAuthentication]
|
||||||
permission_classes = [permissions.IsAuthenticated]
|
permission_classes = [permissions.IsAuthenticated]
|
||||||
|
|
||||||
@method_decorator(cache_page(60 * 5))
|
|
||||||
def get(self, request):
|
def get(self, request):
|
||||||
|
self._tickets = Ticket.objects.all()
|
||||||
|
data = {"tickets": self._tickets.count()}
|
||||||
|
|
||||||
priorities = TicketPriority.objects.all()
|
self._fill_data(TicketPriority, data, "priority")
|
||||||
tags = TicketTag.objects.all()
|
self._fill_data(TicketTag, data, "tags")
|
||||||
departments = Department.objects.all()
|
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:
|
def _fill_data(self, model, data: dict, key: str, *, model_key:str=None):
|
||||||
data["priority_counts"][str(priority.uuid)] = tickets.filter(priority=priority).count()
|
data[key] = {} # prevent KeyError
|
||||||
|
objects = model.objects.all()
|
||||||
for tag in tags:
|
for obj in objects:
|
||||||
data["tag_counts"][str(tag.uuid)] = tickets.filter(tags__in=[tag]).count()
|
data[key][str(obj.uuid)] = self._tickets.filter(**{model_key or key: obj}).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)
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user