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("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
|
||||
|
||||
|
||||
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()
|
||||
|
Loading…
x
Reference in New Issue
Block a user