mirror of
https://github.com/paperless-ngx/paperless-ngx.git
synced 2025-09-01 01:46:16 +00:00
Feature: workflow removal action (#5928)
--------- Co-authored-by: Trenton H <797416+stumpylog@users.noreply.github.com>
This commit is contained in:
@@ -7,6 +7,7 @@ from enum import Enum
|
||||
from pathlib import Path
|
||||
from subprocess import CompletedProcess
|
||||
from subprocess import run
|
||||
from typing import TYPE_CHECKING
|
||||
from typing import Optional
|
||||
|
||||
import magic
|
||||
@@ -35,6 +36,7 @@ from documents.models import FileInfo
|
||||
from documents.models import StoragePath
|
||||
from documents.models import Tag
|
||||
from documents.models import Workflow
|
||||
from documents.models import WorkflowAction
|
||||
from documents.models import WorkflowTrigger
|
||||
from documents.parsers import DocumentParser
|
||||
from documents.parsers import ParseError
|
||||
@@ -63,9 +65,26 @@ class WorkflowTriggerPlugin(
|
||||
"""
|
||||
Get overrides from matching workflows
|
||||
"""
|
||||
msg = ""
|
||||
overrides = DocumentMetadataOverrides()
|
||||
for workflow in Workflow.objects.filter(enabled=True).order_by("order"):
|
||||
template_overrides = DocumentMetadataOverrides()
|
||||
for workflow in (
|
||||
Workflow.objects.filter(enabled=True)
|
||||
.prefetch_related("actions")
|
||||
.prefetch_related("actions__assign_view_users")
|
||||
.prefetch_related("actions__assign_view_groups")
|
||||
.prefetch_related("actions__assign_change_users")
|
||||
.prefetch_related("actions__assign_change_groups")
|
||||
.prefetch_related("actions__assign_custom_fields")
|
||||
.prefetch_related("actions__remove_tags")
|
||||
.prefetch_related("actions__remove_correspondents")
|
||||
.prefetch_related("actions__remove_document_types")
|
||||
.prefetch_related("actions__remove_storage_paths")
|
||||
.prefetch_related("actions__remove_custom_fields")
|
||||
.prefetch_related("actions__remove_owners")
|
||||
.prefetch_related("triggers")
|
||||
.order_by("order")
|
||||
):
|
||||
action_overrides = DocumentMetadataOverrides()
|
||||
|
||||
if document_matches_workflow(
|
||||
self.input_doc,
|
||||
@@ -73,49 +92,137 @@ class WorkflowTriggerPlugin(
|
||||
WorkflowTrigger.WorkflowTriggerType.CONSUMPTION,
|
||||
):
|
||||
for action in workflow.actions.all():
|
||||
if action.assign_title is not None:
|
||||
template_overrides.title = action.assign_title
|
||||
if action.assign_tags is not None:
|
||||
template_overrides.tag_ids = [
|
||||
tag.pk for tag in action.assign_tags.all()
|
||||
]
|
||||
if action.assign_correspondent is not None:
|
||||
template_overrides.correspondent_id = (
|
||||
action.assign_correspondent.pk
|
||||
)
|
||||
if action.assign_document_type is not None:
|
||||
template_overrides.document_type_id = (
|
||||
action.assign_document_type.pk
|
||||
)
|
||||
if action.assign_storage_path is not None:
|
||||
template_overrides.storage_path_id = (
|
||||
action.assign_storage_path.pk
|
||||
)
|
||||
if action.assign_owner is not None:
|
||||
template_overrides.owner_id = action.assign_owner.pk
|
||||
if action.assign_view_users is not None:
|
||||
template_overrides.view_users = [
|
||||
user.pk for user in action.assign_view_users.all()
|
||||
]
|
||||
if action.assign_view_groups is not None:
|
||||
template_overrides.view_groups = [
|
||||
group.pk for group in action.assign_view_groups.all()
|
||||
]
|
||||
if action.assign_change_users is not None:
|
||||
template_overrides.change_users = [
|
||||
user.pk for user in action.assign_change_users.all()
|
||||
]
|
||||
if action.assign_change_groups is not None:
|
||||
template_overrides.change_groups = [
|
||||
group.pk for group in action.assign_change_groups.all()
|
||||
]
|
||||
if action.assign_custom_fields is not None:
|
||||
template_overrides.custom_field_ids = [
|
||||
field.pk for field in action.assign_custom_fields.all()
|
||||
]
|
||||
if TYPE_CHECKING:
|
||||
assert isinstance(action, WorkflowAction)
|
||||
msg += f"Applying {action} from {workflow}\n"
|
||||
if action.type == WorkflowAction.WorkflowActionType.ASSIGNMENT:
|
||||
if action.assign_title is not None:
|
||||
action_overrides.title = action.assign_title
|
||||
if action.assign_tags is not None:
|
||||
action_overrides.tag_ids = list(
|
||||
action.assign_tags.values_list("pk", flat=True),
|
||||
)
|
||||
|
||||
if action.assign_correspondent is not None:
|
||||
action_overrides.correspondent_id = (
|
||||
action.assign_correspondent.pk
|
||||
)
|
||||
if action.assign_document_type is not None:
|
||||
action_overrides.document_type_id = (
|
||||
action.assign_document_type.pk
|
||||
)
|
||||
if action.assign_storage_path is not None:
|
||||
action_overrides.storage_path_id = (
|
||||
action.assign_storage_path.pk
|
||||
)
|
||||
if action.assign_owner is not None:
|
||||
action_overrides.owner_id = action.assign_owner.pk
|
||||
if action.assign_view_users is not None:
|
||||
action_overrides.view_users = list(
|
||||
action.assign_view_users.values_list("pk", flat=True),
|
||||
)
|
||||
if action.assign_view_groups is not None:
|
||||
action_overrides.view_groups = list(
|
||||
action.assign_view_groups.values_list("pk", flat=True),
|
||||
)
|
||||
if action.assign_change_users is not None:
|
||||
action_overrides.change_users = list(
|
||||
action.assign_change_users.values_list("pk", flat=True),
|
||||
)
|
||||
if action.assign_change_groups is not None:
|
||||
action_overrides.change_groups = list(
|
||||
action.assign_change_groups.values_list(
|
||||
"pk",
|
||||
flat=True,
|
||||
),
|
||||
)
|
||||
if action.assign_custom_fields is not None:
|
||||
action_overrides.custom_field_ids = list(
|
||||
action.assign_custom_fields.values_list(
|
||||
"pk",
|
||||
flat=True,
|
||||
),
|
||||
)
|
||||
overrides.update(action_overrides)
|
||||
elif action.type == WorkflowAction.WorkflowActionType.REMOVAL:
|
||||
# Removal actions overwrite the current overrides
|
||||
if action.remove_all_tags:
|
||||
overrides.tag_ids = []
|
||||
elif overrides.tag_ids:
|
||||
for tag in action.remove_custom_fields.filter(
|
||||
pk__in=overrides.tag_ids,
|
||||
):
|
||||
overrides.tag_ids.remove(tag.pk)
|
||||
|
||||
if action.remove_all_correspondents or (
|
||||
overrides.correspondent_id is not None
|
||||
and action.remove_correspondents.filter(
|
||||
pk=overrides.correspondent_id,
|
||||
).exists()
|
||||
):
|
||||
overrides.correspondent_id = None
|
||||
|
||||
if action.remove_all_document_types or (
|
||||
overrides.document_type_id is not None
|
||||
and action.remove_document_types.filter(
|
||||
pk=overrides.document_type_id,
|
||||
).exists()
|
||||
):
|
||||
overrides.document_type_id = None
|
||||
|
||||
if action.remove_all_storage_paths or (
|
||||
overrides.storage_path_id is not None
|
||||
and action.remove_storage_paths.filter(
|
||||
pk=overrides.storage_path_id,
|
||||
).exists()
|
||||
):
|
||||
overrides.storage_path_id = None
|
||||
|
||||
if action.remove_all_custom_fields:
|
||||
overrides.custom_field_ids = []
|
||||
elif overrides.custom_field_ids:
|
||||
for field in action.remove_custom_fields.filter(
|
||||
pk__in=overrides.custom_field_ids,
|
||||
):
|
||||
overrides.custom_field_ids.remove(field.pk)
|
||||
|
||||
if action.remove_all_owners or (
|
||||
overrides.owner_id is not None
|
||||
and action.remove_owners.filter(
|
||||
pk=overrides.owner_id,
|
||||
).exists()
|
||||
):
|
||||
overrides.owner_id = None
|
||||
|
||||
if action.remove_all_permissions:
|
||||
overrides.view_users = []
|
||||
overrides.view_groups = []
|
||||
overrides.change_users = []
|
||||
overrides.change_groups = []
|
||||
else:
|
||||
if overrides.view_users:
|
||||
for user in action.remove_view_users.filter(
|
||||
pk__in=overrides.view_users,
|
||||
):
|
||||
overrides.view_users.remove(user.pk)
|
||||
if overrides.change_users:
|
||||
for user in action.remove_change_users.filter(
|
||||
pk__in=overrides.change_users,
|
||||
):
|
||||
overrides.change_users.remove(user.pk)
|
||||
if overrides.view_groups:
|
||||
for user in action.remove_view_groups.filter(
|
||||
pk__in=overrides.view_groups,
|
||||
):
|
||||
overrides.view_groups.remove(user.pk)
|
||||
if overrides.change_groups:
|
||||
for user in action.remove_change_groups.filter(
|
||||
pk__in=overrides.change_groups,
|
||||
):
|
||||
overrides.change_groups.remove(user.pk)
|
||||
|
||||
overrides.update(template_overrides)
|
||||
self.metadata.update(overrides)
|
||||
return msg
|
||||
|
||||
|
||||
class ConsumerError(Exception):
|
||||
|
Reference in New Issue
Block a user