From 5b6caadd6fa1f320bdd60c0197e4b50e6220353e Mon Sep 17 00:00:00 2001 From: pablohashescobar <118773738+pablohashescobar@users.noreply.github.com> Date: Thu, 20 Apr 2023 18:14:05 +0530 Subject: [PATCH] chore: state delete validations endpoint (#880) --- apiserver/plane/api/urls.py | 6 +++++ apiserver/plane/api/views/__init__.py | 2 +- apiserver/plane/api/views/state.py | 39 ++++++++++++++++++++++++--- 3 files changed, 43 insertions(+), 4 deletions(-) diff --git a/apiserver/plane/api/urls.py b/apiserver/plane/api/urls.py index 029358c98..f064d370a 100644 --- a/apiserver/plane/api/urls.py +++ b/apiserver/plane/api/urls.py @@ -79,6 +79,7 @@ from plane.api.views import ( ## End Issues # States StateViewSet, + StateDeleteIssueCheckEndpoint, ## End States # Estimates EstimateViewSet, @@ -509,6 +510,11 @@ urlpatterns = [ ), name="project-state", ), + path( + "workspaces//projects//states//", + StateDeleteIssueCheckEndpoint.as_view(), + name="state-delete-check", + ), # End States ## # States path( diff --git a/apiserver/plane/api/views/__init__.py b/apiserver/plane/api/views/__init__.py index adeb285f0..18809cd9d 100644 --- a/apiserver/plane/api/views/__init__.py +++ b/apiserver/plane/api/views/__init__.py @@ -42,7 +42,7 @@ from .workspace import ( UserWorkspaceDashboardEndpoint, WorkspaceThemeViewSet, ) -from .state import StateViewSet +from .state import StateViewSet, StateDeleteIssueCheckEndpoint from .shortcut import ShortCutViewSet from .view import IssueViewViewSet, ViewIssuesEndpoint, IssueViewFavoriteViewSet from .cycle import ( diff --git a/apiserver/plane/api/views/state.py b/apiserver/plane/api/views/state.py index 048ac4a6a..f1e409e14 100644 --- a/apiserver/plane/api/views/state.py +++ b/apiserver/plane/api/views/state.py @@ -11,10 +11,10 @@ from sentry_sdk import capture_exception # Module imports -from . import BaseViewSet +from . import BaseViewSet, BaseAPIView from plane.api.serializers import StateSerializer from plane.api.permissions import ProjectEntityPermission -from plane.db.models import State +from plane.db.models import State, Issue class StateViewSet(BaseViewSet): @@ -53,7 +53,10 @@ class StateViewSet(BaseViewSet): ) except Exception as e: capture_exception(e) - return Response({"error": "Something went wrong please try again later"}, status=status.HTTP_400_BAD_REQUEST) + return Response( + {"error": "Something went wrong please try again later"}, + status=status.HTTP_400_BAD_REQUEST, + ) def list(self, request, slug, project_id): try: @@ -85,7 +88,37 @@ class StateViewSet(BaseViewSet): {"error": "Default state cannot be deleted"}, status=False ) + # Check for any issues in the state + issue_exist = Issue.objects.filter(state=pk).exists() + + if issue_exist: + return Response( + { + "error": "The state is not empty, only empty states can be deleted" + }, + status=status.HTTP_400_BAD_REQUEST, + ) + state.delete() return Response(status=status.HTTP_204_NO_CONTENT) except State.DoesNotExist: return Response({"error": "State does not exists"}, status=status.HTTP_404) + + +class StateDeleteIssueCheckEndpoint(BaseAPIView): + permission_classes = [ + ProjectEntityPermission, + ] + + def get(self, request, slug, project_id, pk): + try: + issue_count = Issue.objects.filter( + state=pk, workspace__slug=slug, project_id=project_id + ).count() + return Response({"issue_count": issue_count}, status=status.HTTP_200_OK) + except Exception as e: + capture_exception(e) + return Response( + {"error": "Something went wrong please try again later"}, + status=status.HTTP_400_BAD_REQUEST, + )