django-forms-workflows 0.19.2__tar.gz → 0.20.0__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 (129) hide show
  1. {django_forms_workflows-0.19.2 → django_forms_workflows-0.20.0}/PKG-INFO +1 -1
  2. django_forms_workflows-0.20.0/django_forms_workflows/migrations/0042_add_sub_workflow_section_label.py +22 -0
  3. {django_forms_workflows-0.19.2 → django_forms_workflows-0.20.0}/django_forms_workflows/models.py +6 -0
  4. {django_forms_workflows-0.19.2 → django_forms_workflows-0.20.0}/django_forms_workflows/static/django_forms_workflows/js/workflow-builder.js +11 -0
  5. {django_forms_workflows-0.19.2 → django_forms_workflows-0.20.0}/django_forms_workflows/sync_api.py +2 -0
  6. {django_forms_workflows-0.19.2 → django_forms_workflows-0.20.0}/django_forms_workflows/templates/django_forms_workflows/submission_detail.html +4 -2
  7. {django_forms_workflows-0.19.2 → django_forms_workflows-0.20.0}/django_forms_workflows/views.py +11 -0
  8. {django_forms_workflows-0.19.2 → django_forms_workflows-0.20.0}/django_forms_workflows/workflow_builder_views.py +2 -0
  9. {django_forms_workflows-0.19.2 → django_forms_workflows-0.20.0}/pyproject.toml +1 -1
  10. {django_forms_workflows-0.19.2 → django_forms_workflows-0.20.0}/CHANGELOG.md +0 -0
  11. {django_forms_workflows-0.19.2 → django_forms_workflows-0.20.0}/LICENSE +0 -0
  12. {django_forms_workflows-0.19.2 → django_forms_workflows-0.20.0}/README.md +0 -0
  13. {django_forms_workflows-0.19.2 → django_forms_workflows-0.20.0}/django_forms_workflows/__init__.py +0 -0
  14. {django_forms_workflows-0.19.2 → django_forms_workflows-0.20.0}/django_forms_workflows/admin.py +0 -0
  15. {django_forms_workflows-0.19.2 → django_forms_workflows-0.20.0}/django_forms_workflows/apps.py +0 -0
  16. {django_forms_workflows-0.19.2 → django_forms_workflows-0.20.0}/django_forms_workflows/context_processors.py +0 -0
  17. {django_forms_workflows-0.19.2 → django_forms_workflows-0.20.0}/django_forms_workflows/data_sources/__init__.py +0 -0
  18. {django_forms_workflows-0.19.2 → django_forms_workflows-0.20.0}/django_forms_workflows/data_sources/base.py +0 -0
  19. {django_forms_workflows-0.19.2 → django_forms_workflows-0.20.0}/django_forms_workflows/data_sources/database_source.py +0 -0
  20. {django_forms_workflows-0.19.2 → django_forms_workflows-0.20.0}/django_forms_workflows/data_sources/ldap_source.py +0 -0
  21. {django_forms_workflows-0.19.2 → django_forms_workflows-0.20.0}/django_forms_workflows/data_sources/user_source.py +0 -0
  22. {django_forms_workflows-0.19.2 → django_forms_workflows-0.20.0}/django_forms_workflows/email_backends/__init__.py +0 -0
  23. {django_forms_workflows-0.19.2 → django_forms_workflows-0.20.0}/django_forms_workflows/email_backends/gmail_api.py +0 -0
  24. {django_forms_workflows-0.19.2 → django_forms_workflows-0.20.0}/django_forms_workflows/form_builder_urls.py +0 -0
  25. {django_forms_workflows-0.19.2 → django_forms_workflows-0.20.0}/django_forms_workflows/form_builder_views.py +0 -0
  26. {django_forms_workflows-0.19.2 → django_forms_workflows-0.20.0}/django_forms_workflows/forms.py +0 -0
  27. {django_forms_workflows-0.19.2 → django_forms_workflows-0.20.0}/django_forms_workflows/handlers/__init__.py +0 -0
  28. {django_forms_workflows-0.19.2 → django_forms_workflows-0.20.0}/django_forms_workflows/handlers/api_handler.py +0 -0
  29. {django_forms_workflows-0.19.2 → django_forms_workflows-0.20.0}/django_forms_workflows/handlers/base.py +0 -0
  30. {django_forms_workflows-0.19.2 → django_forms_workflows-0.20.0}/django_forms_workflows/handlers/database_handler.py +0 -0
  31. {django_forms_workflows-0.19.2 → django_forms_workflows-0.20.0}/django_forms_workflows/handlers/email_handler.py +0 -0
  32. {django_forms_workflows-0.19.2 → django_forms_workflows-0.20.0}/django_forms_workflows/handlers/executor.py +0 -0
  33. {django_forms_workflows-0.19.2 → django_forms_workflows-0.20.0}/django_forms_workflows/handlers/file_handler.py +0 -0
  34. {django_forms_workflows-0.19.2 → django_forms_workflows-0.20.0}/django_forms_workflows/handlers/ldap_handler.py +0 -0
  35. {django_forms_workflows-0.19.2 → django_forms_workflows-0.20.0}/django_forms_workflows/ldap_backend.py +0 -0
  36. {django_forms_workflows-0.19.2 → django_forms_workflows-0.20.0}/django_forms_workflows/management/commands/create_default_templates.py +0 -0
  37. {django_forms_workflows-0.19.2 → django_forms_workflows-0.20.0}/django_forms_workflows/management/commands/pull_forms.py +0 -0
  38. {django_forms_workflows-0.19.2 → django_forms_workflows-0.20.0}/django_forms_workflows/management/commands/push_forms.py +0 -0
  39. {django_forms_workflows-0.19.2 → django_forms_workflows-0.20.0}/django_forms_workflows/management/commands/seed_farm_demo.py +0 -0
  40. {django_forms_workflows-0.19.2 → django_forms_workflows-0.20.0}/django_forms_workflows/management/commands/seed_pcn_form.py +0 -0
  41. {django_forms_workflows-0.19.2 → django_forms_workflows-0.20.0}/django_forms_workflows/management/commands/seed_prefill_sources.py +0 -0
  42. {django_forms_workflows-0.19.2 → django_forms_workflows-0.20.0}/django_forms_workflows/management/commands/sync_ldap_profiles.py +0 -0
  43. {django_forms_workflows-0.19.2 → django_forms_workflows-0.20.0}/django_forms_workflows/management/commands/test_db_connection.py +0 -0
  44. {django_forms_workflows-0.19.2 → django_forms_workflows-0.20.0}/django_forms_workflows/migrations/0001_initial.py +0 -0
  45. {django_forms_workflows-0.19.2 → django_forms_workflows-0.20.0}/django_forms_workflows/migrations/0002_prefillsource_alter_formfield_prefill_source_and_more.py +0 -0
  46. {django_forms_workflows-0.19.2 → django_forms_workflows-0.20.0}/django_forms_workflows/migrations/0003_postsubmissionaction.py +0 -0
  47. {django_forms_workflows-0.19.2 → django_forms_workflows-0.20.0}/django_forms_workflows/migrations/0004_formtemplate.py +0 -0
  48. {django_forms_workflows-0.19.2 → django_forms_workflows-0.20.0}/django_forms_workflows/migrations/0005_advanced_conditional_logic.py +0 -0
  49. {django_forms_workflows-0.19.2 → django_forms_workflows-0.20.0}/django_forms_workflows/migrations/0006_workflowdefinition_visual_workflow_data_and_more.py +0 -0
  50. {django_forms_workflows-0.19.2 → django_forms_workflows-0.20.0}/django_forms_workflows/migrations/0007_add_userprofile_ldap_enhancements.py +0 -0
  51. {django_forms_workflows-0.19.2 → django_forms_workflows-0.20.0}/django_forms_workflows/migrations/0008_add_file_workflow_models.py +0 -0
  52. {django_forms_workflows-0.19.2 → django_forms_workflows-0.20.0}/django_forms_workflows/migrations/0009_add_formfield_readonly.py +0 -0
  53. {django_forms_workflows-0.19.2 → django_forms_workflows-0.20.0}/django_forms_workflows/migrations/0010_add_prefillsource_template_fields.py +0 -0
  54. {django_forms_workflows-0.19.2 → django_forms_workflows-0.20.0}/django_forms_workflows/migrations/0011_postsubmissionaction_email_body_template_and_more.py +0 -0
  55. {django_forms_workflows-0.19.2 → django_forms_workflows-0.20.0}/django_forms_workflows/migrations/0012_add_approval_step_fields.py +0 -0
  56. {django_forms_workflows-0.19.2 → django_forms_workflows-0.20.0}/django_forms_workflows/migrations/0013_add_database_query_key.py +0 -0
  57. {django_forms_workflows-0.19.2 → django_forms_workflows-0.20.0}/django_forms_workflows/migrations/0014_add_form_category.py +0 -0
  58. {django_forms_workflows-0.19.2 → django_forms_workflows-0.20.0}/django_forms_workflows/migrations/0015_add_workflowstage_staged_approvals.py +0 -0
  59. {django_forms_workflows-0.19.2 → django_forms_workflows-0.20.0}/django_forms_workflows/migrations/0016_add_pdf_generation.py +0 -0
  60. {django_forms_workflows-0.19.2 → django_forms_workflows-0.20.0}/django_forms_workflows/migrations/0017_add_notification_batching.py +0 -0
  61. {django_forms_workflows-0.19.2 → django_forms_workflows-0.20.0}/django_forms_workflows/migrations/0018_add_form_category_parent.py +0 -0
  62. {django_forms_workflows-0.19.2 → django_forms_workflows-0.20.0}/django_forms_workflows/migrations/0019_add_ldap_group_profile.py +0 -0
  63. {django_forms_workflows-0.19.2 → django_forms_workflows-0.20.0}/django_forms_workflows/migrations/0020_add_bulk_export_field.py +0 -0
  64. {django_forms_workflows-0.19.2 → django_forms_workflows-0.20.0}/django_forms_workflows/migrations/0021_alter_pendingnotification_scheduled_for_and_more.py +0 -0
  65. {django_forms_workflows-0.19.2 → django_forms_workflows-0.20.0}/django_forms_workflows/migrations/0022_add_bulk_pdf_export.py +0 -0
  66. {django_forms_workflows-0.19.2 → django_forms_workflows-0.20.0}/django_forms_workflows/migrations/0023_add_performance_indexes.py +0 -0
  67. {django_forms_workflows-0.19.2 → django_forms_workflows-0.20.0}/django_forms_workflows/migrations/0024_add_allow_resubmit.py +0 -0
  68. {django_forms_workflows-0.19.2 → django_forms_workflows-0.20.0}/django_forms_workflows/migrations/0025_workflowstage_approve_label.py +0 -0
  69. {django_forms_workflows-0.19.2 → django_forms_workflows-0.20.0}/django_forms_workflows/migrations/0026_alter_formfield_width.py +0 -0
  70. {django_forms_workflows-0.19.2 → django_forms_workflows-0.20.0}/django_forms_workflows/migrations/0027_formsubmission_form_data_gin.py +0 -0
  71. {django_forms_workflows-0.19.2 → django_forms_workflows-0.20.0}/django_forms_workflows/migrations/0028_workflowstagegroupconfig.py +0 -0
  72. {django_forms_workflows-0.19.2 → django_forms_workflows-0.20.0}/django_forms_workflows/migrations/0029_formfield_workflow_stage_fk_drop_groupconfig.py +0 -0
  73. {django_forms_workflows-0.19.2 → django_forms_workflows-0.20.0}/django_forms_workflows/migrations/0030_formfield_phone_type.py +0 -0
  74. {django_forms_workflows-0.19.2 → django_forms_workflows-0.20.0}/django_forms_workflows/migrations/0031_sub_workflows.py +0 -0
  75. {django_forms_workflows-0.19.2 → django_forms_workflows-0.20.0}/django_forms_workflows/migrations/0032_approved_pending_detached_sub_workflow.py +0 -0
  76. {django_forms_workflows-0.19.2 → django_forms_workflows-0.20.0}/django_forms_workflows/migrations/0033_add_reject_parent_to_subworkflowdefinition.py +0 -0
  77. {django_forms_workflows-0.19.2 → django_forms_workflows-0.20.0}/django_forms_workflows/migrations/0034_add_notificationlog.py +0 -0
  78. {django_forms_workflows-0.19.2 → django_forms_workflows-0.20.0}/django_forms_workflows/migrations/0035_migrate_prefill_source_strings.py +0 -0
  79. {django_forms_workflows-0.19.2 → django_forms_workflows-0.20.0}/django_forms_workflows/migrations/0036_add_workflowstage_auto_created.py +0 -0
  80. {django_forms_workflows-0.19.2 → django_forms_workflows-0.20.0}/django_forms_workflows/migrations/0037_migrate_flat_workflows_to_staged.py +0 -0
  81. {django_forms_workflows-0.19.2 → django_forms_workflows-0.20.0}/django_forms_workflows/migrations/0038_remove_legacy_prefill_source_and_approval_step.py +0 -0
  82. {django_forms_workflows-0.19.2 → django_forms_workflows-0.20.0}/django_forms_workflows/migrations/0039_update_help_text.py +0 -0
  83. {django_forms_workflows-0.19.2 → django_forms_workflows-0.20.0}/django_forms_workflows/migrations/0040_migrate_deprecated_features.py +0 -0
  84. {django_forms_workflows-0.19.2 → django_forms_workflows-0.20.0}/django_forms_workflows/migrations/0041_remove_deprecated_fields.py +0 -0
  85. {django_forms_workflows-0.19.2 → django_forms_workflows-0.20.0}/django_forms_workflows/migrations/__init__.py +0 -0
  86. {django_forms_workflows-0.19.2 → django_forms_workflows-0.20.0}/django_forms_workflows/signals.py +0 -0
  87. {django_forms_workflows-0.19.2 → django_forms_workflows-0.20.0}/django_forms_workflows/sso_backends.py +0 -0
  88. {django_forms_workflows-0.19.2 → django_forms_workflows-0.20.0}/django_forms_workflows/sso_urls.py +0 -0
  89. {django_forms_workflows-0.19.2 → django_forms_workflows-0.20.0}/django_forms_workflows/sso_views.py +0 -0
  90. {django_forms_workflows-0.19.2 → django_forms_workflows-0.20.0}/django_forms_workflows/static/django_forms_workflows/js/form-builder.js +0 -0
  91. {django_forms_workflows-0.19.2 → django_forms_workflows-0.20.0}/django_forms_workflows/static/django_forms_workflows/js/form-enhancements.js +0 -0
  92. {django_forms_workflows-0.19.2 → django_forms_workflows-0.20.0}/django_forms_workflows/sync_views.py +0 -0
  93. {django_forms_workflows-0.19.2 → django_forms_workflows-0.20.0}/django_forms_workflows/tasks.py +0 -0
  94. {django_forms_workflows-0.19.2 → django_forms_workflows-0.20.0}/django_forms_workflows/templates/admin/django_forms_workflows/form_builder.html +0 -0
  95. {django_forms_workflows-0.19.2 → django_forms_workflows-0.20.0}/django_forms_workflows/templates/admin/django_forms_workflows/formdef_change_form.html +0 -0
  96. {django_forms_workflows-0.19.2 → django_forms_workflows-0.20.0}/django_forms_workflows/templates/admin/django_forms_workflows/formdefinition/change_list.html +0 -0
  97. {django_forms_workflows-0.19.2 → django_forms_workflows-0.20.0}/django_forms_workflows/templates/admin/django_forms_workflows/sync_import.html +0 -0
  98. {django_forms_workflows-0.19.2 → django_forms_workflows-0.20.0}/django_forms_workflows/templates/admin/django_forms_workflows/sync_pull.html +0 -0
  99. {django_forms_workflows-0.19.2 → django_forms_workflows-0.20.0}/django_forms_workflows/templates/admin/django_forms_workflows/sync_push.html +0 -0
  100. {django_forms_workflows-0.19.2 → django_forms_workflows-0.20.0}/django_forms_workflows/templates/admin/django_forms_workflows/workflow_builder.html +0 -0
  101. {django_forms_workflows-0.19.2 → django_forms_workflows-0.20.0}/django_forms_workflows/templates/django_forms_workflows/_category_node.html +0 -0
  102. {django_forms_workflows-0.19.2 → django_forms_workflows-0.20.0}/django_forms_workflows/templates/django_forms_workflows/approval_inbox.html +0 -0
  103. {django_forms_workflows-0.19.2 → django_forms_workflows-0.20.0}/django_forms_workflows/templates/django_forms_workflows/approve.html +0 -0
  104. {django_forms_workflows-0.19.2 → django_forms_workflows-0.20.0}/django_forms_workflows/templates/django_forms_workflows/base.html +0 -0
  105. {django_forms_workflows-0.19.2 → django_forms_workflows-0.20.0}/django_forms_workflows/templates/django_forms_workflows/completed_approvals.html +0 -0
  106. {django_forms_workflows-0.19.2 → django_forms_workflows-0.20.0}/django_forms_workflows/templates/django_forms_workflows/form_categories.html +0 -0
  107. {django_forms_workflows-0.19.2 → django_forms_workflows-0.20.0}/django_forms_workflows/templates/django_forms_workflows/form_list.html +0 -0
  108. {django_forms_workflows-0.19.2 → django_forms_workflows-0.20.0}/django_forms_workflows/templates/django_forms_workflows/form_submit.html +0 -0
  109. {django_forms_workflows-0.19.2 → django_forms_workflows-0.20.0}/django_forms_workflows/templates/django_forms_workflows/my_submissions.html +0 -0
  110. {django_forms_workflows-0.19.2 → django_forms_workflows-0.20.0}/django_forms_workflows/templates/django_forms_workflows/resubmit_confirm.html +0 -0
  111. {django_forms_workflows-0.19.2 → django_forms_workflows-0.20.0}/django_forms_workflows/templates/django_forms_workflows/sso/login.html +0 -0
  112. {django_forms_workflows-0.19.2 → django_forms_workflows-0.20.0}/django_forms_workflows/templates/django_forms_workflows/sub_workflow_detail.html +0 -0
  113. {django_forms_workflows-0.19.2 → django_forms_workflows-0.20.0}/django_forms_workflows/templates/django_forms_workflows/submission_bulk_pdf.html +0 -0
  114. {django_forms_workflows-0.19.2 → django_forms_workflows-0.20.0}/django_forms_workflows/templates/django_forms_workflows/submission_pdf.html +0 -0
  115. {django_forms_workflows-0.19.2 → django_forms_workflows-0.20.0}/django_forms_workflows/templates/django_forms_workflows/withdraw_confirm.html +0 -0
  116. {django_forms_workflows-0.19.2 → django_forms_workflows-0.20.0}/django_forms_workflows/templates/emails/approval_notification.html +0 -0
  117. {django_forms_workflows-0.19.2 → django_forms_workflows-0.20.0}/django_forms_workflows/templates/emails/approval_reminder.html +0 -0
  118. {django_forms_workflows-0.19.2 → django_forms_workflows-0.20.0}/django_forms_workflows/templates/emails/approval_request.html +0 -0
  119. {django_forms_workflows-0.19.2 → django_forms_workflows-0.20.0}/django_forms_workflows/templates/emails/email_styles.html +0 -0
  120. {django_forms_workflows-0.19.2 → django_forms_workflows-0.20.0}/django_forms_workflows/templates/emails/escalation_notification.html +0 -0
  121. {django_forms_workflows-0.19.2 → django_forms_workflows-0.20.0}/django_forms_workflows/templates/emails/notification_digest.html +0 -0
  122. {django_forms_workflows-0.19.2 → django_forms_workflows-0.20.0}/django_forms_workflows/templates/emails/rejection_notification.html +0 -0
  123. {django_forms_workflows-0.19.2 → django_forms_workflows-0.20.0}/django_forms_workflows/templates/emails/submission_notification.html +0 -0
  124. {django_forms_workflows-0.19.2 → django_forms_workflows-0.20.0}/django_forms_workflows/templates/registration/login.html +0 -0
  125. {django_forms_workflows-0.19.2 → django_forms_workflows-0.20.0}/django_forms_workflows/templatetags/__init__.py +0 -0
  126. {django_forms_workflows-0.19.2 → django_forms_workflows-0.20.0}/django_forms_workflows/templatetags/forms_workflows_tags.py +0 -0
  127. {django_forms_workflows-0.19.2 → django_forms_workflows-0.20.0}/django_forms_workflows/urls.py +0 -0
  128. {django_forms_workflows-0.19.2 → django_forms_workflows-0.20.0}/django_forms_workflows/utils.py +0 -0
  129. {django_forms_workflows-0.19.2 → django_forms_workflows-0.20.0}/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.19.2
3
+ Version: 0.20.0
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
@@ -0,0 +1,22 @@
1
+ # Generated by Django 5.2.7 on 2026-03-12 20:16
2
+
3
+ from django.db import migrations, models
4
+
5
+
6
+ class Migration(migrations.Migration):
7
+
8
+ dependencies = [
9
+ ("django_forms_workflows", "0041_remove_deprecated_fields"),
10
+ ]
11
+
12
+ operations = [
13
+ migrations.AddField(
14
+ model_name="subworkflowdefinition",
15
+ name="section_label",
16
+ field=models.CharField(
17
+ blank=True,
18
+ help_text="Heading shown to end users in the approval history (e.g. 'Payment Approvals'). If blank, defaults to the sub-workflow form name.",
19
+ max_length=100,
20
+ ),
21
+ ),
22
+ ]
@@ -2126,6 +2126,12 @@ class SubWorkflowDefinition(models.Model):
2126
2126
  max_length=100,
2127
2127
  help_text="Form field name whose integer value determines how many sub-workflows to spawn (e.g. 'number_of_payments')",
2128
2128
  )
2129
+ section_label = models.CharField(
2130
+ max_length=100,
2131
+ blank=True,
2132
+ help_text="Heading shown to end users in the approval history (e.g. 'Payment Approvals'). "
2133
+ "If blank, defaults to the sub-workflow form name.",
2134
+ )
2129
2135
  label_template = models.CharField(
2130
2136
  max_length=100,
2131
2137
  default="Sub-workflow {index}",
@@ -378,6 +378,7 @@ class WorkflowBuilder {
378
378
  sub_workflow_def_id: null,
379
379
  sub_workflow_id: null,
380
380
  sub_workflow_name: '',
381
+ section_label: '',
381
382
  count_field: '',
382
383
  label_template: 'Sub-workflow {index}',
383
384
  trigger: 'on_approval',
@@ -957,6 +958,15 @@ class WorkflowBuilder {
957
958
  <small class="text-muted">The workflow definition used for each sub-workflow instance</small>
958
959
  </div>
959
960
 
961
+ <div class="mb-3">
962
+ <label class="form-label"><strong>Section Label</strong></label>
963
+ <input type="text" class="form-control" name="section_label"
964
+ value="${this.escapeHtml(data.section_label || '')}"
965
+ placeholder="e.g. Payment Approvals"
966
+ onchange="workflowBuilder.updateSubWorkflowConfig('${node.id}')" />
967
+ <small class="text-muted">Heading shown to end users in approval history. If blank, uses the workflow name.</small>
968
+ </div>
969
+
960
970
  <div class="mb-3">
961
971
  <label class="form-label"><strong>Count Field</strong></label>
962
972
  <select class="form-select" name="count_field"
@@ -1027,6 +1037,7 @@ class WorkflowBuilder {
1027
1037
  const selectedOption = subWfSelect.selectedOptions[0];
1028
1038
  node.data.sub_workflow_name = selectedOption && selectedOption.value ? selectedOption.text : '';
1029
1039
 
1040
+ node.data.section_label = container.querySelector('input[name="section_label"]').value;
1030
1041
  node.data.count_field = container.querySelector('select[name="count_field"]').value;
1031
1042
  node.data.label_template = container.querySelector('input[name="label_template"]').value;
1032
1043
  node.data.trigger = container.querySelector('select[name="trigger"]').value;
@@ -241,6 +241,7 @@ def _serialize_sub_workflow_config(swc):
241
241
  return None
242
242
  return {
243
243
  "sub_workflow_form_slug": swc.sub_workflow.form_definition.slug,
244
+ "section_label": swc.section_label,
244
245
  "count_field": swc.count_field,
245
246
  "label_template": swc.label_template,
246
247
  "trigger": swc.trigger,
@@ -586,6 +587,7 @@ def import_form(form_data, conflict="update", category_cache=None):
586
587
  parent_workflow=wf,
587
588
  defaults={
588
589
  "sub_workflow": sub_wf_form.workflow,
590
+ "section_label": sub_wf_data.get("section_label", ""),
589
591
  "count_field": sub_wf_data.get("count_field", ""),
590
592
  "label_template": sub_wf_data.get(
591
593
  "label_template", "Sub-workflow {index}"
@@ -242,9 +242,11 @@
242
242
  {% endfor %}
243
243
 
244
244
  {% if sub_workflow_groups %}
245
- {# ---- Sub-workflow tasks (detached child workflow stages) ---- #}
246
- <h5 class="mb-3 mt-4"><i class="bi bi-diagram-2"></i> Sub-Workflow Approvals</h5>
245
+ {# ---- Sub-workflow tasks ---- #}
247
246
  {% for stage in sub_workflow_groups %}
247
+ {% if forloop.first %}
248
+ <h5 class="mb-3 mt-4"><i class="bi bi-list-check"></i> {{ stage.section_label|default:"Additional Approvals" }}</h5>
249
+ {% endif %}
248
250
  <div class="card mb-3
249
251
  {% if stage.rejected_count > 0 %}border-danger
250
252
  {% elif stage.approved_count == stage.total_count and stage.total_count > 0 %}border-success
@@ -593,6 +593,17 @@ def submission_detail(request, submission_id):
593
593
  stage_groups = sorted(parent_groups.values(), key=lambda x: x["number"])
594
594
  if sub_groups:
595
595
  sub_workflow_groups = sorted(sub_groups.values(), key=lambda x: x["number"])
596
+ # Resolve the user-facing section label from SubWorkflowDefinition
597
+ if workflow:
598
+ sub_wf_config = getattr(workflow, "sub_workflow_config", None)
599
+ if sub_wf_config and sub_wf_config.section_label:
600
+ for sg in sub_workflow_groups:
601
+ sg["section_label"] = sub_wf_config.section_label
602
+ elif sub_wf_config:
603
+ # Fall back to the sub-workflow's form definition name
604
+ sg_name = sub_wf_config.sub_workflow.form_definition.name
605
+ for sg in sub_workflow_groups:
606
+ sg["section_label"] = sg_name
596
607
 
597
608
  # Resolve fresh presigned URLs for any file-upload fields
598
609
  form_data = _resolve_form_data_urls(submission.form_data)
@@ -450,6 +450,7 @@ def convert_workflow_to_visual(workflow, form_definition):
450
450
  "sub_workflow_def_id": sub_wf_config.id,
451
451
  "sub_workflow_id": sub_wf.form_definition_id,
452
452
  "sub_workflow_name": sub_wf.form_definition.name,
453
+ "section_label": sub_wf_config.section_label,
453
454
  "count_field": sub_wf_config.count_field,
454
455
  "label_template": sub_wf_config.label_template,
455
456
  "trigger": sub_wf_config.trigger,
@@ -670,6 +671,7 @@ def convert_visual_to_workflow(workflow_data, form_definition):
670
671
  if target_workflow:
671
672
  sw_fields = {
672
673
  "sub_workflow": target_workflow,
674
+ "section_label": sw_data.get("section_label", ""),
673
675
  "count_field": sw_data.get("count_field", ""),
674
676
  "label_template": sw_data.get(
675
677
  "label_template", "Sub-workflow {index}"
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "django-forms-workflows"
3
- version = "0.19.2"
3
+ version = "0.20.0"
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"