mirror of
https://github.com/paperless-ngx/paperless-ngx.git
synced 2025-12-12 01:11:17 -06:00
117 lines
3.9 KiB
Python
117 lines
3.9 KiB
Python
import logging
|
|
|
|
from django.db.models import Exists
|
|
from django.db.models import OuterRef
|
|
from django.db.models import Prefetch
|
|
|
|
from documents.models import Workflow
|
|
from documents.models import WorkflowAction
|
|
from documents.models import WorkflowTrigger
|
|
|
|
logger = logging.getLogger("paperless.workflows")
|
|
|
|
|
|
def get_workflows_for_trigger(
|
|
trigger_type: WorkflowTrigger.WorkflowTriggerType,
|
|
workflow_to_run: Workflow | None = None,
|
|
):
|
|
"""
|
|
Return workflows relevant to a trigger. If a specific workflow is given,
|
|
wrap it in a list; otherwise fetch enabled workflows for the trigger with
|
|
the prefetches used by the runner.
|
|
"""
|
|
if workflow_to_run is not None:
|
|
return [workflow_to_run]
|
|
|
|
annotated_actions = (
|
|
WorkflowAction.objects.select_related(
|
|
"assign_correspondent",
|
|
"assign_document_type",
|
|
"assign_storage_path",
|
|
"assign_owner",
|
|
"email",
|
|
"webhook",
|
|
)
|
|
.prefetch_related(
|
|
"assign_tags",
|
|
"assign_view_users",
|
|
"assign_view_groups",
|
|
"assign_change_users",
|
|
"assign_change_groups",
|
|
"assign_custom_fields",
|
|
"remove_tags",
|
|
"remove_correspondents",
|
|
"remove_document_types",
|
|
"remove_storage_paths",
|
|
"remove_custom_fields",
|
|
"remove_owners",
|
|
)
|
|
.annotate(
|
|
has_assign_tags=Exists(
|
|
WorkflowAction.assign_tags.through.objects.filter(
|
|
workflowaction_id=OuterRef("pk"),
|
|
),
|
|
),
|
|
has_assign_view_users=Exists(
|
|
WorkflowAction.assign_view_users.through.objects.filter(
|
|
workflowaction_id=OuterRef("pk"),
|
|
),
|
|
),
|
|
has_assign_view_groups=Exists(
|
|
WorkflowAction.assign_view_groups.through.objects.filter(
|
|
workflowaction_id=OuterRef("pk"),
|
|
),
|
|
),
|
|
has_assign_change_users=Exists(
|
|
WorkflowAction.assign_change_users.through.objects.filter(
|
|
workflowaction_id=OuterRef("pk"),
|
|
),
|
|
),
|
|
has_assign_change_groups=Exists(
|
|
WorkflowAction.assign_change_groups.through.objects.filter(
|
|
workflowaction_id=OuterRef("pk"),
|
|
),
|
|
),
|
|
has_assign_custom_fields=Exists(
|
|
WorkflowAction.assign_custom_fields.through.objects.filter(
|
|
workflowaction_id=OuterRef("pk"),
|
|
),
|
|
),
|
|
has_remove_view_users=Exists(
|
|
WorkflowAction.remove_view_users.through.objects.filter(
|
|
workflowaction_id=OuterRef("pk"),
|
|
),
|
|
),
|
|
has_remove_view_groups=Exists(
|
|
WorkflowAction.remove_view_groups.through.objects.filter(
|
|
workflowaction_id=OuterRef("pk"),
|
|
),
|
|
),
|
|
has_remove_change_users=Exists(
|
|
WorkflowAction.remove_change_users.through.objects.filter(
|
|
workflowaction_id=OuterRef("pk"),
|
|
),
|
|
),
|
|
has_remove_change_groups=Exists(
|
|
WorkflowAction.remove_change_groups.through.objects.filter(
|
|
workflowaction_id=OuterRef("pk"),
|
|
),
|
|
),
|
|
has_remove_custom_fields=Exists(
|
|
WorkflowAction.remove_custom_fields.through.objects.filter(
|
|
workflowaction_id=OuterRef("pk"),
|
|
),
|
|
),
|
|
)
|
|
)
|
|
|
|
return (
|
|
Workflow.objects.filter(enabled=True, triggers__type=trigger_type)
|
|
.prefetch_related(
|
|
Prefetch("actions", queryset=annotated_actions),
|
|
"triggers",
|
|
)
|
|
.order_by("order")
|
|
.distinct()
|
|
)
|