From 7db450901b328e243673b2a72c780eb710c6631b Mon Sep 17 00:00:00 2001
From: Sandeep Chauhan <sandeepsajan0@gmail.com>
Date: Thu, 11 Jul 2024 21:48:00 +0530
Subject: [PATCH] Fix: Internal approval projects with no Project reviewer
 roles (#4028)

Fixes #3945
---
 hypha/apply/projects/apps.py           |  3 +++
 hypha/apply/projects/models/project.py |  5 +++++
 hypha/apply/projects/signals.py        | 20 ++++++++++++++++++++
 3 files changed, 28 insertions(+)
 create mode 100644 hypha/apply/projects/signals.py

diff --git a/hypha/apply/projects/apps.py b/hypha/apply/projects/apps.py
index 2858cc3a6..1cfd8ba90 100644
--- a/hypha/apply/projects/apps.py
+++ b/hypha/apply/projects/apps.py
@@ -4,3 +4,6 @@ from django.apps import AppConfig
 class ProjectsConfig(AppConfig):
     name = "hypha.apply.projects"
     label = "application_projects"
+
+    def ready(self):
+        import hypha.apply.projects.signals  # noqa: F401
diff --git a/hypha/apply/projects/models/project.py b/hypha/apply/projects/models/project.py
index e3d6abcea..b3b1aeaf5 100644
--- a/hypha/apply/projects/models/project.py
+++ b/hypha/apply/projects/models/project.py
@@ -541,6 +541,11 @@ class ProjectSettings(BaseSiteSetting, ClusterableModel):
                 InlinePanel("paf_reviewers_roles", label=_("PAF Reviewers Roles")),
             ],
             heading=_("PAF Reviewers Roles"),
+            help_text=_(
+                "Reviewer Roles are needed to move projects to 'Internal Approval' stage. "
+                "Delete all roles to skip internal approval process and "
+                "to move all internal approval projects back to the 'Draft' stage with all approvals removed."
+            ),
         ),
     ]
 
diff --git a/hypha/apply/projects/signals.py b/hypha/apply/projects/signals.py
new file mode 100644
index 000000000..2ab257154
--- /dev/null
+++ b/hypha/apply/projects/signals.py
@@ -0,0 +1,20 @@
+from django.db.models.signals import post_delete
+from django.dispatch import receiver
+
+from hypha.apply.todo.views import remove_tasks_of_related_obj
+
+from .models.project import DRAFT, INTERNAL_APPROVAL, PAFReviewersRole, Project
+
+
+@receiver(post_delete, sender=PAFReviewersRole)
+def handle_internal_approval_projects(sender, instance, **kwargs):
+    # if last Project reviewer role
+    if PAFReviewersRole.objects.count() == 0:
+        for project in Project.objects.filter(status=INTERNAL_APPROVAL):
+            # remove all paf approvals(approved and unapproved both)
+            project.paf_approvals.all().delete()
+            # update project status back to Draft
+            project.status = DRAFT
+            project.save(update_fields=["status"])
+            # remove all tasks for internal_approval project
+            remove_tasks_of_related_obj(project)
-- 
GitLab