ФУНКЦИИ - МЕЖПРОЕКТНАЯ КОММУНИКАЦИЯ: интерактивные карточки и фильтры двусторонней доски внешних контуров

This commit is contained in:
DCCONSTRUCTIONS
2026-04-20 22:57:18 +03:00
parent 6a3adcd245
commit d3b4c0689c
16 changed files with 754 additions and 224 deletions
@@ -44,6 +44,11 @@ class ExternalContourRequestReplySerializer(serializers.Serializer):
class ExternalContourRequestUpdateSerializer(serializers.Serializer):
name = serializers.CharField(max_length=255, required=False)
description_html = serializers.CharField(required=False, allow_blank=True, allow_null=True)
priority = serializers.ChoiceField(choices=Issue.PRIORITY_CHOICES, required=False)
assignee_ids = serializers.ListField(child=serializers.UUIDField(), required=False)
label_ids = serializers.ListField(child=serializers.UUIDField(), required=False)
state_id = serializers.UUIDField(required=False)
target_date = serializers.DateField(required=False, allow_null=True)
def validate(self, data):
if not data:
@@ -69,6 +74,7 @@ class ExternalContourTargetProjectSerializer(BaseSerializer):
class ExternalContourTargetOptionsSerializer(serializers.Serializer):
project = ExternalContourTargetProjectSerializer(read_only=True)
member_ids = serializers.ListField(child=serializers.UUIDField(), read_only=True)
states = StateLiteSerializer(many=True, read_only=True)
labels = LabelSerializer(many=True, read_only=True)
@@ -247,11 +247,15 @@ class ExternalContourTargetOptionsEndpoint(BaseAPIView):
)
labels = Label.objects.filter(project=target_project).order_by("sort_order", "name")
states = State.objects.filter(project=target_project).exclude(group=StateGroup.TRIAGE.value).order_by(
"sequence", "created_at"
)
serializer = ExternalContourTargetOptionsSerializer(
{
"project": target_project,
"member_ids": member_ids,
"states": states,
"labels": labels,
}
)
@@ -326,10 +330,17 @@ class ExternalContourDetailEndpoint(BaseAPIView):
serializer = ExternalContourRequestUpdateSerializer(data=request.data)
serializer.is_valid(raise_exception=True)
issue_update_data = serializer.validated_data.copy()
assignee_ids = issue_update_data.pop("assignee_ids", None)
label_ids = issue_update_data.pop("label_ids", None)
if assignee_ids is not None:
issue_update_data["assignees"] = assignee_ids
if label_ids is not None:
issue_update_data["labels"] = label_ids
issue_serializer = IssueCreateSerializer(
issue,
data=serializer.validated_data,
data=issue_update_data,
partial=True,
context={
"project_id": str(issue.project_id),