Coverage for documents/workflows/utils.py: 56%
14 statements
« prev ^ index » next coverage.py v7.15.2, created at 2026-10-10 09:07 +0000
« prev ^ index » next coverage.py v7.15.2, created at 2026-10-10 09:07 +0000
1import logging
3from django.db.models import Exists
4from django.db.models import OuterRef
5from django.db.models import Prefetch
7from documents.models import Workflow
8from documents.models import WorkflowAction
9from documents.models import WorkflowTrigger
11logger = logging.getLogger("paperless.workflows")
14def get_workflows_for_trigger(
15 trigger_type: WorkflowTrigger.WorkflowTriggerType,
16 workflow_to_run: Workflow | None = None,
17):
18 """
19 Return workflows relevant to a trigger. If a specific workflow is given,
20 wrap it in a list; otherwise fetch enabled workflows for the trigger with
21 the prefetches used by the runner.
22 """
23 annotated_actions = (
24 WorkflowAction.objects.select_related(
25 "assign_correspondent",
26 "assign_document_type",
27 "assign_storage_path",
28 "assign_owner",
29 "email",
30 "webhook",
31 )
32 .prefetch_related(
33 "assign_tags",
34 "assign_view_users",
35 "assign_view_groups",
36 "assign_change_users",
37 "assign_change_groups",
38 "assign_custom_fields",
39 "remove_tags",
40 "remove_correspondents",
41 "remove_document_types",
42 "remove_storage_paths",
43 "remove_custom_fields",
44 "remove_owners",
45 )
46 .annotate(
47 has_assign_tags=Exists(
48 WorkflowAction.assign_tags.through.objects.filter(
49 workflowaction_id=OuterRef("pk"),
50 ),
51 ),
52 has_assign_view_users=Exists(
53 WorkflowAction.assign_view_users.through.objects.filter(
54 workflowaction_id=OuterRef("pk"),
55 ),
56 ),
57 has_assign_view_groups=Exists(
58 WorkflowAction.assign_view_groups.through.objects.filter(
59 workflowaction_id=OuterRef("pk"),
60 ),
61 ),
62 has_assign_change_users=Exists(
63 WorkflowAction.assign_change_users.through.objects.filter(
64 workflowaction_id=OuterRef("pk"),
65 ),
66 ),
67 has_assign_change_groups=Exists(
68 WorkflowAction.assign_change_groups.through.objects.filter(
69 workflowaction_id=OuterRef("pk"),
70 ),
71 ),
72 has_assign_custom_fields=Exists(
73 WorkflowAction.assign_custom_fields.through.objects.filter(
74 workflowaction_id=OuterRef("pk"),
75 ),
76 ),
77 has_remove_view_users=Exists(
78 WorkflowAction.remove_view_users.through.objects.filter(
79 workflowaction_id=OuterRef("pk"),
80 ),
81 ),
82 has_remove_view_groups=Exists(
83 WorkflowAction.remove_view_groups.through.objects.filter(
84 workflowaction_id=OuterRef("pk"),
85 ),
86 ),
87 has_remove_change_users=Exists(
88 WorkflowAction.remove_change_users.through.objects.filter(
89 workflowaction_id=OuterRef("pk"),
90 ),
91 ),
92 has_remove_change_groups=Exists(
93 WorkflowAction.remove_change_groups.through.objects.filter(
94 workflowaction_id=OuterRef("pk"),
95 ),
96 ),
97 has_remove_custom_fields=Exists(
98 WorkflowAction.remove_custom_fields.through.objects.filter(
99 workflowaction_id=OuterRef("pk"),
100 ),
101 ),
102 )
103 )
105 action_prefetch = Prefetch(
106 "actions",
107 queryset=annotated_actions.order_by("order", "pk"),
108 )
110 if workflow_to_run is not None:
111 return (
112 Workflow.objects.filter(pk=workflow_to_run.pk)
113 .prefetch_related(
114 action_prefetch,
115 "triggers",
116 )
117 .distinct()
118 )
120 return (
121 Workflow.objects.filter(enabled=True, triggers__type=trigger_type)
122 .prefetch_related(
123 action_prefetch,
124 "triggers",
125 )
126 .order_by("order")
127 .distinct()
128 )