From 35d32a76d90e07bc0cb8c74d6f12d9d8bb519bee Mon Sep 17 00:00:00 2001
From: Sandeep Chauhan <sandeepsajan0@gmail.com>
Date: Sun, 31 Mar 2024 01:24:33 +0530
Subject: [PATCH] Make PAF form required for fund creation on Project settings
 enabled (#3829)

Fixes #3192
---
 hypha/apply/funds/admin_forms.py           | 10 ++++++++++
 hypha/apply/funds/tests/test_admin_form.py | 10 +++++++++-
 2 files changed, 19 insertions(+), 1 deletion(-)

diff --git a/hypha/apply/funds/admin_forms.py b/hypha/apply/funds/admin_forms.py
index 72c9ef998..807b1c821 100644
--- a/hypha/apply/funds/admin_forms.py
+++ b/hypha/apply/funds/admin_forms.py
@@ -1,6 +1,8 @@
 from collections import Counter
 
 from django.apps import apps
+from django.conf import settings
+from django.utils.translation import gettext as _
 from wagtail.admin.forms import WagtailAdminModelForm, WagtailAdminPageForm
 
 from .models.submissions import ApplicationSubmission
@@ -16,6 +18,7 @@ class WorkflowFormAdminForm(WagtailAdminPageForm):
         review_forms = self.formsets["review_forms"]
         external_review_forms = self.formsets["external_review_forms"]
         determination_forms = self.formsets["determination_forms"]
+        paf_forms = self.formsets["approval_forms"]
         number_of_stages = len(workflow.stages)
 
         self.validate_application_forms(workflow, application_forms)
@@ -30,6 +33,7 @@ class WorkflowFormAdminForm(WagtailAdminPageForm):
         self.validate_stages_equal_forms(
             workflow, determination_forms, form_type="Determination form"
         )
+        self.validate_paf_form(paf_forms)
 
         return cleaned_data
 
@@ -95,6 +99,12 @@ class WorkflowFormAdminForm(WagtailAdminPageForm):
                         "Exceeds required number of forms for stage, please remove.",
                     )
 
+    def validate_paf_form(self, forms):
+        if forms.is_valid():
+            valid_forms = [form for form in forms if not form.cleaned_data["DELETE"]]
+            if settings.PROJECTS_ENABLED and not valid_forms:
+                self.add_error(None, _("Please provide Project Approval Form."))
+
 
 class RoundBasePageAdminForm(WagtailAdminPageForm):
     def clean(self):
diff --git a/hypha/apply/funds/tests/test_admin_form.py b/hypha/apply/funds/tests/test_admin_form.py
index 31181affc..f2f147a9d 100644
--- a/hypha/apply/funds/tests/test_admin_form.py
+++ b/hypha/apply/funds/tests/test_admin_form.py
@@ -1,5 +1,5 @@
 import factory
-from django.test import TestCase
+from django.test import TestCase, override_settings
 
 from hypha.apply.determinations.tests.factories import DeterminationFormFactory
 from hypha.apply.funds.models import FundType
@@ -209,12 +209,20 @@ class TestWorkflowFormAdminForm(TestCase):
         )
         self.assertTrue(form.is_valid(), form.errors.as_text())
 
+    @override_settings(PROJECTS_ENABLED=False)
     def test_does_validates_without_project_approval_form(self):
         form = self.submit_data(
             form_data(1, 1, 1, 0, num_project_approval_form=0, stages=1)
         )
         self.assertTrue(form.is_valid(), form.errors.as_text())
 
+    @override_settings(PROJECTS_ENABLED=True)
+    def test_dosnt_validates_without_project_approval_form_for_projects_enabled(self):
+        form = self.submit_data(
+            form_data(1, 1, 1, 0, num_project_approval_form=0, stages=1)
+        )
+        self.assertFalse(form.is_valid(), form.errors.as_text())
+
     def test_doesnt_validates_with_multiple_project_approval_form(self):
         form = self.submit_data(
             form_data(1, 1, 1, 0, num_project_approval_form=2, stages=1)
-- 
GitLab