Enhancement: support owner permissions for file tasks

This commit is contained in:
shamoon 2024-11-04 13:57:23 -08:00
parent 9c1561adfb
commit 308f8b3089
6 changed files with 42 additions and 4 deletions

View File

@ -30,4 +30,6 @@ export interface PaperlessTask extends ObjectWithId {
result?: string result?: string
related_document?: number related_document?: number
owner?: number
} }

View File

@ -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",
),
),
]

View File

@ -641,7 +641,7 @@ class UiSettings(models.Model):
return self.user.username return self.user.username
class PaperlessTask(models.Model): class PaperlessTask(ModelWithOwner):
ALL_STATES = sorted(states.ALL_STATES) ALL_STATES = sorted(states.ALL_STATES)
TASK_STATE_CHOICES = sorted(zip(ALL_STATES, ALL_STATES)) TASK_STATE_CHOICES = sorted(zip(ALL_STATES, ALL_STATES))

View File

@ -1567,7 +1567,7 @@ class UiSettingsViewSerializer(serializers.ModelSerializer):
return ui_settings return ui_settings
class TasksViewSerializer(serializers.ModelSerializer): class TasksViewSerializer(OwnedObjectSerializer):
class Meta: class Meta:
model = PaperlessTask model = PaperlessTask
depth = 1 depth = 1
@ -1582,6 +1582,7 @@ class TasksViewSerializer(serializers.ModelSerializer):
"result", "result",
"acknowledged", "acknowledged",
"related_document", "related_document",
"owner",
) )
type = serializers.SerializerMethodField() type = serializers.SerializerMethodField()

View File

@ -939,9 +939,10 @@ def before_task_publish_handler(sender=None, headers=None, body=None, **kwargs):
close_old_connections() close_old_connections()
task_args = body[0] task_args = body[0]
input_doc, _ = task_args input_doc, overrides = task_args
task_file_name = input_doc.original_file.name task_file_name = input_doc.original_file.name
user_id = overrides.owner_id if overrides else None
PaperlessTask.objects.create( PaperlessTask.objects.create(
task_id=headers["id"], 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_created=timezone.now(),
date_started=None, date_started=None,
date_done=None, date_done=None,
owner_id=user_id,
) )
except Exception: # pragma: no cover except Exception: # pragma: no cover
# Don't let an exception in the signal handlers prevent # Don't let an exception in the signal handlers prevent

View File

@ -5,6 +5,7 @@ import celery
from django.test import TestCase from django.test import TestCase
from documents.data_models import ConsumableDocument from documents.data_models import ConsumableDocument
from documents.data_models import DocumentMetadataOverrides
from documents.data_models import DocumentSource from documents.data_models import DocumentSource
from documents.models import PaperlessTask from documents.models import PaperlessTask
from documents.signals.handlers import before_task_publish_handler from documents.signals.handlers import before_task_publish_handler
@ -48,7 +49,10 @@ class TestTaskSignalHandler(DirectoriesMixin, TestCase):
source=DocumentSource.ConsumeFolder, source=DocumentSource.ConsumeFolder,
original_file="/consume/hello-999.pdf", original_file="/consume/hello-999.pdf",
), ),
None, DocumentMetadataOverrides(
title="Hello world",
owner_id=1,
),
), ),
# kwargs # kwargs
{}, {},
@ -65,6 +69,7 @@ class TestTaskSignalHandler(DirectoriesMixin, TestCase):
self.assertEqual(headers["id"], task.task_id) self.assertEqual(headers["id"], task.task_id)
self.assertEqual("hello-999.pdf", task.task_file_name) self.assertEqual("hello-999.pdf", task.task_file_name)
self.assertEqual("documents.tasks.consume_file", task.task_name) self.assertEqual("documents.tasks.consume_file", task.task_name)
self.assertEqual(1, task.owner_id)
self.assertEqual(celery.states.PENDING, task.status) self.assertEqual(celery.states.PENDING, task.status)
def test_task_prerun_handler(self): def test_task_prerun_handler(self):