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.
- {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/PKG-INFO +1 -1
- {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/admin.py +47 -0
- {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/form_builder_views.py +53 -1
- django_forms_workflows-0.24.0/django_forms_workflows/migrations/0047_add_hide_approval_history.py +21 -0
- {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/models.py +10 -0
- {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/templates/django_forms_workflows/submission_detail.html +35 -3
- {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/views.py +13 -0
- {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/pyproject.toml +1 -1
- {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/CHANGELOG.md +0 -0
- {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/LICENSE +0 -0
- {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/README.md +0 -0
- {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/__init__.py +0 -0
- {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/apps.py +0 -0
- {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/context_processors.py +0 -0
- {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/data_sources/__init__.py +0 -0
- {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/data_sources/base.py +0 -0
- {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/data_sources/database_source.py +0 -0
- {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/data_sources/ldap_source.py +0 -0
- {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/data_sources/user_source.py +0 -0
- {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/email_backends/__init__.py +0 -0
- {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/email_backends/gmail_api.py +0 -0
- {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/form_builder_urls.py +0 -0
- {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/forms.py +0 -0
- {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/handlers/__init__.py +0 -0
- {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/handlers/api_handler.py +0 -0
- {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/handlers/base.py +0 -0
- {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/handlers/database_handler.py +0 -0
- {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/handlers/email_handler.py +0 -0
- {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/handlers/executor.py +0 -0
- {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/handlers/file_handler.py +0 -0
- {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/handlers/ldap_handler.py +0 -0
- {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/ldap_backend.py +0 -0
- {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/management/commands/create_default_templates.py +0 -0
- {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/management/commands/pull_forms.py +0 -0
- {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/management/commands/push_forms.py +0 -0
- {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/management/commands/seed_farm_demo.py +0 -0
- {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/management/commands/seed_pcn_form.py +0 -0
- {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/management/commands/seed_prefill_sources.py +0 -0
- {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/management/commands/sync_ldap_profiles.py +0 -0
- {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/management/commands/test_db_connection.py +0 -0
- {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/migrations/0001_initial.py +0 -0
- {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
- {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/migrations/0003_postsubmissionaction.py +0 -0
- {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/migrations/0004_formtemplate.py +0 -0
- {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/migrations/0005_advanced_conditional_logic.py +0 -0
- {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
- {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/migrations/0007_add_userprofile_ldap_enhancements.py +0 -0
- {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/migrations/0008_add_file_workflow_models.py +0 -0
- {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/migrations/0009_add_formfield_readonly.py +0 -0
- {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/migrations/0010_add_prefillsource_template_fields.py +0 -0
- {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
- {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/migrations/0012_add_approval_step_fields.py +0 -0
- {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/migrations/0013_add_database_query_key.py +0 -0
- {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/migrations/0014_add_form_category.py +0 -0
- {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/migrations/0015_add_workflowstage_staged_approvals.py +0 -0
- {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/migrations/0016_add_pdf_generation.py +0 -0
- {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/migrations/0017_add_notification_batching.py +0 -0
- {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/migrations/0018_add_form_category_parent.py +0 -0
- {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/migrations/0019_add_ldap_group_profile.py +0 -0
- {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/migrations/0020_add_bulk_export_field.py +0 -0
- {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
- {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/migrations/0022_add_bulk_pdf_export.py +0 -0
- {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/migrations/0023_add_performance_indexes.py +0 -0
- {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/migrations/0024_add_allow_resubmit.py +0 -0
- {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/migrations/0025_workflowstage_approve_label.py +0 -0
- {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/migrations/0026_alter_formfield_width.py +0 -0
- {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/migrations/0027_formsubmission_form_data_gin.py +0 -0
- {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/migrations/0028_workflowstagegroupconfig.py +0 -0
- {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
- {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/migrations/0030_formfield_phone_type.py +0 -0
- {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/migrations/0031_sub_workflows.py +0 -0
- {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
- {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
- {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/migrations/0034_add_notificationlog.py +0 -0
- {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/migrations/0035_migrate_prefill_source_strings.py +0 -0
- {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/migrations/0036_add_workflowstage_auto_created.py +0 -0
- {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
- {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
- {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/migrations/0039_update_help_text.py +0 -0
- {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/migrations/0040_migrate_deprecated_features.py +0 -0
- {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/migrations/0041_remove_deprecated_fields.py +0 -0
- {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
- {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
- {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/migrations/0044_remove_subworkflowinstance_label.py +0 -0
- {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/migrations/0045_stageapprovalgroup_workflow_name_label.py +0 -0
- {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
- {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/migrations/__init__.py +0 -0
- {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/signals.py +0 -0
- {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/sso_backends.py +0 -0
- {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/sso_urls.py +0 -0
- {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/sso_views.py +0 -0
- {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
- {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
- {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
- {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/sync_api.py +0 -0
- {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/sync_views.py +0 -0
- {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/tasks.py +0 -0
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/templates/django_forms_workflows/_category_node.html +0 -0
- {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/templates/django_forms_workflows/approval_inbox.html +0 -0
- {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/templates/django_forms_workflows/approve.html +0 -0
- {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/templates/django_forms_workflows/base.html +0 -0
- {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/templates/django_forms_workflows/completed_approvals.html +0 -0
- {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/templates/django_forms_workflows/form_categories.html +0 -0
- {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/templates/django_forms_workflows/form_list.html +0 -0
- {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/templates/django_forms_workflows/form_submit.html +0 -0
- {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/templates/django_forms_workflows/my_submissions.html +0 -0
- {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/templates/django_forms_workflows/resubmit_confirm.html +0 -0
- {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/templates/django_forms_workflows/sso/login.html +0 -0
- {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
- {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
- {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/templates/django_forms_workflows/submission_pdf.html +0 -0
- {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/templates/django_forms_workflows/withdraw_confirm.html +0 -0
- {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/templates/emails/approval_notification.html +0 -0
- {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/templates/emails/approval_reminder.html +0 -0
- {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/templates/emails/approval_request.html +0 -0
- {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/templates/emails/email_styles.html +0 -0
- {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/templates/emails/escalation_notification.html +0 -0
- {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/templates/emails/notification_digest.html +0 -0
- {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/templates/emails/rejection_notification.html +0 -0
- {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/templates/emails/submission_notification.html +0 -0
- {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/templates/registration/login.html +0 -0
- {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/templatetags/__init__.py +0 -0
- {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/templatetags/forms_workflows_tags.py +0 -0
- {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/urls.py +0 -0
- {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/utils.py +0 -0
- {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/workflow_builder_views.py +0 -0
- {django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/workflow_engine.py +0 -0
{django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/admin.py
RENAMED
|
@@ -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
|
|
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,
|
django_forms_workflows-0.24.0/django_forms_workflows/migrations/0047_add_hide_approval_history.py
ADDED
|
@@ -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
|
+
]
|
{django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/models.py
RENAMED
|
@@ -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
|
|
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>
|
|
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
|
{django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/views.py
RENAMED
|
@@ -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
|
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/__init__.py
RENAMED
|
File without changes
|
{django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/apps.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/forms.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/signals.py
RENAMED
|
File without changes
|
|
File without changes
|
{django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/sso_urls.py
RENAMED
|
File without changes
|
{django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/sso_views.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/sync_api.py
RENAMED
|
File without changes
|
{django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/sync_views.py
RENAMED
|
File without changes
|
{django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/tasks.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/urls.py
RENAMED
|
File without changes
|
{django_forms_workflows-0.23.2 → django_forms_workflows-0.24.0}/django_forms_workflows/utils.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|