mirror of
https://github.com/paperless-ngx/paperless-ngx.git
synced 2026-06-10 07:39:50 +00:00
Peel off status filters in status_counts
This commit is contained in:
@@ -285,6 +285,50 @@ class TestGetTasksV10:
|
||||
"completed": 1,
|
||||
}
|
||||
|
||||
def test_status_counts_ignores_section_filters(
|
||||
self,
|
||||
admin_client: APIClient,
|
||||
) -> None:
|
||||
"""status_counts/ ignores status-like filters for the sections it counts."""
|
||||
PaperlessTaskFactory(
|
||||
acknowledged=False,
|
||||
status=PaperlessTask.Status.FAILURE,
|
||||
input_data={"filename": "invoice-a.pdf"},
|
||||
)
|
||||
PaperlessTaskFactory(
|
||||
acknowledged=False,
|
||||
status=PaperlessTask.Status.PENDING,
|
||||
input_data={"filename": "invoice-b.pdf"},
|
||||
)
|
||||
PaperlessTaskFactory(
|
||||
acknowledged=False,
|
||||
status=PaperlessTask.Status.SUCCESS,
|
||||
input_data={"filename": "invoice-c.pdf"},
|
||||
)
|
||||
PaperlessTaskFactory(
|
||||
acknowledged=False,
|
||||
status=PaperlessTask.Status.FAILURE,
|
||||
input_data={"filename": "unrelated.pdf"},
|
||||
)
|
||||
|
||||
response = admin_client.get(
|
||||
f"{ENDPOINT}status_counts/",
|
||||
{
|
||||
"acknowledged": "false",
|
||||
"name": "invoice",
|
||||
"status": PaperlessTask.Status.FAILURE,
|
||||
"is_complete": "false",
|
||||
},
|
||||
)
|
||||
|
||||
assert response.status_code == status.HTTP_200_OK
|
||||
assert response.data == {
|
||||
"all": 3,
|
||||
"needs_attention": 1,
|
||||
"in_progress": 1,
|
||||
"completed": 1,
|
||||
}
|
||||
|
||||
def test_default_ordering_is_newest_first(self, admin_client: APIClient) -> None:
|
||||
"""Tasks are returned in descending date_created order (newest first)."""
|
||||
base = timezone.now()
|
||||
|
||||
+17
-1
@@ -4137,6 +4137,7 @@ class TasksViewSet(ReadOnlyModelViewSet[PaperlessTask]):
|
||||
PaperlessTask.TaskType.SANITY_CHECK: (sanity_check, {"raise_on_error": False}),
|
||||
PaperlessTask.TaskType.LLM_INDEX: (llmindex_index, {"rebuild": False}),
|
||||
}
|
||||
_STATUS_COUNT_EXCLUDED_FILTERS = frozenset({"status", "is_complete"})
|
||||
|
||||
def get_serializer_class(self):
|
||||
# v9: use backwards-compatible serializer with old field names
|
||||
@@ -4177,6 +4178,21 @@ class TasksViewSet(ReadOnlyModelViewSet[PaperlessTask]):
|
||||
queryset = queryset.filter(task_id=task_id)
|
||||
return queryset
|
||||
|
||||
def get_status_count_queryset(self):
|
||||
"""Apply task filters except the status dimensions represented by the counts."""
|
||||
query_params = self.request.query_params.copy()
|
||||
for param in self._STATUS_COUNT_EXCLUDED_FILTERS:
|
||||
query_params.pop(param, None)
|
||||
|
||||
filterset = self.filterset_class(
|
||||
data=query_params,
|
||||
queryset=self.get_queryset(),
|
||||
request=self.request,
|
||||
)
|
||||
if not filterset.is_valid():
|
||||
raise ValidationError(filterset.errors)
|
||||
return filterset.qs
|
||||
|
||||
@action(
|
||||
methods=["post"],
|
||||
detail=False,
|
||||
@@ -4242,7 +4258,7 @@ class TasksViewSet(ReadOnlyModelViewSet[PaperlessTask]):
|
||||
@action(methods=["get"], detail=False)
|
||||
def status_counts(self, request):
|
||||
"""Aggregated task counts for task UI sections."""
|
||||
queryset = self.filter_queryset(self.get_queryset())
|
||||
queryset = self.get_status_count_queryset()
|
||||
counts = queryset.aggregate(
|
||||
all=Count("id"),
|
||||
needs_attention=Count(
|
||||
|
||||
Reference in New Issue
Block a user