django-forms-workflows 0.28.4__tar.gz → 0.28.6__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (140) hide show
  1. {django_forms_workflows-0.28.4 → django_forms_workflows-0.28.6}/PKG-INFO +1 -1
  2. {django_forms_workflows-0.28.4 → django_forms_workflows-0.28.6}/django_forms_workflows/admin.py +56 -9
  3. {django_forms_workflows-0.28.4 → django_forms_workflows-0.28.6}/django_forms_workflows/templates/django_forms_workflows/submission_detail.html +1 -1
  4. {django_forms_workflows-0.28.4 → django_forms_workflows-0.28.6}/django_forms_workflows/views.py +14 -19
  5. {django_forms_workflows-0.28.4 → django_forms_workflows-0.28.6}/pyproject.toml +1 -1
  6. {django_forms_workflows-0.28.4 → django_forms_workflows-0.28.6}/CHANGELOG.md +0 -0
  7. {django_forms_workflows-0.28.4 → django_forms_workflows-0.28.6}/LICENSE +0 -0
  8. {django_forms_workflows-0.28.4 → django_forms_workflows-0.28.6}/README.md +0 -0
  9. {django_forms_workflows-0.28.4 → django_forms_workflows-0.28.6}/django_forms_workflows/__init__.py +0 -0
  10. {django_forms_workflows-0.28.4 → django_forms_workflows-0.28.6}/django_forms_workflows/apps.py +0 -0
  11. {django_forms_workflows-0.28.4 → django_forms_workflows-0.28.6}/django_forms_workflows/conditions.py +0 -0
  12. {django_forms_workflows-0.28.4 → django_forms_workflows-0.28.6}/django_forms_workflows/context_processors.py +0 -0
  13. {django_forms_workflows-0.28.4 → django_forms_workflows-0.28.6}/django_forms_workflows/data_sources/__init__.py +0 -0
  14. {django_forms_workflows-0.28.4 → django_forms_workflows-0.28.6}/django_forms_workflows/data_sources/base.py +0 -0
  15. {django_forms_workflows-0.28.4 → django_forms_workflows-0.28.6}/django_forms_workflows/data_sources/database_source.py +0 -0
  16. {django_forms_workflows-0.28.4 → django_forms_workflows-0.28.6}/django_forms_workflows/data_sources/ldap_source.py +0 -0
  17. {django_forms_workflows-0.28.4 → django_forms_workflows-0.28.6}/django_forms_workflows/data_sources/user_source.py +0 -0
  18. {django_forms_workflows-0.28.4 → django_forms_workflows-0.28.6}/django_forms_workflows/diff_views.py +0 -0
  19. {django_forms_workflows-0.28.4 → django_forms_workflows-0.28.6}/django_forms_workflows/email_backends/__init__.py +0 -0
  20. {django_forms_workflows-0.28.4 → django_forms_workflows-0.28.6}/django_forms_workflows/email_backends/gmail_api.py +0 -0
  21. {django_forms_workflows-0.28.4 → django_forms_workflows-0.28.6}/django_forms_workflows/form_builder_urls.py +0 -0
  22. {django_forms_workflows-0.28.4 → django_forms_workflows-0.28.6}/django_forms_workflows/form_builder_views.py +0 -0
  23. {django_forms_workflows-0.28.4 → django_forms_workflows-0.28.6}/django_forms_workflows/forms.py +0 -0
  24. {django_forms_workflows-0.28.4 → django_forms_workflows-0.28.6}/django_forms_workflows/handlers/__init__.py +0 -0
  25. {django_forms_workflows-0.28.4 → django_forms_workflows-0.28.6}/django_forms_workflows/handlers/api_handler.py +0 -0
  26. {django_forms_workflows-0.28.4 → django_forms_workflows-0.28.6}/django_forms_workflows/handlers/base.py +0 -0
  27. {django_forms_workflows-0.28.4 → django_forms_workflows-0.28.6}/django_forms_workflows/handlers/database_handler.py +0 -0
  28. {django_forms_workflows-0.28.4 → django_forms_workflows-0.28.6}/django_forms_workflows/handlers/email_handler.py +0 -0
  29. {django_forms_workflows-0.28.4 → django_forms_workflows-0.28.6}/django_forms_workflows/handlers/executor.py +0 -0
  30. {django_forms_workflows-0.28.4 → django_forms_workflows-0.28.6}/django_forms_workflows/handlers/file_handler.py +0 -0
  31. {django_forms_workflows-0.28.4 → django_forms_workflows-0.28.6}/django_forms_workflows/handlers/ldap_handler.py +0 -0
  32. {django_forms_workflows-0.28.4 → django_forms_workflows-0.28.6}/django_forms_workflows/ldap_backend.py +0 -0
  33. {django_forms_workflows-0.28.4 → django_forms_workflows-0.28.6}/django_forms_workflows/management/commands/create_default_templates.py +0 -0
  34. {django_forms_workflows-0.28.4 → django_forms_workflows-0.28.6}/django_forms_workflows/management/commands/pull_forms.py +0 -0
  35. {django_forms_workflows-0.28.4 → django_forms_workflows-0.28.6}/django_forms_workflows/management/commands/push_forms.py +0 -0
  36. {django_forms_workflows-0.28.4 → django_forms_workflows-0.28.6}/django_forms_workflows/management/commands/seed_farm_demo.py +0 -0
  37. {django_forms_workflows-0.28.4 → django_forms_workflows-0.28.6}/django_forms_workflows/management/commands/seed_pcn_form.py +0 -0
  38. {django_forms_workflows-0.28.4 → django_forms_workflows-0.28.6}/django_forms_workflows/management/commands/seed_prefill_sources.py +0 -0
  39. {django_forms_workflows-0.28.4 → django_forms_workflows-0.28.6}/django_forms_workflows/management/commands/sync_ldap_profiles.py +0 -0
  40. {django_forms_workflows-0.28.4 → django_forms_workflows-0.28.6}/django_forms_workflows/management/commands/test_db_connection.py +0 -0
  41. {django_forms_workflows-0.28.4 → django_forms_workflows-0.28.6}/django_forms_workflows/migrations/0001_initial.py +0 -0
  42. {django_forms_workflows-0.28.4 → django_forms_workflows-0.28.6}/django_forms_workflows/migrations/0002_prefillsource_alter_formfield_prefill_source_and_more.py +0 -0
  43. {django_forms_workflows-0.28.4 → django_forms_workflows-0.28.6}/django_forms_workflows/migrations/0003_postsubmissionaction.py +0 -0
  44. {django_forms_workflows-0.28.4 → django_forms_workflows-0.28.6}/django_forms_workflows/migrations/0004_formtemplate.py +0 -0
  45. {django_forms_workflows-0.28.4 → django_forms_workflows-0.28.6}/django_forms_workflows/migrations/0005_advanced_conditional_logic.py +0 -0
  46. {django_forms_workflows-0.28.4 → django_forms_workflows-0.28.6}/django_forms_workflows/migrations/0006_workflowdefinition_visual_workflow_data_and_more.py +0 -0
  47. {django_forms_workflows-0.28.4 → django_forms_workflows-0.28.6}/django_forms_workflows/migrations/0007_add_userprofile_ldap_enhancements.py +0 -0
  48. {django_forms_workflows-0.28.4 → django_forms_workflows-0.28.6}/django_forms_workflows/migrations/0008_add_file_workflow_models.py +0 -0
  49. {django_forms_workflows-0.28.4 → django_forms_workflows-0.28.6}/django_forms_workflows/migrations/0009_add_formfield_readonly.py +0 -0
  50. {django_forms_workflows-0.28.4 → django_forms_workflows-0.28.6}/django_forms_workflows/migrations/0010_add_prefillsource_template_fields.py +0 -0
  51. {django_forms_workflows-0.28.4 → django_forms_workflows-0.28.6}/django_forms_workflows/migrations/0011_postsubmissionaction_email_body_template_and_more.py +0 -0
  52. {django_forms_workflows-0.28.4 → django_forms_workflows-0.28.6}/django_forms_workflows/migrations/0012_add_approval_step_fields.py +0 -0
  53. {django_forms_workflows-0.28.4 → django_forms_workflows-0.28.6}/django_forms_workflows/migrations/0013_add_database_query_key.py +0 -0
  54. {django_forms_workflows-0.28.4 → django_forms_workflows-0.28.6}/django_forms_workflows/migrations/0014_add_form_category.py +0 -0
  55. {django_forms_workflows-0.28.4 → django_forms_workflows-0.28.6}/django_forms_workflows/migrations/0015_add_workflowstage_staged_approvals.py +0 -0
  56. {django_forms_workflows-0.28.4 → django_forms_workflows-0.28.6}/django_forms_workflows/migrations/0016_add_pdf_generation.py +0 -0
  57. {django_forms_workflows-0.28.4 → django_forms_workflows-0.28.6}/django_forms_workflows/migrations/0017_add_notification_batching.py +0 -0
  58. {django_forms_workflows-0.28.4 → django_forms_workflows-0.28.6}/django_forms_workflows/migrations/0018_add_form_category_parent.py +0 -0
  59. {django_forms_workflows-0.28.4 → django_forms_workflows-0.28.6}/django_forms_workflows/migrations/0019_add_ldap_group_profile.py +0 -0
  60. {django_forms_workflows-0.28.4 → django_forms_workflows-0.28.6}/django_forms_workflows/migrations/0020_add_bulk_export_field.py +0 -0
  61. {django_forms_workflows-0.28.4 → django_forms_workflows-0.28.6}/django_forms_workflows/migrations/0021_alter_pendingnotification_scheduled_for_and_more.py +0 -0
  62. {django_forms_workflows-0.28.4 → django_forms_workflows-0.28.6}/django_forms_workflows/migrations/0022_add_bulk_pdf_export.py +0 -0
  63. {django_forms_workflows-0.28.4 → django_forms_workflows-0.28.6}/django_forms_workflows/migrations/0023_add_performance_indexes.py +0 -0
  64. {django_forms_workflows-0.28.4 → django_forms_workflows-0.28.6}/django_forms_workflows/migrations/0024_add_allow_resubmit.py +0 -0
  65. {django_forms_workflows-0.28.4 → django_forms_workflows-0.28.6}/django_forms_workflows/migrations/0025_workflowstage_approve_label.py +0 -0
  66. {django_forms_workflows-0.28.4 → django_forms_workflows-0.28.6}/django_forms_workflows/migrations/0026_alter_formfield_width.py +0 -0
  67. {django_forms_workflows-0.28.4 → django_forms_workflows-0.28.6}/django_forms_workflows/migrations/0027_formsubmission_form_data_gin.py +0 -0
  68. {django_forms_workflows-0.28.4 → django_forms_workflows-0.28.6}/django_forms_workflows/migrations/0028_workflowstagegroupconfig.py +0 -0
  69. {django_forms_workflows-0.28.4 → django_forms_workflows-0.28.6}/django_forms_workflows/migrations/0029_formfield_workflow_stage_fk_drop_groupconfig.py +0 -0
  70. {django_forms_workflows-0.28.4 → django_forms_workflows-0.28.6}/django_forms_workflows/migrations/0030_formfield_phone_type.py +0 -0
  71. {django_forms_workflows-0.28.4 → django_forms_workflows-0.28.6}/django_forms_workflows/migrations/0031_sub_workflows.py +0 -0
  72. {django_forms_workflows-0.28.4 → django_forms_workflows-0.28.6}/django_forms_workflows/migrations/0032_approved_pending_detached_sub_workflow.py +0 -0
  73. {django_forms_workflows-0.28.4 → django_forms_workflows-0.28.6}/django_forms_workflows/migrations/0033_add_reject_parent_to_subworkflowdefinition.py +0 -0
  74. {django_forms_workflows-0.28.4 → django_forms_workflows-0.28.6}/django_forms_workflows/migrations/0034_add_notificationlog.py +0 -0
  75. {django_forms_workflows-0.28.4 → django_forms_workflows-0.28.6}/django_forms_workflows/migrations/0035_migrate_prefill_source_strings.py +0 -0
  76. {django_forms_workflows-0.28.4 → django_forms_workflows-0.28.6}/django_forms_workflows/migrations/0036_add_workflowstage_auto_created.py +0 -0
  77. {django_forms_workflows-0.28.4 → django_forms_workflows-0.28.6}/django_forms_workflows/migrations/0037_migrate_flat_workflows_to_staged.py +0 -0
  78. {django_forms_workflows-0.28.4 → django_forms_workflows-0.28.6}/django_forms_workflows/migrations/0038_remove_legacy_prefill_source_and_approval_step.py +0 -0
  79. {django_forms_workflows-0.28.4 → django_forms_workflows-0.28.6}/django_forms_workflows/migrations/0039_update_help_text.py +0 -0
  80. {django_forms_workflows-0.28.4 → django_forms_workflows-0.28.6}/django_forms_workflows/migrations/0040_migrate_deprecated_features.py +0 -0
  81. {django_forms_workflows-0.28.4 → django_forms_workflows-0.28.6}/django_forms_workflows/migrations/0041_remove_deprecated_fields.py +0 -0
  82. {django_forms_workflows-0.28.4 → django_forms_workflows-0.28.6}/django_forms_workflows/migrations/0042_add_sub_workflow_section_label.py +0 -0
  83. {django_forms_workflows-0.28.4 → django_forms_workflows-0.28.6}/django_forms_workflows/migrations/0043_fix_form_data_decimal_encoding.py +0 -0
  84. {django_forms_workflows-0.28.4 → django_forms_workflows-0.28.6}/django_forms_workflows/migrations/0044_remove_subworkflowinstance_label.py +0 -0
  85. {django_forms_workflows-0.28.4 → django_forms_workflows-0.28.6}/django_forms_workflows/migrations/0045_stageapprovalgroup_workflow_name_label.py +0 -0
  86. {django_forms_workflows-0.28.4 → django_forms_workflows-0.28.6}/django_forms_workflows/migrations/0046_workflow_definition_one_to_many.py +0 -0
  87. {django_forms_workflows-0.28.4 → django_forms_workflows-0.28.6}/django_forms_workflows/migrations/0047_add_hide_approval_history.py +0 -0
  88. {django_forms_workflows-0.28.4 → django_forms_workflows-0.28.6}/django_forms_workflows/migrations/0048_workflowdefinition_trigger_conditions_and_more.py +0 -0
  89. {django_forms_workflows-0.28.4 → django_forms_workflows-0.28.6}/django_forms_workflows/migrations/0049_formfield_multifile_type.py +0 -0
  90. {django_forms_workflows-0.28.4 → django_forms_workflows-0.28.6}/django_forms_workflows/migrations/__init__.py +0 -0
  91. {django_forms_workflows-0.28.4 → django_forms_workflows-0.28.6}/django_forms_workflows/models.py +0 -0
  92. {django_forms_workflows-0.28.4 → django_forms_workflows-0.28.6}/django_forms_workflows/signals.py +0 -0
  93. {django_forms_workflows-0.28.4 → django_forms_workflows-0.28.6}/django_forms_workflows/sso_backends.py +0 -0
  94. {django_forms_workflows-0.28.4 → django_forms_workflows-0.28.6}/django_forms_workflows/sso_urls.py +0 -0
  95. {django_forms_workflows-0.28.4 → django_forms_workflows-0.28.6}/django_forms_workflows/sso_views.py +0 -0
  96. {django_forms_workflows-0.28.4 → django_forms_workflows-0.28.6}/django_forms_workflows/static/django_forms_workflows/js/form-builder.js +0 -0
  97. {django_forms_workflows-0.28.4 → django_forms_workflows-0.28.6}/django_forms_workflows/static/django_forms_workflows/js/form-enhancements.js +0 -0
  98. {django_forms_workflows-0.28.4 → django_forms_workflows-0.28.6}/django_forms_workflows/static/django_forms_workflows/js/workflow-builder.js +0 -0
  99. {django_forms_workflows-0.28.4 → django_forms_workflows-0.28.6}/django_forms_workflows/sync_api.py +0 -0
  100. {django_forms_workflows-0.28.4 → django_forms_workflows-0.28.6}/django_forms_workflows/sync_views.py +0 -0
  101. {django_forms_workflows-0.28.4 → django_forms_workflows-0.28.6}/django_forms_workflows/tasks.py +0 -0
  102. {django_forms_workflows-0.28.4 → django_forms_workflows-0.28.6}/django_forms_workflows/templates/admin/django_forms_workflows/_sync_diff.html +0 -0
  103. {django_forms_workflows-0.28.4 → django_forms_workflows-0.28.6}/django_forms_workflows/templates/admin/django_forms_workflows/diff_forms.html +0 -0
  104. {django_forms_workflows-0.28.4 → django_forms_workflows-0.28.6}/django_forms_workflows/templates/admin/django_forms_workflows/form_builder.html +0 -0
  105. {django_forms_workflows-0.28.4 → django_forms_workflows-0.28.6}/django_forms_workflows/templates/admin/django_forms_workflows/formdef_change_form.html +0 -0
  106. {django_forms_workflows-0.28.4 → django_forms_workflows-0.28.6}/django_forms_workflows/templates/admin/django_forms_workflows/formdefinition/change_list.html +0 -0
  107. {django_forms_workflows-0.28.4 → django_forms_workflows-0.28.6}/django_forms_workflows/templates/admin/django_forms_workflows/sync_import.html +0 -0
  108. {django_forms_workflows-0.28.4 → django_forms_workflows-0.28.6}/django_forms_workflows/templates/admin/django_forms_workflows/sync_pull.html +0 -0
  109. {django_forms_workflows-0.28.4 → django_forms_workflows-0.28.6}/django_forms_workflows/templates/admin/django_forms_workflows/sync_push.html +0 -0
  110. {django_forms_workflows-0.28.4 → django_forms_workflows-0.28.6}/django_forms_workflows/templates/admin/django_forms_workflows/workflow_builder.html +0 -0
  111. {django_forms_workflows-0.28.4 → django_forms_workflows-0.28.6}/django_forms_workflows/templates/django_forms_workflows/_category_node.html +0 -0
  112. {django_forms_workflows-0.28.4 → django_forms_workflows-0.28.6}/django_forms_workflows/templates/django_forms_workflows/approval_inbox.html +0 -0
  113. {django_forms_workflows-0.28.4 → django_forms_workflows-0.28.6}/django_forms_workflows/templates/django_forms_workflows/approve.html +0 -0
  114. {django_forms_workflows-0.28.4 → django_forms_workflows-0.28.6}/django_forms_workflows/templates/django_forms_workflows/base.html +0 -0
  115. {django_forms_workflows-0.28.4 → django_forms_workflows-0.28.6}/django_forms_workflows/templates/django_forms_workflows/completed_approvals.html +0 -0
  116. {django_forms_workflows-0.28.4 → django_forms_workflows-0.28.6}/django_forms_workflows/templates/django_forms_workflows/form_categories.html +0 -0
  117. {django_forms_workflows-0.28.4 → django_forms_workflows-0.28.6}/django_forms_workflows/templates/django_forms_workflows/form_list.html +0 -0
  118. {django_forms_workflows-0.28.4 → django_forms_workflows-0.28.6}/django_forms_workflows/templates/django_forms_workflows/form_submit.html +0 -0
  119. {django_forms_workflows-0.28.4 → django_forms_workflows-0.28.6}/django_forms_workflows/templates/django_forms_workflows/my_submissions.html +0 -0
  120. {django_forms_workflows-0.28.4 → django_forms_workflows-0.28.6}/django_forms_workflows/templates/django_forms_workflows/resubmit_confirm.html +0 -0
  121. {django_forms_workflows-0.28.4 → django_forms_workflows-0.28.6}/django_forms_workflows/templates/django_forms_workflows/sso/login.html +0 -0
  122. {django_forms_workflows-0.28.4 → django_forms_workflows-0.28.6}/django_forms_workflows/templates/django_forms_workflows/sub_workflow_detail.html +0 -0
  123. {django_forms_workflows-0.28.4 → django_forms_workflows-0.28.6}/django_forms_workflows/templates/django_forms_workflows/submission_bulk_pdf.html +0 -0
  124. {django_forms_workflows-0.28.4 → django_forms_workflows-0.28.6}/django_forms_workflows/templates/django_forms_workflows/submission_pdf.html +0 -0
  125. {django_forms_workflows-0.28.4 → django_forms_workflows-0.28.6}/django_forms_workflows/templates/django_forms_workflows/withdraw_confirm.html +0 -0
  126. {django_forms_workflows-0.28.4 → django_forms_workflows-0.28.6}/django_forms_workflows/templates/emails/approval_notification.html +0 -0
  127. {django_forms_workflows-0.28.4 → django_forms_workflows-0.28.6}/django_forms_workflows/templates/emails/approval_reminder.html +0 -0
  128. {django_forms_workflows-0.28.4 → django_forms_workflows-0.28.6}/django_forms_workflows/templates/emails/approval_request.html +0 -0
  129. {django_forms_workflows-0.28.4 → django_forms_workflows-0.28.6}/django_forms_workflows/templates/emails/email_styles.html +0 -0
  130. {django_forms_workflows-0.28.4 → django_forms_workflows-0.28.6}/django_forms_workflows/templates/emails/escalation_notification.html +0 -0
  131. {django_forms_workflows-0.28.4 → django_forms_workflows-0.28.6}/django_forms_workflows/templates/emails/notification_digest.html +0 -0
  132. {django_forms_workflows-0.28.4 → django_forms_workflows-0.28.6}/django_forms_workflows/templates/emails/rejection_notification.html +0 -0
  133. {django_forms_workflows-0.28.4 → django_forms_workflows-0.28.6}/django_forms_workflows/templates/emails/submission_notification.html +0 -0
  134. {django_forms_workflows-0.28.4 → django_forms_workflows-0.28.6}/django_forms_workflows/templates/registration/login.html +0 -0
  135. {django_forms_workflows-0.28.4 → django_forms_workflows-0.28.6}/django_forms_workflows/templatetags/__init__.py +0 -0
  136. {django_forms_workflows-0.28.4 → django_forms_workflows-0.28.6}/django_forms_workflows/templatetags/forms_workflows_tags.py +0 -0
  137. {django_forms_workflows-0.28.4 → django_forms_workflows-0.28.6}/django_forms_workflows/urls.py +0 -0
  138. {django_forms_workflows-0.28.4 → django_forms_workflows-0.28.6}/django_forms_workflows/utils.py +0 -0
  139. {django_forms_workflows-0.28.4 → django_forms_workflows-0.28.6}/django_forms_workflows/workflow_builder_views.py +0 -0
  140. {django_forms_workflows-0.28.4 → django_forms_workflows-0.28.6}/django_forms_workflows/workflow_engine.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: django-forms-workflows
3
- Version: 0.28.4
3
+ Version: 0.28.6
4
4
  Summary: Enterprise-grade, database-driven form builder with approval workflows and external data integration
5
5
  License: LGPL-3.0-only
6
6
  License-File: LICENSE
@@ -278,10 +278,26 @@ class WorkflowDefinitionInline(admin.StackedInline):
278
278
  fields = [
279
279
  "name_label",
280
280
  "requires_approval",
281
- "trigger_conditions",
282
281
  "hide_approval_history",
283
- ("notify_on_submission", "notify_on_approval", "notify_on_rejection"),
282
+ "trigger_conditions",
283
+ (
284
+ "notify_on_submission",
285
+ "notify_on_approval",
286
+ "notify_on_rejection",
287
+ "notify_on_withdrawal",
288
+ ),
284
289
  "additional_notify_emails",
290
+ "notification_cadence",
291
+ (
292
+ "notification_cadence_day",
293
+ "notification_cadence_time",
294
+ "notification_cadence_form_field",
295
+ ),
296
+ (
297
+ "approval_deadline_days",
298
+ "send_reminder_after_days",
299
+ "auto_approve_after_days",
300
+ ),
285
301
  ("allow_bulk_export", "allow_bulk_pdf_export"),
286
302
  ]
287
303
 
@@ -1085,20 +1101,50 @@ class WorkflowStageAdmin(admin.ModelAdmin):
1085
1101
  per group that needs its own approve_label or approval fields.
1086
1102
  """
1087
1103
 
1088
- list_display = ("__str__", "workflow", "order", "approval_logic", "approve_label")
1104
+ list_display = (
1105
+ "__str__",
1106
+ "workflow",
1107
+ "order",
1108
+ "approval_logic",
1109
+ "approve_label",
1110
+ "requires_manager_approval",
1111
+ "has_trigger_conditions",
1112
+ )
1089
1113
  list_filter = ("workflow", "approval_logic", "requires_manager_approval")
1090
1114
  list_select_related = ("workflow", "workflow__form_definition")
1091
1115
  search_fields = ("name", "workflow__form_definition__name")
1092
1116
  ordering = ("workflow", "order")
1093
1117
  inlines = [StageApprovalGroupInline]
1094
- fields = (
1095
- "workflow",
1096
- ("order", "name"),
1097
- "approval_logic",
1098
- "approve_label",
1099
- "requires_manager_approval",
1118
+ fieldsets = (
1119
+ (
1120
+ None,
1121
+ {
1122
+ "fields": (
1123
+ "workflow",
1124
+ ("order", "name"),
1125
+ "approval_logic",
1126
+ "approve_label",
1127
+ "requires_manager_approval",
1128
+ )
1129
+ },
1130
+ ),
1131
+ (
1132
+ "Conditional Trigger",
1133
+ {
1134
+ "classes": ("collapse",),
1135
+ "description": (
1136
+ "When set, this stage only runs if the submission data matches these "
1137
+ "conditions. Leave blank to always run this stage."
1138
+ ),
1139
+ "fields": ("trigger_conditions",),
1140
+ },
1141
+ ),
1100
1142
  )
1101
1143
 
1144
+ @admin.display(boolean=True, description="Has trigger conditions")
1145
+ def has_trigger_conditions(self, obj):
1146
+ return bool(obj.trigger_conditions)
1147
+
1102
1148
 
1103
1149
  class WorkflowStageInline(admin.StackedInline):
1104
1150
  """Inline for defining ordered stages on a WorkflowDefinition."""
@@ -1138,6 +1184,7 @@ class WorkflowDefinitionAdmin(admin.ModelAdmin):
1138
1184
  "form_definition",
1139
1185
  "name_label",
1140
1186
  "requires_approval",
1187
+ "hide_approval_history",
1141
1188
  "trigger_conditions",
1142
1189
  )
1143
1190
  },
@@ -233,7 +233,7 @@
233
233
  {% elif stage.approved_count > 0 %}bg-primary text-white
234
234
  {% else %}bg-light text-muted{% endif %}">
235
235
  <span>
236
- <strong>{% if workflow_name_label %}{{ workflow_name_label }}{% else %}Stage {{ stage.number }}{% if not stage.has_multiple_stages %}: {{ stage.name }}{% endif %}{% endif %}</strong>
236
+ <strong>{% if workflow_name_label %}{{ workflow_name_label }}{% else %}Stage {{ stage.number }}: {{ stage.name }}{% endif %}</strong>
237
237
  </span>
238
238
  <span class="badge bg-white
239
239
  {% if stage.rejected_count > 0 %}text-danger
@@ -563,21 +563,27 @@ def submission_detail(request, submission_id):
563
563
  continue
564
564
  is_parent = task.workflow_stage_id in parent_stage_ids
565
565
  target = parent_groups if is_parent else sub_groups
566
- # Group parent tasks by stage_number (order) so parallel stages
567
- # (same order, different stage IDs) merge into one card.
568
- # Sub-workflow tasks still group by stage ID.
569
- stage_key = (
570
- (task.stage_number or 0) if is_parent else task.workflow_stage_id
571
- )
566
+ # Group by workflow_stage_id so every distinct stage (including
567
+ # parallel stages at the same order number) gets its own card.
568
+ stage_key = task.workflow_stage_id
572
569
  if stage_key not in target:
570
+ stage_name = (
571
+ task.workflow_stage.name
572
+ if task.workflow_stage
573
+ else f"Stage {task.stage_number or 0}"
574
+ )
573
575
  target[stage_key] = {
574
576
  "number": task.stage_number or 0,
575
- "name": f"Stage {task.stage_number or 0}",
577
+ "name": stage_name,
578
+ "approval_logic": (
579
+ task.workflow_stage.approval_logic
580
+ if task.workflow_stage
581
+ else "all"
582
+ ),
576
583
  "tasks": [],
577
584
  "approved_count": 0,
578
585
  "rejected_count": 0,
579
586
  "total_count": 0,
580
- "has_multiple_stages": False,
581
587
  }
582
588
  group = target[stage_key]
583
589
  # Enrich task with its stage name for the "Step" column
@@ -593,17 +599,6 @@ def submission_detail(request, submission_id):
593
599
  elif task.status == "rejected":
594
600
  group["rejected_count"] += 1
595
601
 
596
- # Detect whether each parent group has tasks from multiple stages
597
- for group in parent_groups.values():
598
- stage_ids = {t.workflow_stage_id for t in group["tasks"]}
599
- if len(stage_ids) > 1:
600
- group["has_multiple_stages"] = True
601
- elif len(stage_ids) == 1:
602
- ws = group["tasks"][0].workflow_stage
603
- if ws:
604
- group["name"] = ws.name
605
- group["approval_logic"] = ws.approval_logic
606
-
607
602
  if parent_groups:
608
603
  stage_groups = sorted(parent_groups.values(), key=lambda x: x["number"])
609
604
  if sub_groups:
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "django-forms-workflows"
3
- version = "0.28.4"
3
+ version = "0.28.6"
4
4
  description = "Enterprise-grade, database-driven form builder with approval workflows and external data integration"
5
5
  license = "LGPL-3.0-only"
6
6
  readme = "README.md"