105 lines
3.3 KiB
Python
105 lines
3.3 KiB
Python
# Python imports
|
|
import random
|
|
|
|
# Django imports
|
|
from django.db import IntegrityError
|
|
|
|
# Third Party imports
|
|
from rest_framework.response import Response
|
|
from rest_framework import status
|
|
|
|
# Module imports
|
|
from .. import BaseViewSet, BaseAPIView
|
|
from plane.app.serializers import LabelSerializer
|
|
from plane.app.permissions import (
|
|
ProjectMemberPermission,
|
|
)
|
|
from plane.db.models import (
|
|
Project,
|
|
Label,
|
|
)
|
|
from plane.utils.cache import invalidate_cache
|
|
|
|
|
|
class LabelViewSet(BaseViewSet):
|
|
serializer_class = LabelSerializer
|
|
model = Label
|
|
permission_classes = [
|
|
ProjectMemberPermission,
|
|
]
|
|
|
|
def get_queryset(self):
|
|
return self.filter_queryset(
|
|
super()
|
|
.get_queryset()
|
|
.filter(workspace__slug=self.kwargs.get("slug"))
|
|
.filter(project_id=self.kwargs.get("project_id"))
|
|
.filter(project__project_projectmember__member=self.request.user)
|
|
.select_related("project")
|
|
.select_related("workspace")
|
|
.select_related("parent")
|
|
.distinct()
|
|
.order_by("sort_order")
|
|
)
|
|
|
|
@invalidate_cache(
|
|
path="/api/workspaces/:slug/labels/", url_params=True, user=False
|
|
)
|
|
def create(self, request, slug, project_id):
|
|
try:
|
|
serializer = LabelSerializer(data=request.data)
|
|
if serializer.is_valid():
|
|
serializer.save(project_id=project_id)
|
|
return Response(
|
|
serializer.data, status=status.HTTP_201_CREATED
|
|
)
|
|
return Response(
|
|
serializer.errors, status=status.HTTP_400_BAD_REQUEST
|
|
)
|
|
except IntegrityError:
|
|
return Response(
|
|
{
|
|
"error": "Label with the same name already exists in the project"
|
|
},
|
|
status=status.HTTP_400_BAD_REQUEST,
|
|
)
|
|
|
|
@invalidate_cache(
|
|
path="/api/workspaces/:slug/labels/", url_params=True, user=False
|
|
)
|
|
def partial_update(self, request, *args, **kwargs):
|
|
return super().partial_update(request, *args, **kwargs)
|
|
|
|
@invalidate_cache(
|
|
path="/api/workspaces/:slug/labels/", url_params=True, user=False
|
|
)
|
|
def destroy(self, request, *args, **kwargs):
|
|
return super().destroy(request, *args, **kwargs)
|
|
|
|
|
|
class BulkCreateIssueLabelsEndpoint(BaseAPIView):
|
|
def post(self, request, slug, project_id):
|
|
label_data = request.data.get("label_data", [])
|
|
project = Project.objects.get(pk=project_id)
|
|
|
|
labels = Label.objects.bulk_create(
|
|
[
|
|
Label(
|
|
name=label.get("name", "Migrated"),
|
|
description=label.get("description", "Migrated Issue"),
|
|
color=f"#{random.randint(0, 0xFFFFFF+1):06X}",
|
|
project_id=project_id,
|
|
workspace_id=project.workspace_id,
|
|
created_by=request.user,
|
|
updated_by=request.user,
|
|
)
|
|
for label in label_data
|
|
],
|
|
batch_size=50,
|
|
ignore_conflicts=True,
|
|
)
|
|
|
|
return Response(
|
|
{"labels": LabelSerializer(labels, many=True).data},
|
|
status=status.HTTP_201_CREATED,
|
|
)
|