forked from github/plane
feat: state list endpoint (#2717)
* feat: state list endpoint * dev: update states endpoint * dev: mark default state endpoint
This commit is contained in:
parent
10037222b6
commit
556b2d2617
@ -7,8 +7,6 @@ from plane.db.models import State
|
|||||||
|
|
||||||
|
|
||||||
class StateSerializer(BaseSerializer):
|
class StateSerializer(BaseSerializer):
|
||||||
workspace_detail = WorkspaceLiteSerializer(read_only=True, source="workspace")
|
|
||||||
project_detail = ProjectLiteSerializer(read_only=True, source="project")
|
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = State
|
model = State
|
||||||
|
@ -20,11 +20,19 @@ urlpatterns = [
|
|||||||
StateViewSet.as_view(
|
StateViewSet.as_view(
|
||||||
{
|
{
|
||||||
"get": "retrieve",
|
"get": "retrieve",
|
||||||
"put": "update",
|
|
||||||
"patch": "partial_update",
|
"patch": "partial_update",
|
||||||
"delete": "destroy",
|
"delete": "destroy",
|
||||||
}
|
}
|
||||||
),
|
),
|
||||||
name="project-state",
|
name="project-state",
|
||||||
),
|
),
|
||||||
|
path(
|
||||||
|
"workspaces/<str:slug>/projects/<uuid:project_id>/states/<uuid:pk>/mark-default/",
|
||||||
|
StateViewSet.as_view(
|
||||||
|
{
|
||||||
|
"post": "mark_as_default",
|
||||||
|
}
|
||||||
|
),
|
||||||
|
name="project-state",
|
||||||
|
),
|
||||||
]
|
]
|
||||||
|
@ -47,36 +47,45 @@ class StateViewSet(BaseViewSet):
|
|||||||
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
|
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
|
||||||
|
|
||||||
def list(self, request, slug, project_id):
|
def list(self, request, slug, project_id):
|
||||||
state_dict = dict()
|
|
||||||
states = StateSerializer(self.get_queryset(), many=True).data
|
states = StateSerializer(self.get_queryset(), many=True).data
|
||||||
|
grouped = request.GET.get("grouped", False)
|
||||||
|
if grouped == "true":
|
||||||
|
state_dict = {}
|
||||||
for key, value in groupby(
|
for key, value in groupby(
|
||||||
sorted(states, key=lambda state: state["group"]),
|
sorted(states, key=lambda state: state["group"]),
|
||||||
lambda state: state.get("group"),
|
lambda state: state.get("group"),
|
||||||
):
|
):
|
||||||
state_dict[str(key)] = list(value)
|
state_dict[str(key)] = list(value)
|
||||||
|
|
||||||
return Response(state_dict, status=status.HTTP_200_OK)
|
return Response(state_dict, status=status.HTTP_200_OK)
|
||||||
|
return Response(states, status=status.HTTP_200_OK)
|
||||||
|
|
||||||
|
def mark_as_default(self, request, slug, project_id, pk):
|
||||||
|
# Select all the states which are marked as default
|
||||||
|
_ = State.objects.filter(
|
||||||
|
workspace__slug=slug, project_id=project_id, default=True
|
||||||
|
).update(default=False)
|
||||||
|
_ = State.objects.filter(
|
||||||
|
workspace__slug=slug, project_id=project_id, pk=pk
|
||||||
|
).update(default=True)
|
||||||
|
return Response(status=status.HTTP_204_NO_CONTENT)
|
||||||
|
|
||||||
def destroy(self, request, slug, project_id, pk):
|
def destroy(self, request, slug, project_id, pk):
|
||||||
state = State.objects.get(
|
state = State.objects.get(
|
||||||
~Q(name="Triage"),
|
~Q(name="Triage"),
|
||||||
pk=pk, project_id=project_id, workspace__slug=slug,
|
pk=pk,
|
||||||
|
project_id=project_id,
|
||||||
|
workspace__slug=slug,
|
||||||
)
|
)
|
||||||
|
|
||||||
if state.default:
|
if state.default:
|
||||||
return Response(
|
return Response({"error": "Default state cannot be deleted"}, status=False)
|
||||||
{"error": "Default state cannot be deleted"}, status=False
|
|
||||||
)
|
|
||||||
|
|
||||||
# Check for any issues in the state
|
# Check for any issues in the state
|
||||||
issue_exist = Issue.issue_objects.filter(state=pk).exists()
|
issue_exist = Issue.issue_objects.filter(state=pk).exists()
|
||||||
|
|
||||||
if issue_exist:
|
if issue_exist:
|
||||||
return Response(
|
return Response(
|
||||||
{
|
{"error": "The state is not empty, only empty states can be deleted"},
|
||||||
"error": "The state is not empty, only empty states can be deleted"
|
|
||||||
},
|
|
||||||
status=status.HTTP_400_BAD_REQUEST,
|
status=status.HTTP_400_BAD_REQUEST,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user