]> git.ipfire.org Git - thirdparty/paperless-ngx.git/commitdiff
Enhancement: use request user as owner of split / merge docs (#7112)
authorshamoon <4887959+shamoon@users.noreply.github.com>
Thu, 27 Jun 2024 20:46:49 +0000 (13:46 -0700)
committerGitHub <noreply@github.com>
Thu, 27 Jun 2024 20:46:49 +0000 (13:46 -0700)
src/documents/bulk_edit.py
src/documents/tests/test_api_bulk_edit.py
src/documents/tests/test_bulk_edit.py
src/documents/views.py

index 7f56a120798c1d9b27259ffdb020b9d96e02b977..1f7a2a40325fd688a87f89f37712fdbc607e0e86 100644 (file)
@@ -10,6 +10,7 @@ from celery import chord
 from celery import group
 from celery import shared_task
 from django.conf import settings
+from django.contrib.auth.models import User
 from django.db.models import Q
 
 from documents.data_models import ConsumableDocument
@@ -243,6 +244,7 @@ def merge(
     doc_ids: list[int],
     metadata_document_id: Optional[int] = None,
     delete_originals: bool = False,
+    user: User = None,
 ):
     logger.info(
         f"Attempting to merge {len(doc_ids)} documents into a single document.",
@@ -285,6 +287,9 @@ def merge(
     else:
         overrides = DocumentMetadataOverrides()
 
+    if user is not None:
+        overrides.owner_id = user.id
+
     logger.info("Adding merged document to the task queue.")
 
     consume_task = consume_file.s(
@@ -306,7 +311,12 @@ def merge(
     return "OK"
 
 
-def split(doc_ids: list[int], pages: list[list[int]], delete_originals: bool = False):
+def split(
+    doc_ids: list[int],
+    pages: list[list[int]],
+    delete_originals: bool = False,
+    user: User = None,
+):
     logger.info(
         f"Attempting to split document {doc_ids[0]} into {len(pages)} documents",
     )
@@ -331,6 +341,8 @@ def split(doc_ids: list[int], pages: list[list[int]], delete_originals: bool = F
 
                 overrides = DocumentMetadataOverrides().from_document(doc)
                 overrides.title = f"{doc.title} (split {idx + 1})"
+                if user is not None:
+                    overrides.owner_id = user.id
                 logger.info(
                     f"Adding split document with pages {split_doc} to the task queue.",
                 )
index ebef6a329939de1a512ba74d71506e1891c79d02..ba0e1139fda697c29cde597fc2bfe1b41bc23eee 100644 (file)
@@ -20,6 +20,7 @@ class TestBulkEditAPI(DirectoriesMixin, APITestCase):
         super().setUp()
 
         user = User.objects.create_superuser(username="temp_admin")
+        self.user = user
         self.client.force_authenticate(user=user)
 
         patcher = mock.patch("documents.bulk_edit.bulk_update_documents.delay")
@@ -993,6 +994,7 @@ class TestBulkEditAPI(DirectoriesMixin, APITestCase):
         args, kwargs = m.call_args
         self.assertCountEqual(args[0], [self.doc2.id, self.doc3.id])
         self.assertEqual(kwargs["metadata_document_id"], self.doc3.id)
+        self.assertEqual(kwargs["user"], self.user)
 
     @mock.patch("documents.serialisers.bulk_edit.merge")
     def test_merge_and_delete_insufficient_permissions(self, m):
@@ -1092,6 +1094,7 @@ class TestBulkEditAPI(DirectoriesMixin, APITestCase):
         args, kwargs = m.call_args
         self.assertCountEqual(args[0], [self.doc2.id])
         self.assertEqual(kwargs["pages"], [[1], [2, 3, 4], [5, 6], [7]])
+        self.assertEqual(kwargs["user"], self.user)
 
     def test_split_invalid_params(self):
         response = self.client.post(
index 37ebc35fc6a80375d3bc8a74b0ee25dd593db59d..fed93cd01c0fa18058863f8367fdb480ef1a042e 100644 (file)
@@ -422,8 +422,9 @@ class TestPDFActions(DirectoriesMixin, TestCase):
         """
         doc_ids = [self.doc1.id, self.doc2.id, self.doc3.id]
         metadata_document_id = self.doc1.id
+        user = User.objects.create(username="test_user")
 
-        result = bulk_edit.merge(doc_ids)
+        result = bulk_edit.merge(doc_ids, None, False, user)
 
         expected_filename = (
             f"{'_'.join([str(doc_id) for doc_id in doc_ids])[:100]}_merged.pdf"
@@ -525,7 +526,8 @@ class TestPDFActions(DirectoriesMixin, TestCase):
         """
         doc_ids = [self.doc2.id]
         pages = [[1, 2], [3]]
-        result = bulk_edit.split(doc_ids, pages)
+        user = User.objects.create(username="test_user")
+        result = bulk_edit.split(doc_ids, pages, False, user)
         self.assertEqual(mock_consume_file.call_count, 2)
         consume_file_args, _ = mock_consume_file.call_args
         self.assertEqual(consume_file_args[1].title, "B (split 2)")
index 2862809f92459f7da23b43995cd43ad28b663efa..575b1666b3f21e44138ff33993826c0ffa3a148e 100644 (file)
@@ -961,6 +961,11 @@ class BulkEditView(PassUserMixin):
         method = serializer.validated_data.get("method")
         parameters = serializer.validated_data.get("parameters")
         documents = serializer.validated_data.get("documents")
+        if method in [
+            bulk_edit.split,
+            bulk_edit.merge,
+        ]:
+            parameters["user"] = user
 
         if not user.is_superuser:
             document_objs = Document.objects.select_related("owner").filter(