From 7c0c152fdfdab6fb45438894790c3a4e94401250 Mon Sep 17 00:00:00 2001 From: shamoon <4887959+shamoon@users.noreply.github.com> Date: Sat, 6 Jun 2026 16:17:08 -0700 Subject: [PATCH] Actually we should make a dedicated counts endpoint --- src/documents/views.py | 43 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-) diff --git a/src/documents/views.py b/src/documents/views.py index 4fc0b3f51..9d24f43d6 100644 --- a/src/documents/views.py +++ b/src/documents/views.py @@ -4011,7 +4011,7 @@ class RemoteVersionView(GenericAPIView[Any]): class _TasksViewSetSchema(AutoSchema): - _UNPAGINATED_ACTIONS = frozenset({"summary", "active"}) + _UNPAGINATED_ACTIONS = frozenset({"summary", "active", "status_counts"}) def _get_paginator(self): if getattr(self.view, "action", None) in self._UNPAGINATED_ACTIONS: @@ -4071,6 +4071,19 @@ class _TasksViewSetSchema(AutoSchema): ), ], ), + status_counts=extend_schema( + responses={ + 200: inline_serializer( + name="TaskStatusCounts", + fields={ + "all": serializers.IntegerField(), + "needs_attention": serializers.IntegerField(), + "in_progress": serializers.IntegerField(), + "completed": serializers.IntegerField(), + }, + ), + }, + ), active=extend_schema( description="Currently pending and running tasks (capped at 50).", responses={200: TaskSerializerV10(many=True)}, @@ -4226,6 +4239,34 @@ class TasksViewSet(ReadOnlyModelViewSet[PaperlessTask]): serializer = TaskSummarySerializer(data, many=True) return Response(serializer.data) + @action(methods=["get"], detail=False) + def status_counts(self, request): + """Aggregated task counts for task UI sections.""" + queryset = self.filter_queryset(self.get_queryset()) + counts = queryset.aggregate( + all=Count("id"), + needs_attention=Count( + "id", + filter=Q( + status__in=[ + PaperlessTask.Status.FAILURE, + PaperlessTask.Status.REVOKED, + ], + ), + ), + in_progress=Count( + "id", + filter=Q( + status__in=[ + PaperlessTask.Status.PENDING, + PaperlessTask.Status.STARTED, + ], + ), + ), + completed=Count("id", filter=Q(status=PaperlessTask.Status.SUCCESS)), + ) + return Response(counts) + @action(methods=["get"], detail=False) def active(self, request): """Currently pending and running tasks (capped at 50)."""