django-forms-workflows 0.23.2__tar.gz → 0.24.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 (134) hide show
  1. {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/PKG-INFO +1 -1
  2. {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/admin.py +47 -0
  3. {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/form_builder_views.py +53 -1
  4. django_forms_workflows-0.24.0/django_forms_workflows/migrations/0047_add_hide_approval_history.py +21 -0
  5. {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/models.py +10 -0
  6. {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/templates/django_forms_workflows/submission_detail.html +35 -3
  7. {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/views.py +13 -0
  8. {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/pyproject.toml +1 -1
  9. {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/CHANGELOG.md +0 -0
  10. {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/LICENSE +0 -0
  11. {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/README.md +0 -0
  12. {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/__init__.py +0 -0
  13. {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/apps.py +0 -0
  14. {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/context_processors.py +0 -0
  15. {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/data_sources/__init__.py +0 -0
  16. {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/data_sources/base.py +0 -0
  17. {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/data_sources/database_source.py +0 -0
  18. {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/data_sources/ldap_source.py +0 -0
  19. {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/data_sources/user_source.py +0 -0
  20. {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/email_backends/__init__.py +0 -0
  21. {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/email_backends/gmail_api.py +0 -0
  22. {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/form_builder_urls.py +0 -0
  23. {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/forms.py +0 -0
  24. {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/handlers/__init__.py +0 -0
  25. {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/handlers/api_handler.py +0 -0
  26. {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/handlers/base.py +0 -0
  27. {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/handlers/database_handler.py +0 -0
  28. {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/handlers/email_handler.py +0 -0
  29. {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/handlers/executor.py +0 -0
  30. {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/handlers/file_handler.py +0 -0
  31. {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/handlers/ldap_handler.py +0 -0
  32. {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/ldap_backend.py +0 -0
  33. {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/management/commands/create_default_templates.py +0 -0
  34. {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/management/commands/pull_forms.py +0 -0
  35. {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/management/commands/push_forms.py +0 -0
  36. {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/management/commands/seed_farm_demo.py +0 -0
  37. {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/management/commands/seed_pcn_form.py +0 -0
  38. {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/management/commands/seed_prefill_sources.py +0 -0
  39. {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/management/commands/sync_ldap_profiles.py +0 -0
  40. {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/management/commands/test_db_connection.py +0 -0
  41. {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/migrations/0001_initial.py +0 -0
  42. {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/migrations/0002_prefillsource_alter_formfield_prefill_source_and_more.py +0 -0
  43. {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/migrations/0003_postsubmissionaction.py +0 -0
  44. {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/migrations/0004_formtemplate.py +0 -0
  45. {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/migrations/0005_advanced_conditional_logic.py +0 -0
  46. {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/migrations/0006_workflowdefinition_visual_workflow_data_and_more.py +0 -0
  47. {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/migrations/0007_add_userprofile_ldap_enhancements.py +0 -0
  48. {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/migrations/0008_add_file_workflow_models.py +0 -0
  49. {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/migrations/0009_add_formfield_readonly.py +0 -0
  50. {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/migrations/0010_add_prefillsource_template_fields.py +0 -0
  51. {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/migrations/0011_postsubmissionaction_email_body_template_and_more.py +0 -0
  52. {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/migrations/0012_add_approval_step_fields.py +0 -0
  53. {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/migrations/0013_add_database_query_key.py +0 -0
  54. {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/migrations/0014_add_form_category.py +0 -0
  55. {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/migrations/0015_add_workflowstage_staged_approvals.py +0 -0
  56. {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/migrations/0016_add_pdf_generation.py +0 -0
  57. {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/migrations/0017_add_notification_batching.py +0 -0
  58. {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/migrations/0018_add_form_category_parent.py +0 -0
  59. {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/migrations/0019_add_ldap_group_profile.py +0 -0
  60. {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/migrations/0020_add_bulk_export_field.py +0 -0
  61. {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/migrations/0021_alter_pendingnotification_scheduled_for_and_more.py +0 -0
  62. {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/migrations/0022_add_bulk_pdf_export.py +0 -0
  63. {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/migrations/0023_add_performance_indexes.py +0 -0
  64. {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/migrations/0024_add_allow_resubmit.py +0 -0
  65. {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/migrations/0025_workflowstage_approve_label.py +0 -0
  66. {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/migrations/0026_alter_formfield_width.py +0 -0
  67. {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/migrations/0027_formsubmission_form_data_gin.py +0 -0
  68. {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/migrations/0028_workflowstagegroupconfig.py +0 -0
  69. {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/migrations/0029_formfield_workflow_stage_fk_drop_groupconfig.py +0 -0
  70. {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/migrations/0030_formfield_phone_type.py +0 -0
  71. {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/migrations/0031_sub_workflows.py +0 -0
  72. {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/migrations/0032_approved_pending_detached_sub_workflow.py +0 -0
  73. {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/migrations/0033_add_reject_parent_to_subworkflowdefinition.py +0 -0
  74. {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/migrations/0034_add_notificationlog.py +0 -0
  75. {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/migrations/0035_migrate_prefill_source_strings.py +0 -0
  76. {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/migrations/0036_add_workflowstage_auto_created.py +0 -0
  77. {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/migrations/0037_migrate_flat_workflows_to_staged.py +0 -0
  78. {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/migrations/0038_remove_legacy_prefill_source_and_approval_step.py +0 -0
  79. {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/migrations/0039_update_help_text.py +0 -0
  80. {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/migrations/0040_migrate_deprecated_features.py +0 -0
  81. {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/migrations/0041_remove_deprecated_fields.py +0 -0
  82. {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/migrations/0042_add_sub_workflow_section_label.py +0 -0
  83. {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/migrations/0043_fix_form_data_decimal_encoding.py +0 -0
  84. {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/migrations/0044_remove_subworkflowinstance_label.py +0 -0
  85. {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/migrations/0045_stageapprovalgroup_workflow_name_label.py +0 -0
  86. {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/migrations/0046_workflow_definition_one_to_many.py +0 -0
  87. {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/migrations/__init__.py +0 -0
  88. {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/signals.py +0 -0
  89. {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/sso_backends.py +0 -0
  90. {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/sso_urls.py +0 -0
  91. {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/sso_views.py +0 -0
  92. {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/static/django_forms_workflows/js/form-builder.js +0 -0
  93. {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/static/django_forms_workflows/js/form-enhancements.js +0 -0
  94. {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/static/django_forms_workflows/js/workflow-builder.js +0 -0
  95. {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/sync_api.py +0 -0
  96. {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/sync_views.py +0 -0
  97. {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/tasks.py +0 -0
  98. {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/templates/admin/django_forms_workflows/form_builder.html +0 -0
  99. {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/templates/admin/django_forms_workflows/formdef_change_form.html +0 -0
  100. {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/templates/admin/django_forms_workflows/formdefinition/change_list.html +0 -0
  101. {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/templates/admin/django_forms_workflows/sync_import.html +0 -0
  102. {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/templates/admin/django_forms_workflows/sync_pull.html +0 -0
  103. {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/templates/admin/django_forms_workflows/sync_push.html +0 -0
  104. {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/templates/admin/django_forms_workflows/workflow_builder.html +0 -0
  105. {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/templates/django_forms_workflows/_category_node.html +0 -0
  106. {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/templates/django_forms_workflows/approval_inbox.html +0 -0
  107. {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/templates/django_forms_workflows/approve.html +0 -0
  108. {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/templates/django_forms_workflows/base.html +0 -0
  109. {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/templates/django_forms_workflows/completed_approvals.html +0 -0
  110. {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/templates/django_forms_workflows/form_categories.html +0 -0
  111. {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/templates/django_forms_workflows/form_list.html +0 -0
  112. {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/templates/django_forms_workflows/form_submit.html +0 -0
  113. {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/templates/django_forms_workflows/my_submissions.html +0 -0
  114. {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/templates/django_forms_workflows/resubmit_confirm.html +0 -0
  115. {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/templates/django_forms_workflows/sso/login.html +0 -0
  116. {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/templates/django_forms_workflows/sub_workflow_detail.html +0 -0
  117. {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/templates/django_forms_workflows/submission_bulk_pdf.html +0 -0
  118. {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/templates/django_forms_workflows/submission_pdf.html +0 -0
  119. {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/templates/django_forms_workflows/withdraw_confirm.html +0 -0
  120. {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/templates/emails/approval_notification.html +0 -0
  121. {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/templates/emails/approval_reminder.html +0 -0
  122. {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/templates/emails/approval_request.html +0 -0
  123. {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/templates/emails/email_styles.html +0 -0
  124. {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/templates/emails/escalation_notification.html +0 -0
  125. {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/templates/emails/notification_digest.html +0 -0
  126. {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/templates/emails/rejection_notification.html +0 -0
  127. {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/templates/emails/submission_notification.html +0 -0
  128. {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/templates/registration/login.html +0 -0
  129. {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/templatetags/__init__.py +0 -0
  130. {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/templatetags/forms_workflows_tags.py +0 -0
  131. {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/urls.py +0 -0
  132. {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/utils.py +0 -0
  133. {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/workflow_builder_views.py +0 -0
  134. {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.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.23.2
3
+ Version: 0.24.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
@@ -278,6 +278,7 @@ class WorkflowDefinitionInline(admin.StackedInline):
278
278
  fields = [
279
279
  "name_label",
280
280
  "requires_approval",
281
+ "hide_approval_history",
281
282
  ("notify_on_submission", "notify_on_approval", "notify_on_rejection"),
282
283
  "additional_notify_emails",
283
284
  ("allow_bulk_export", "allow_bulk_pdf_export"),
@@ -504,6 +505,52 @@ class FormDefinitionAdmin(admin.ModelAdmin):
504
505
  cloned_form.view_groups.set(form.view_groups.all())
505
506
  cloned_form.admin_groups.set(form.admin_groups.all())
506
507
 
508
+ # Clone workflows, stages, and stage approval groups
509
+ for wf in form.workflows.all():
510
+ original_stages = list(
511
+ wf.stages.prefetch_related("approval_groups").order_by(
512
+ "order"
513
+ )
514
+ )
515
+ cloned_wf = WorkflowDefinition.objects.create(
516
+ form_definition=cloned_form,
517
+ name_label=wf.name_label,
518
+ requires_approval=wf.requires_approval,
519
+ approval_deadline_days=wf.approval_deadline_days,
520
+ send_reminder_after_days=wf.send_reminder_after_days,
521
+ auto_approve_after_days=wf.auto_approve_after_days,
522
+ notify_on_submission=wf.notify_on_submission,
523
+ notify_on_approval=wf.notify_on_approval,
524
+ notify_on_rejection=wf.notify_on_rejection,
525
+ notify_on_withdrawal=wf.notify_on_withdrawal,
526
+ additional_notify_emails=wf.additional_notify_emails,
527
+ notification_cadence=wf.notification_cadence,
528
+ notification_cadence_day=wf.notification_cadence_day,
529
+ notification_cadence_time=wf.notification_cadence_time,
530
+ notification_cadence_form_field=wf.notification_cadence_form_field,
531
+ visual_workflow_data=wf.visual_workflow_data,
532
+ hide_approval_history=wf.hide_approval_history,
533
+ allow_bulk_export=wf.allow_bulk_export,
534
+ allow_bulk_pdf_export=wf.allow_bulk_pdf_export,
535
+ )
536
+ for stage in original_stages:
537
+ cloned_stage = WorkflowStage.objects.create(
538
+ workflow=cloned_wf,
539
+ name=stage.name,
540
+ order=stage.order,
541
+ approval_logic=stage.approval_logic,
542
+ requires_manager_approval=stage.requires_manager_approval,
543
+ approve_label=stage.approve_label,
544
+ )
545
+ for sag in StageApprovalGroup.objects.filter(
546
+ stage=stage
547
+ ).order_by("position"):
548
+ StageApprovalGroup.objects.create(
549
+ stage=cloned_stage,
550
+ group=sag.group,
551
+ position=sag.position,
552
+ )
553
+
507
554
  cloned_count += 1
508
555
  except Exception as e:
509
556
  self.message_user(
@@ -15,7 +15,15 @@ from django.http import JsonResponse
15
15
  from django.shortcuts import get_object_or_404, render
16
16
  from django.views.decorators.http import require_GET, require_POST
17
17
 
18
- from .models import FormDefinition, FormField, FormTemplate, PrefillSource
18
+ from .models import (
19
+ FormDefinition,
20
+ FormField,
21
+ FormTemplate,
22
+ PrefillSource,
23
+ StageApprovalGroup,
24
+ WorkflowDefinition,
25
+ WorkflowStage,
26
+ )
19
27
 
20
28
  logger = logging.getLogger(__name__)
21
29
 
@@ -143,6 +151,50 @@ def form_builder_clone(request, form_id):
143
151
  cloned_form.view_groups.set(original_form.view_groups.all())
144
152
  cloned_form.admin_groups.set(original_form.admin_groups.all())
145
153
 
154
+ # Clone workflows, stages, and stage approval groups
155
+ for wf in original_form.workflows.all():
156
+ original_stages = list(
157
+ wf.stages.prefetch_related("approval_groups").order_by("order")
158
+ )
159
+ cloned_wf = WorkflowDefinition.objects.create(
160
+ form_definition=cloned_form,
161
+ name_label=wf.name_label,
162
+ requires_approval=wf.requires_approval,
163
+ approval_deadline_days=wf.approval_deadline_days,
164
+ send_reminder_after_days=wf.send_reminder_after_days,
165
+ auto_approve_after_days=wf.auto_approve_after_days,
166
+ notify_on_submission=wf.notify_on_submission,
167
+ notify_on_approval=wf.notify_on_approval,
168
+ notify_on_rejection=wf.notify_on_rejection,
169
+ notify_on_withdrawal=wf.notify_on_withdrawal,
170
+ additional_notify_emails=wf.additional_notify_emails,
171
+ notification_cadence=wf.notification_cadence,
172
+ notification_cadence_day=wf.notification_cadence_day,
173
+ notification_cadence_time=wf.notification_cadence_time,
174
+ notification_cadence_form_field=wf.notification_cadence_form_field,
175
+ visual_workflow_data=wf.visual_workflow_data,
176
+ hide_approval_history=wf.hide_approval_history,
177
+ allow_bulk_export=wf.allow_bulk_export,
178
+ allow_bulk_pdf_export=wf.allow_bulk_pdf_export,
179
+ )
180
+ for stage in original_stages:
181
+ cloned_stage = WorkflowStage.objects.create(
182
+ workflow=cloned_wf,
183
+ name=stage.name,
184
+ order=stage.order,
185
+ approval_logic=stage.approval_logic,
186
+ requires_manager_approval=stage.requires_manager_approval,
187
+ approve_label=stage.approve_label,
188
+ )
189
+ for sag in StageApprovalGroup.objects.filter(stage=stage).order_by(
190
+ "position"
191
+ ):
192
+ StageApprovalGroup.objects.create(
193
+ stage=cloned_stage,
194
+ group=sag.group,
195
+ position=sag.position,
196
+ )
197
+
146
198
  return JsonResponse(
147
199
  {
148
200
  "success": True,
@@ -0,0 +1,21 @@
1
+ # Generated by Django 6.0.2 on 2026-03-13 19:12
2
+
3
+ from django.db import migrations, models
4
+
5
+
6
+ class Migration(migrations.Migration):
7
+
8
+ dependencies = [
9
+ ("django_forms_workflows", "0046_workflow_definition_one_to_many"),
10
+ ]
11
+
12
+ operations = [
13
+ migrations.AddField(
14
+ model_name="workflowdefinition",
15
+ name="hide_approval_history",
16
+ field=models.BooleanField(
17
+ default=False,
18
+ help_text="When enabled, the submitter will not see approval history or individual approval steps — only the final decision (approved / rejected) is shown. Approvers and admins can still see the full history.",
19
+ ),
20
+ ),
21
+ ]
@@ -651,6 +651,16 @@ class WorkflowDefinition(models.Model):
651
651
  help_text="Visual workflow builder layout (nodes and connections)",
652
652
  )
653
653
 
654
+ # Privacy
655
+ hide_approval_history = models.BooleanField(
656
+ default=False,
657
+ help_text=(
658
+ "When enabled, the submitter will not see approval history or "
659
+ "individual approval steps — only the final decision (approved / rejected) "
660
+ "is shown. Approvers and admins can still see the full history."
661
+ ),
662
+ )
663
+
654
664
  # Bulk Export
655
665
  allow_bulk_export = models.BooleanField(
656
666
  default=False,
@@ -167,9 +167,41 @@
167
167
  <!-- Approval History -->
168
168
  {% if approval_tasks %}
169
169
 
170
- {% if stage_groups %}
170
+ {% if hide_approval_history %}
171
+ {# ---- Privacy mode: submitter sees only the final decision ---- #}
172
+ <h5 class="mb-3"><i class="bi bi-shield-lock"></i> Approval Status</h5>
173
+ <div class="card mb-4
174
+ {% if submission.status == 'approved' %}border-success
175
+ {% elif submission.status == 'rejected' %}border-danger
176
+ {% else %}border-warning{% endif %}">
177
+ <div class="card-body text-center py-4">
178
+ {% if submission.status == 'approved' %}
179
+ <span class="badge bg-success fs-5 px-4 py-2">Approved</span>
180
+ {% if submission.completed_at %}
181
+ <p class="text-muted mt-2 mb-0">Decision made on {{ submission.completed_at|date:"F d, Y g:i A" }}</p>
182
+ {% endif %}
183
+ {% elif submission.status == 'rejected' %}
184
+ <span class="badge bg-danger fs-5 px-4 py-2">Rejected</span>
185
+ {% if submission.completed_at %}
186
+ <p class="text-muted mt-2 mb-0">Decision made on {{ submission.completed_at|date:"F d, Y g:i A" }}</p>
187
+ {% endif %}
188
+ {% for task in approval_tasks %}
189
+ {% if task.status == 'rejected' and task.comments %}
190
+ <div class="alert alert-danger mt-3 mb-0 text-start">
191
+ <strong>Reason:</strong> {{ task.comments }}
192
+ </div>
193
+ {% endif %}
194
+ {% endfor %}
195
+ {% else %}
196
+ <span class="badge bg-warning text-dark fs-5 px-4 py-2">Under Review</span>
197
+ <p class="text-muted mt-2 mb-0">Your submission is being reviewed. You will be notified when a decision is made.</p>
198
+ {% endif %}
199
+ </div>
200
+ </div>
201
+
202
+ {% elif stage_groups %}
171
203
  {# ---- Staged workflow: one card per stage ---- #}
172
- <h5 class="mb-3"><i class="bi bi-diagram-3"></i> {% if workflow_name_label %}{{ workflow_name_label }}{% else %}Approval History{% endif %}</h5>
204
+ <h5 class="mb-3"><i class="bi bi-diagram-3"></i> Approval History</h5>
173
205
  {% for stage in stage_groups %}
174
206
  <div class="card mb-3
175
207
  {% if stage.rejected_count > 0 %}border-danger
@@ -182,7 +214,7 @@
182
214
  {% elif stage.approved_count > 0 %}bg-primary text-white
183
215
  {% else %}bg-light text-muted{% endif %}">
184
216
  <span>
185
- <strong>Stage {{ stage.number }}{% if not stage.has_multiple_stages %}: {{ stage.name }}{% endif %}</strong>
217
+ <strong>{% if workflow_name_label %}{{ workflow_name_label }}{% else %}Stage {{ stage.number }}{% if not stage.has_multiple_stages %}: {{ stage.name }}{% endif %}{% endif %}</strong>
186
218
  </span>
187
219
  <span class="badge bg-white
188
220
  {% if stage.rejected_count > 0 %}text-danger
@@ -713,6 +713,18 @@ def submission_detail(request, submission_id):
713
713
  or request.user.groups.filter(id__in=form_def.admin_groups.all()).exists()
714
714
  )
715
715
 
716
+ # Privacy: hide approval history from the submitter when configured.
717
+ # Approvers and admins always see the full history.
718
+ is_submitter_only = (
719
+ submission.submitter == request.user
720
+ and not request.user.is_superuser
721
+ and not user_can_approve(request.user, submission)
722
+ and not request.user.groups.filter(id__in=form_def.admin_groups.all()).exists()
723
+ )
724
+ hide_approval_history = bool(
725
+ workflow and workflow.hide_approval_history and is_submitter_only
726
+ )
727
+
716
728
  return render(
717
729
  request,
718
730
  "django_forms_workflows/submission_detail.html",
@@ -730,6 +742,7 @@ def submission_detail(request, submission_id):
730
742
  "approval_field_names": approval_field_names,
731
743
  "approval_step_sections": approval_step_sections,
732
744
  "can_approve_pdf": can_approve_pdf,
745
+ "hide_approval_history": hide_approval_history,
733
746
  },
734
747
  )
735
748
 
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "django-forms-workflows"
3
- version = "0.23.2"
3
+ version = "0.24.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"