Unify merge and merge_and_delete_originals
This commit is contained in:
parent
ef9d1b5188
commit
236213ed2b
@ -412,14 +412,13 @@ The following methods are supported:
|
|||||||
- `"merge": true or false` (defaults to false)
|
- `"merge": true or false` (defaults to false)
|
||||||
- The `merge` flag determines if the supplied permissions will overwrite all existing permissions (including
|
- The `merge` flag determines if the supplied permissions will overwrite all existing permissions (including
|
||||||
removing them) or be merged with existing permissions.
|
removing them) or be merged with existing permissions.
|
||||||
- `merge` and `merge_and_delete_originals`
|
- `merge`
|
||||||
- No additional `parameters` required.
|
- No additional `parameters` required.
|
||||||
- The ordering of the merged document is determined by the list of IDs.
|
- The ordering of the merged document is determined by the list of IDs.
|
||||||
- Optional `parameters`:
|
- Optional `parameters`:
|
||||||
- `"metadata_document_id": DOC_ID` apply metadata (tags, correspondent, etc.) from this document to the merged document.
|
- `"metadata_document_id": DOC_ID` apply metadata (tags, correspondent, etc.) from this document to the merged document.
|
||||||
- As the name implies, `merge_and_delete_originals` deletes the original
|
- `"delete_originals": true` to delete the original documents. This requires the calling user being the owner of
|
||||||
documents after merging. This requires the calling user being the owner of
|
all documents that are merged.
|
||||||
all documents that are merged.
|
|
||||||
- `split`
|
- `split`
|
||||||
- Requires `parameters`:
|
- Requires `parameters`:
|
||||||
- `"pages": [..]` The list should be a list of pages and/or a ranges, separated by commas e.g. `"[1,2-3,4,5-7]"`
|
- `"pages": [..]` The list should be a list of pages and/or a ranges, separated by commas e.g. `"[1,2-3,4,5-7]"`
|
||||||
|
@ -813,13 +813,11 @@ export class BulkEditorComponent
|
|||||||
if (mergeDialog.metadataDocumentID > -1) {
|
if (mergeDialog.metadataDocumentID > -1) {
|
||||||
args['metadata_document_id'] = mergeDialog.metadataDocumentID
|
args['metadata_document_id'] = mergeDialog.metadataDocumentID
|
||||||
}
|
}
|
||||||
|
if (mergeDialog.deleteOriginals) {
|
||||||
|
args['delete_originals'] = true
|
||||||
|
}
|
||||||
mergeDialog.buttonsEnabled = false
|
mergeDialog.buttonsEnabled = false
|
||||||
this.executeBulkOperation(
|
this.executeBulkOperation(modal, 'merge', args, mergeDialog.documentIDs)
|
||||||
modal,
|
|
||||||
mergeDialog.deleteOriginals ? 'merge_and_delete_originals' : 'merge',
|
|
||||||
args,
|
|
||||||
mergeDialog.documentIDs
|
|
||||||
)
|
|
||||||
this.toastService.showInfo(
|
this.toastService.showInfo(
|
||||||
$localize`Merged document will be queued for consumption.`
|
$localize`Merged document will be queued for consumption.`
|
||||||
)
|
)
|
||||||
|
@ -296,13 +296,6 @@ def merge(
|
|||||||
return "OK"
|
return "OK"
|
||||||
|
|
||||||
|
|
||||||
def merge_and_delete_originals(
|
|
||||||
doc_ids: list[int],
|
|
||||||
metadata_document_id: Optional[int] = None,
|
|
||||||
):
|
|
||||||
return merge(doc_ids, metadata_document_id, True)
|
|
||||||
|
|
||||||
|
|
||||||
def split(doc_ids: list[int], pages: list[list[int]]):
|
def split(doc_ids: list[int], pages: list[list[int]]):
|
||||||
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",
|
||||||
|
@ -943,7 +943,6 @@ class BulkEditSerializer(
|
|||||||
"set_permissions",
|
"set_permissions",
|
||||||
"rotate",
|
"rotate",
|
||||||
"merge",
|
"merge",
|
||||||
"merge_and_delete_originals",
|
|
||||||
"split",
|
"split",
|
||||||
"delete_pages",
|
"delete_pages",
|
||||||
],
|
],
|
||||||
@ -1000,8 +999,6 @@ class BulkEditSerializer(
|
|||||||
return bulk_edit.rotate
|
return bulk_edit.rotate
|
||||||
elif method == "merge":
|
elif method == "merge":
|
||||||
return bulk_edit.merge
|
return bulk_edit.merge
|
||||||
elif method == "merge_and_delete_originals":
|
|
||||||
return bulk_edit.merge_and_delete_originals
|
|
||||||
elif method == "split":
|
elif method == "split":
|
||||||
return bulk_edit.split
|
return bulk_edit.split
|
||||||
elif method == "delete_pages":
|
elif method == "delete_pages":
|
||||||
@ -1142,6 +1139,13 @@ class BulkEditSerializer(
|
|||||||
if not all(isinstance(i, int) for i in parameters["pages"]):
|
if not all(isinstance(i, int) for i in parameters["pages"]):
|
||||||
raise serializers.ValidationError("pages must be a list of integers")
|
raise serializers.ValidationError("pages must be a list of integers")
|
||||||
|
|
||||||
|
def _validate_parameters_merge(self, parameters):
|
||||||
|
if "delete_originals" in parameters:
|
||||||
|
if not isinstance(parameters["delete_originals"], bool):
|
||||||
|
raise serializers.ValidationError("delete_originals must be a boolean")
|
||||||
|
else:
|
||||||
|
parameters["delete_originals"] = False
|
||||||
|
|
||||||
def validate(self, attrs):
|
def validate(self, attrs):
|
||||||
method = attrs["method"]
|
method = attrs["method"]
|
||||||
parameters = attrs["parameters"]
|
parameters = attrs["parameters"]
|
||||||
@ -1174,6 +1178,8 @@ class BulkEditSerializer(
|
|||||||
"Delete pages method only supports one document",
|
"Delete pages method only supports one document",
|
||||||
)
|
)
|
||||||
self._validate_parameters_delete_pages(parameters)
|
self._validate_parameters_delete_pages(parameters)
|
||||||
|
elif method == bulk_edit.merge:
|
||||||
|
self._validate_parameters_merge(parameters)
|
||||||
|
|
||||||
return attrs
|
return attrs
|
||||||
|
|
||||||
|
@ -514,7 +514,7 @@ class TestPDFActions(DirectoriesMixin, TestCase):
|
|||||||
"""
|
"""
|
||||||
doc_ids = [self.doc1_delete_after_merge.id, self.doc2_delete_after_merge.id]
|
doc_ids = [self.doc1_delete_after_merge.id, self.doc2_delete_after_merge.id]
|
||||||
|
|
||||||
result = bulk_edit.merge_and_delete_originals(doc_ids)
|
result = bulk_edit.merge(doc_ids, delete_originals=True)
|
||||||
self.assertEqual(result, "OK")
|
self.assertEqual(result, "OK")
|
||||||
|
|
||||||
expected_filename = (
|
expected_filename = (
|
||||||
|
@ -965,14 +965,17 @@ class BulkEditView(PassUserMixin):
|
|||||||
document_objs = Document.objects.select_related("owner").filter(
|
document_objs = Document.objects.select_related("owner").filter(
|
||||||
pk__in=documents,
|
pk__in=documents,
|
||||||
)
|
)
|
||||||
|
user_is_owner_of_all_documents = all(
|
||||||
|
(doc.owner == user or doc.owner is None) for doc in document_objs
|
||||||
|
)
|
||||||
|
|
||||||
has_perms = (
|
has_perms = (
|
||||||
all((doc.owner == user or doc.owner is None) for doc in document_objs)
|
user_is_owner_of_all_documents
|
||||||
if method
|
if method
|
||||||
in [
|
in [
|
||||||
bulk_edit.set_permissions,
|
bulk_edit.set_permissions,
|
||||||
bulk_edit.delete,
|
bulk_edit.delete,
|
||||||
bulk_edit.rotate,
|
bulk_edit.rotate,
|
||||||
bulk_edit.merge_and_delete_originals,
|
|
||||||
]
|
]
|
||||||
else all(
|
else all(
|
||||||
has_perms_owner_aware(user, "change_document", doc)
|
has_perms_owner_aware(user, "change_document", doc)
|
||||||
@ -980,6 +983,13 @@ class BulkEditView(PassUserMixin):
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
if (
|
||||||
|
method == bulk_edit.merge
|
||||||
|
and parameters["delete_originals"]
|
||||||
|
and not user_is_owner_of_all_documents
|
||||||
|
):
|
||||||
|
has_perms = False
|
||||||
|
|
||||||
if not has_perms:
|
if not has_perms:
|
||||||
return HttpResponseForbidden("Insufficient permissions")
|
return HttpResponseForbidden("Insufficient permissions")
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user