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

1import logging 

2 

3from django.db.models import Exists 

4from django.db.models import OuterRef 

5from django.db.models import Prefetch 

6 

7from documents.models import Workflow 

8from documents.models import WorkflowAction 

9from documents.models import WorkflowTrigger 

10 

11logger = logging.getLogger("paperless.workflows") 

12 

13 

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 ) 

104 

105 action_prefetch = Prefetch( 

106 "actions", 

107 queryset=annotated_actions.order_by("order", "pk"), 

108 ) 

109 

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 ) 

119 

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 )