ФУНКЦИИ - МЕЖПРОЕКТНАЯ КОММУНИКАЦИЯ: source-side редактирование открытого внешнего запроса и перестройка маршрутизации

This commit is contained in:
DCCONSTRUCTIONS
2026-04-19 10:30:04 +03:00
parent 4dff521f7f
commit a4eaf4b247
15 changed files with 318 additions and 171 deletions
@@ -33,7 +33,7 @@ urlpatterns = [
),
path(
"workspaces/<str:slug>/projects/<uuid:project_id>/external-contours/<uuid:request_id>/",
ExternalContourDetailEndpoint.as_view(http_method_names=["get"]),
ExternalContourDetailEndpoint.as_view(http_method_names=["get", "patch"]),
name="external-contour-detail",
),
path(
@@ -14,6 +14,7 @@ from plane.api.serializers import (
ExternalContourRequestCreateSerializer,
ExternalContourRequestDecisionSerializer,
ExternalContourRequestReplySerializer,
ExternalContourRequestUpdateSerializer,
ExternalContourRequestSerializer,
ExternalContourTargetOptionsSerializer,
ExternalContourTargetProjectSerializer,
@@ -304,6 +305,55 @@ class ExternalContourDetailEndpoint(BaseAPIView):
)
return Response(serializer.data, status=status.HTTP_200_OK)
def patch(self, request, slug, project_id, request_id):
contour_request = get_object_or_404(self.get_queryset())
issue = contour_request.issue
if not issue:
return Response({"error": "Target issue was not found"}, status=status.HTTP_404_NOT_FOUND)
requested_by_id = contour_request.extra.get("requested_by_id") or (
str(issue.created_by_id) if issue.created_by_id else None
)
if str(request.user.id) != str(requested_by_id):
return Response({"error": "Only the sender can edit this request"}, status=status.HTTP_403_FORBIDDEN)
if issue.state and issue.state.group in [StateGroup.COMPLETED.value, StateGroup.CANCELLED.value]:
return Response(
{"error": "Only open external contour requests can be edited"},
status=status.HTTP_400_BAD_REQUEST,
)
serializer = ExternalContourRequestUpdateSerializer(data=request.data)
serializer.is_valid(raise_exception=True)
issue_serializer = IssueCreateSerializer(
issue,
data=serializer.validated_data,
partial=True,
context={
"project_id": str(issue.project_id),
"workspace_id": str(issue.workspace_id),
},
)
issue_serializer.is_valid(raise_exception=True)
issue_serializer.save()
contour_request.updated_at = timezone.now()
contour_request.save(update_fields=["updated_at"])
contour_request.refresh_from_db()
response_serializer = ExternalContourRequestSerializer(
contour_request,
context={
"include_mirror_data": True,
"workspace_slug": slug,
"source_project_id": str(project_id),
"request": request,
},
)
return Response(response_serializer.data, status=status.HTTP_200_OK)
class ExternalContourDecisionEndpoint(BaseAPIView):
permission_classes = [ProjectLitePermission]