From 308f8b3089db6b51e55cc603f9385b223607dbc4 Mon Sep 17 00:00:00 2001 From: shamoon <4887959+shamoon@users.noreply.github.com> Date: Mon, 4 Nov 2024 13:57:23 -0800 Subject: [PATCH] Enhancement: support owner permissions for file tasks --- src-ui/src/app/data/paperless-task.ts | 2 ++ .../migrations/1057_paperlesstask_owner.py | 28 +++++++++++++++++++ src/documents/models.py | 2 +- src/documents/serialisers.py | 3 +- src/documents/signals/handlers.py | 4 ++- src/documents/tests/test_task_signals.py | 7 ++++- 6 files changed, 42 insertions(+), 4 deletions(-) create mode 100644 src/documents/migrations/1057_paperlesstask_owner.py diff --git a/src-ui/src/app/data/paperless-task.ts b/src-ui/src/app/data/paperless-task.ts index 08b30d44b..d15f006d7 100644 --- a/src-ui/src/app/data/paperless-task.ts +++ b/src-ui/src/app/data/paperless-task.ts @@ -30,4 +30,6 @@ export interface PaperlessTask extends ObjectWithId { result?: string related_document?: number + + owner?: number } diff --git a/src/documents/migrations/1057_paperlesstask_owner.py b/src/documents/migrations/1057_paperlesstask_owner.py new file mode 100644 index 000000000..e9f108d3a --- /dev/null +++ b/src/documents/migrations/1057_paperlesstask_owner.py @@ -0,0 +1,28 @@ +# Generated by Django 5.1.1 on 2024-11-04 21:56 + +import django.db.models.deletion +from django.conf import settings +from django.db import migrations +from django.db import models + + +class Migration(migrations.Migration): + dependencies = [ + ("documents", "1056_customfieldinstance_deleted_at_and_more"), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.AddField( + model_name="paperlesstask", + name="owner", + field=models.ForeignKey( + blank=True, + default=None, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="owner", + ), + ), + ] diff --git a/src/documents/models.py b/src/documents/models.py index 4528d5127..05226b0e9 100644 --- a/src/documents/models.py +++ b/src/documents/models.py @@ -641,7 +641,7 @@ class UiSettings(models.Model): return self.user.username -class PaperlessTask(models.Model): +class PaperlessTask(ModelWithOwner): ALL_STATES = sorted(states.ALL_STATES) TASK_STATE_CHOICES = sorted(zip(ALL_STATES, ALL_STATES)) diff --git a/src/documents/serialisers.py b/src/documents/serialisers.py index 45bf672d8..f960cac24 100644 --- a/src/documents/serialisers.py +++ b/src/documents/serialisers.py @@ -1567,7 +1567,7 @@ class UiSettingsViewSerializer(serializers.ModelSerializer): return ui_settings -class TasksViewSerializer(serializers.ModelSerializer): +class TasksViewSerializer(OwnedObjectSerializer): class Meta: model = PaperlessTask depth = 1 @@ -1582,6 +1582,7 @@ class TasksViewSerializer(serializers.ModelSerializer): "result", "acknowledged", "related_document", + "owner", ) type = serializers.SerializerMethodField() diff --git a/src/documents/signals/handlers.py b/src/documents/signals/handlers.py index 114654c64..cd2e3972e 100644 --- a/src/documents/signals/handlers.py +++ b/src/documents/signals/handlers.py @@ -939,9 +939,10 @@ def before_task_publish_handler(sender=None, headers=None, body=None, **kwargs): close_old_connections() task_args = body[0] - input_doc, _ = task_args + input_doc, overrides = task_args task_file_name = input_doc.original_file.name + user_id = overrides.owner_id if overrides else None PaperlessTask.objects.create( task_id=headers["id"], @@ -952,6 +953,7 @@ def before_task_publish_handler(sender=None, headers=None, body=None, **kwargs): date_created=timezone.now(), date_started=None, date_done=None, + owner_id=user_id, ) except Exception: # pragma: no cover # Don't let an exception in the signal handlers prevent diff --git a/src/documents/tests/test_task_signals.py b/src/documents/tests/test_task_signals.py index 4a54220e0..a025fb9dc 100644 --- a/src/documents/tests/test_task_signals.py +++ b/src/documents/tests/test_task_signals.py @@ -5,6 +5,7 @@ import celery from django.test import TestCase from documents.data_models import ConsumableDocument +from documents.data_models import DocumentMetadataOverrides from documents.data_models import DocumentSource from documents.models import PaperlessTask from documents.signals.handlers import before_task_publish_handler @@ -48,7 +49,10 @@ class TestTaskSignalHandler(DirectoriesMixin, TestCase): source=DocumentSource.ConsumeFolder, original_file="/consume/hello-999.pdf", ), - None, + DocumentMetadataOverrides( + title="Hello world", + owner_id=1, + ), ), # kwargs {}, @@ -65,6 +69,7 @@ class TestTaskSignalHandler(DirectoriesMixin, TestCase): self.assertEqual(headers["id"], task.task_id) self.assertEqual("hello-999.pdf", task.task_file_name) self.assertEqual("documents.tasks.consume_file", task.task_name) + self.assertEqual(1, task.owner_id) self.assertEqual(celery.states.PENDING, task.status) def test_task_prerun_handler(self):