Skip to content
Snippets Groups Projects
admin_forms.py 1.46 KiB
Newer Older
  • Learn to ignore specific revisions
  • from wagtail.admin.forms import WagtailAdminPageForm
    
    from .workflow import WORKFLOWS
    
    Todd Dembrey's avatar
    Todd Dembrey committed
    
    class WorkflowFormAdminForm(WagtailAdminPageForm):
        def clean(self):
            cleaned_data = super().clean()
    
    
            workflow = WORKFLOWS[cleaned_data['workflow_name']]
    
    Todd Dembrey's avatar
    Todd Dembrey committed
            application_forms = self.formsets['forms']
    
            review_forms = self.formsets['review_forms']
    
    Todd Dembrey's avatar
    Todd Dembrey committed
    
            self.validate_stages_equal_forms(workflow, application_forms)
    
            self.validate_stages_equal_forms(workflow, review_forms, form_type="Review form")
    
    Todd Dembrey's avatar
    Todd Dembrey committed
    
            return cleaned_data
    
    
        def validate_stages_equal_forms(self, workflow, forms, form_type="form"):
            if forms.is_valid():
                valid_forms = [form for form in forms if not form.cleaned_data['DELETE']]
    
    Todd Dembrey's avatar
    Todd Dembrey committed
                number_of_forms = len(valid_forms)
                plural_form = 's' if number_of_forms > 1 else ''
    
    
                number_of_stages = len(workflow.stages)
    
    Todd Dembrey's avatar
    Todd Dembrey committed
                plural_stage = 's' if number_of_stages > 1 else ''
    
                if number_of_forms != number_of_stages:
                    self.add_error(
                        None,
    
                        f'Number of {form_type}s does not match number of stages: '
    
    Todd Dembrey's avatar
    Todd Dembrey committed
                        f'{number_of_stages} stage{plural_stage} and {number_of_forms} '
    
                        f'{form_type}{plural_form} provided',
    
    Todd Dembrey's avatar
    Todd Dembrey committed
                    )
    
                    for form in valid_forms[number_of_stages:]:
                        form.add_error('form', 'Exceeds required number of forms for stage, please remove.')