Enhancement: use request user as owner of split / merge docs (#7112)

This commit is contained in:
shamoon 2024-06-27 13:46:49 -07:00 committed by GitHub
parent e799d757c2
commit a64d457c30
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 25 additions and 3 deletions

View File

@ -10,6 +10,7 @@ from celery import chord
from celery import group from celery import group
from celery import shared_task from celery import shared_task
from django.conf import settings from django.conf import settings
from django.contrib.auth.models import User
from django.db.models import Q from django.db.models import Q
from documents.data_models import ConsumableDocument from documents.data_models import ConsumableDocument
@ -243,6 +244,7 @@ def merge(
doc_ids: list[int], doc_ids: list[int],
metadata_document_id: Optional[int] = None, metadata_document_id: Optional[int] = None,
delete_originals: bool = False, delete_originals: bool = False,
user: User = None,
): ):
logger.info( logger.info(
f"Attempting to merge {len(doc_ids)} documents into a single document.", f"Attempting to merge {len(doc_ids)} documents into a single document.",
@ -285,6 +287,9 @@ def merge(
else: else:
overrides = DocumentMetadataOverrides() overrides = DocumentMetadataOverrides()
if user is not None:
overrides.owner_id = user.id
logger.info("Adding merged document to the task queue.") logger.info("Adding merged document to the task queue.")
consume_task = consume_file.s( consume_task = consume_file.s(
@ -306,7 +311,12 @@ def merge(
return "OK" 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( logger.info(
f"Attempting to split document {doc_ids[0]} into {len(pages)} documents", 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 = DocumentMetadataOverrides().from_document(doc)
overrides.title = f"{doc.title} (split {idx + 1})" overrides.title = f"{doc.title} (split {idx + 1})"
if user is not None:
overrides.owner_id = user.id
logger.info( logger.info(
f"Adding split document with pages {split_doc} to the task queue.", f"Adding split document with pages {split_doc} to the task queue.",
) )

View File

@ -20,6 +20,7 @@ class TestBulkEditAPI(DirectoriesMixin, APITestCase):
super().setUp() super().setUp()
user = User.objects.create_superuser(username="temp_admin") user = User.objects.create_superuser(username="temp_admin")
self.user = user
self.client.force_authenticate(user=user) self.client.force_authenticate(user=user)
patcher = mock.patch("documents.bulk_edit.bulk_update_documents.delay") patcher = mock.patch("documents.bulk_edit.bulk_update_documents.delay")
@ -993,6 +994,7 @@ class TestBulkEditAPI(DirectoriesMixin, APITestCase):
args, kwargs = m.call_args args, kwargs = m.call_args
self.assertCountEqual(args[0], [self.doc2.id, self.doc3.id]) self.assertCountEqual(args[0], [self.doc2.id, self.doc3.id])
self.assertEqual(kwargs["metadata_document_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") @mock.patch("documents.serialisers.bulk_edit.merge")
def test_merge_and_delete_insufficient_permissions(self, m): def test_merge_and_delete_insufficient_permissions(self, m):
@ -1092,6 +1094,7 @@ class TestBulkEditAPI(DirectoriesMixin, APITestCase):
args, kwargs = m.call_args args, kwargs = m.call_args
self.assertCountEqual(args[0], [self.doc2.id]) self.assertCountEqual(args[0], [self.doc2.id])
self.assertEqual(kwargs["pages"], [[1], [2, 3, 4], [5, 6], [7]]) self.assertEqual(kwargs["pages"], [[1], [2, 3, 4], [5, 6], [7]])
self.assertEqual(kwargs["user"], self.user)
def test_split_invalid_params(self): def test_split_invalid_params(self):
response = self.client.post( response = self.client.post(

View File

@ -422,8 +422,9 @@ class TestPDFActions(DirectoriesMixin, TestCase):
""" """
doc_ids = [self.doc1.id, self.doc2.id, self.doc3.id] doc_ids = [self.doc1.id, self.doc2.id, self.doc3.id]
metadata_document_id = self.doc1.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 = ( expected_filename = (
f"{'_'.join([str(doc_id) for doc_id in doc_ids])[:100]}_merged.pdf" 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] doc_ids = [self.doc2.id]
pages = [[1, 2], [3]] 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) self.assertEqual(mock_consume_file.call_count, 2)
consume_file_args, _ = mock_consume_file.call_args consume_file_args, _ = mock_consume_file.call_args
self.assertEqual(consume_file_args[1].title, "B (split 2)") self.assertEqual(consume_file_args[1].title, "B (split 2)")

View File

@ -961,6 +961,11 @@ class BulkEditView(PassUserMixin):
method = serializer.validated_data.get("method") method = serializer.validated_data.get("method")
parameters = serializer.validated_data.get("parameters") parameters = serializer.validated_data.get("parameters")
documents = serializer.validated_data.get("documents") documents = serializer.validated_data.get("documents")
if method in [
bulk_edit.split,
bulk_edit.merge,
]:
parameters["user"] = user
if not user.is_superuser: if not user.is_superuser:
document_objs = Document.objects.select_related("owner").filter( document_objs = Document.objects.select_related("owner").filter(