From 5c0829b052778ed985a9fe08310bb231036c8b85 Mon Sep 17 00:00:00 2001 From: Michael Shamoon <4887959+shamoon@users.noreply.github.com> Date: Mon, 23 May 2022 15:22:14 -0700 Subject: [PATCH] Better tasks api endpoint --- .../migrations/1021_paperlesstask.py | 2 +- src/documents/serialisers.py | 27 ++++++++-- src/documents/views.py | 54 ++++--------------- src/paperless/urls.py | 8 +-- 4 files changed, 35 insertions(+), 56 deletions(-) diff --git a/src/documents/migrations/1021_paperlesstask.py b/src/documents/migrations/1021_paperlesstask.py index 2c9a0a885..560fec11d 100644 --- a/src/documents/migrations/1021_paperlesstask.py +++ b/src/documents/migrations/1021_paperlesstask.py @@ -8,7 +8,7 @@ def init_paperless_tasks(apps, schema_editor): PaperlessTask = apps.get_model("documents", "PaperlessTask") Task = apps.get_model("django_q", "Task") - for task in Task.objects.all(): + for task in Task.objects.filter(func="documents.tasks.consume_file"): if not hasattr(task, "paperlesstask"): paperlesstask = PaperlessTask.objects.create( attempted_task=task, diff --git a/src/documents/serialisers.py b/src/documents/serialisers.py index 40fe687cc..17d37ae2a 100644 --- a/src/documents/serialisers.py +++ b/src/documents/serialisers.py @@ -598,12 +598,29 @@ class UiSettingsViewSerializer(serializers.ModelSerializer): return ui_settings -class TasksViewSerializer(serializers.Serializer): +class TasksViewSerializer(serializers.ModelSerializer): + class Meta: + model = PaperlessTask + depth = 1 + fields = "__all__" - type = serializers.ChoiceField( - choices=["all", "incomplete", "complete", "failed"], - default="all", - ) + type = serializers.SerializerMethodField() + + def get_type(self, obj): + # just file tasks, for now + return "file" + + status = serializers.SerializerMethodField() + + def get_status(self, obj): + if obj.attempted_task is None: + return "incomplete" + elif obj.attempted_task.success: + return "complete" + elif not obj.attempted_task.success: + return "failed" + else: + return "unknown" class AcknowledgeTasksViewSerializer(serializers.Serializer): diff --git a/src/documents/views.py b/src/documents/views.py index 23a57c76d..e83a126b3 100644 --- a/src/documents/views.py +++ b/src/documents/views.py @@ -46,6 +46,7 @@ from rest_framework.response import Response from rest_framework.views import APIView from rest_framework.viewsets import GenericViewSet from rest_framework.viewsets import ModelViewSet +from rest_framework.viewsets import ReadOnlyModelViewSet from rest_framework.viewsets import ViewSet from .bulk_download import ArchiveOnlyStrategy @@ -800,51 +801,18 @@ class UiSettingsView(GenericAPIView): ) -class TasksView(GenericAPIView): +class TasksViewSet(ReadOnlyModelViewSet): permission_classes = (IsAuthenticated,) serializer_class = TasksViewSerializer - def get(self, request, format=None): - serializer = self.get_serializer(data=request.data) - serializer.is_valid(raise_exception=True) - - tasks = ( - PaperlessTask.objects.filter( - acknowledged=False, - ) - .order_by("attempted_task__started") - .reverse() - ) - incomplete_tasks = tasks.filter(attempted_task=None).values( - "id", - "task_id", - "name", - "created", - "acknowledged", - ) - failed_tasks = tasks.filter(attempted_task__success=0).values( - "id", - "task_id", - "name", - "created", - "acknowledged", - ) - completed_tasks = tasks.filter(attempted_task__success=1).values( - "id", - "task_id", - "name", - "created", - "acknowledged", - ) - return Response( - { - "total": tasks.count(), - "incomplete": incomplete_tasks, - "failed": failed_tasks, - "completed": completed_tasks, - }, + queryset = ( + PaperlessTask.objects.filter( + acknowledged=False, ) + .order_by("created") + .reverse() + ) class AcknowledgeTasksView(GenericAPIView): @@ -859,11 +827,9 @@ class AcknowledgeTasksView(GenericAPIView): tasks = serializer.validated_data.get("tasks") try: - logger.debug(tasks) result = PaperlessTask.objects.filter(id__in=tasks).update( acknowledged=True, ) return Response({"result": result}) - pass - except Exception as e: - return HttpResponseBadRequest(str(e)) + except Exception: + return HttpResponseBadRequest() diff --git a/src/paperless/urls.py b/src/paperless/urls.py index fbabd1e6e..46309e1e6 100644 --- a/src/paperless/urls.py +++ b/src/paperless/urls.py @@ -22,7 +22,7 @@ from documents.views import SelectionDataView from documents.views import StatisticsView from documents.views import StoragePathViewSet from documents.views import TagViewSet -from documents.views import TasksView +from documents.views import TasksViewSet from documents.views import UiSettingsView from documents.views import UnifiedSearchViewSet from paperless.consumers import StatusConsumer @@ -38,6 +38,7 @@ api_router.register(r"logs", LogViewSet, basename="logs") api_router.register(r"tags", TagViewSet) api_router.register(r"saved_views", SavedViewViewSet) api_router.register(r"storage_paths", StoragePathViewSet) +api_router.register(r"tasks", TasksViewSet, basename="tasks") urlpatterns = [ @@ -88,11 +89,6 @@ urlpatterns = [ UiSettingsView.as_view(), name="ui_settings", ), - re_path( - r"^tasks/", - TasksView.as_view(), - name="tasks", - ), re_path( r"^acknowledge_tasks/", AcknowledgeTasksView.as_view(),