diff --git a/hypha/apply/projects/apps.py b/hypha/apply/projects/apps.py index 2858cc3a69b54d8b605aab31fb473131281b446b..1cfd8ba90dee4ccdb1da6a75aa4609fe9c120857 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 e3d6abcea3b4da6a7d6ce53c453eefa8b6debd89..b3b1aeaf5f9a3cdc995bb435354f22f19746d373 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 0000000000000000000000000000000000000000..2ab257154b072a852048c1671ec4599dbffcf86a --- /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)