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