UI - МЕЖПРОЕКТНАЯ КОММУНИКАЦИЯ: трехсекционная шкала прогресса чекеров

This commit is contained in:
DCCONSTRUCTIONS
2026-04-29 18:19:00 +03:00
parent 5f9d9c418e
commit aa348d5d64
9 changed files with 189 additions and 6 deletions
@@ -48,6 +48,7 @@ from plane.utils.content_validator import (
validate_binary_data,
)
from plane.utils.date_utils import set_default_issue_start_date
from plane.utils.issue_checker_progress import build_issue_checker_progress
class IssueFlatSerializer(BaseSerializer):
@@ -773,6 +774,9 @@ class IssueSerializer(DynamicBaseSerializer):
# Count items
sub_issues_count = serializers.IntegerField(read_only=True)
checker_blocks_count = serializers.SerializerMethodField()
checker_items_count = serializers.SerializerMethodField()
checker_items_completed_count = serializers.SerializerMethodField()
attachment_count = serializers.IntegerField(read_only=True)
link_count = serializers.IntegerField(read_only=True)
@@ -796,6 +800,9 @@ class IssueSerializer(DynamicBaseSerializer):
"label_ids",
"assignee_ids",
"sub_issues_count",
"checker_blocks_count",
"checker_items_count",
"checker_items_completed_count",
"created_at",
"updated_at",
"created_by",
@@ -809,6 +816,15 @@ class IssueSerializer(DynamicBaseSerializer):
]
read_only_fields = fields
def get_checker_blocks_count(self, obj):
return build_issue_checker_progress(obj.detail_layout).get("checker_blocks_count", 0)
def get_checker_items_count(self, obj):
return build_issue_checker_progress(obj.detail_layout).get("checker_items_count", 0)
def get_checker_items_completed_count(self, obj):
return build_issue_checker_progress(obj.detail_layout).get("checker_items_completed_count", 0)
def validate(self, data):
if (
data.get("state_id")
@@ -868,6 +884,7 @@ class IssueListDetailSerializer(serializers.Serializer):
"label_ids": self.get_label_ids(instance),
"assignee_ids": self.get_assignee_ids(instance),
"sub_issues_count": instance.sub_issues_count,
**build_issue_checker_progress(instance.detail_layout),
"attachment_count": instance.attachment_count,
"link_count": instance.link_count,
}
@@ -71,6 +71,7 @@ from plane.utils.grouper import (
)
from plane.utils.host import base_host
from plane.utils.issue_filters import issue_filters
from plane.utils.issue_checker_progress import attach_issue_checker_progress
from plane.utils.order_queryset import order_issue_queryset
from plane.utils.paginator import GroupedOffsetPaginator, SubGroupedOffsetPaginator
from plane.utils.timezone_converter import user_timezone_converter
@@ -190,6 +191,7 @@ class IssueListEndpoint(BaseAPIView):
"label_ids",
"assignee_ids",
"sub_issues_count",
"detail_layout",
"created_at",
"updated_at",
"created_by",
@@ -205,6 +207,7 @@ class IssueListEndpoint(BaseAPIView):
)
datetime_fields = ["created_at", "updated_at"]
issues = user_timezone_converter(issues, datetime_fields, request.user.user_timezone)
issues = attach_issue_checker_progress(issues)
return Response(issues, status=status.HTTP_200_OK)
@@ -470,6 +473,7 @@ class IssueViewSet(BaseViewSet):
"label_ids",
"assignee_ids",
"sub_issues_count",
"detail_layout",
"created_at",
"updated_at",
"created_by",
@@ -486,6 +490,7 @@ class IssueViewSet(BaseViewSet):
)
datetime_fields = ["created_at", "updated_at"]
issue = user_timezone_converter(issue, datetime_fields, request.user.user_timezone)
issue = attach_issue_checker_progress([issue])[0] if issue else issue
# Send the model activity
model_activity.delay(
model_name="issue",
@@ -893,6 +898,7 @@ class IssuePaginatedViewSet(BaseViewSet):
# converting the datetime fields in paginated data
datetime_fields = ["created_at", "updated_at"]
paginated_data = user_timezone_converter(paginated_data, datetime_fields, timezone)
paginated_data = attach_issue_checker_progress(paginated_data)
return paginated_data
@@ -930,6 +936,7 @@ class IssuePaginatedViewSet(BaseViewSet):
"link_count",
"attachment_count",
"sub_issues_count",
"detail_layout",
]
if str(is_description_required).lower() == "true":