UI - МЕЖПРОЕКТНАЯ КОММУНИКАЦИЯ: трехсекционная шкала прогресса чекеров
This commit is contained in:
@@ -11,6 +11,7 @@ from .state import StateLiteSerializer
|
||||
from .user import UserLiteSerializer
|
||||
from plane.app.serializers.issue import LabelSerializer
|
||||
from plane.db.models import FileAsset, IntakeIssue, Issue, IssueActivity, IssueComment, Label, Notification, Project
|
||||
from plane.utils.issue_checker_progress import build_issue_checker_progress
|
||||
|
||||
|
||||
class ExternalContourIssuePayloadSerializer(serializers.Serializer):
|
||||
@@ -86,6 +87,9 @@ class ExternalContourIssueSerializer(BaseSerializer):
|
||||
label_ids = serializers.SerializerMethodField()
|
||||
project_detail = ProjectLiteSerializer(source="project", read_only=True)
|
||||
state_detail = StateLiteSerializer(source="state", read_only=True)
|
||||
checker_blocks_count = serializers.SerializerMethodField()
|
||||
checker_items_count = serializers.SerializerMethodField()
|
||||
checker_items_completed_count = serializers.SerializerMethodField()
|
||||
|
||||
class Meta:
|
||||
model = Issue
|
||||
@@ -105,6 +109,9 @@ class ExternalContourIssueSerializer(BaseSerializer):
|
||||
"label_details",
|
||||
"assignee_ids",
|
||||
"assignee_details",
|
||||
"checker_blocks_count",
|
||||
"checker_items_count",
|
||||
"checker_items_completed_count",
|
||||
"state_detail",
|
||||
"project_detail",
|
||||
"created_by_detail",
|
||||
@@ -126,6 +133,15 @@ class ExternalContourIssueSerializer(BaseSerializer):
|
||||
for label_bridge in obj.label_issue.all()
|
||||
]
|
||||
|
||||
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)
|
||||
|
||||
|
||||
class ExternalContourMirroredAttachmentSerializer(BaseSerializer):
|
||||
uploaded_by = serializers.SerializerMethodField()
|
||||
|
||||
@@ -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":
|
||||
|
||||
@@ -22,6 +22,7 @@ from plane.db.models import (
|
||||
ModuleIssue,
|
||||
IssueLabel,
|
||||
)
|
||||
from plane.utils.issue_checker_progress import attach_issue_checker_progress
|
||||
from typing import Optional, Dict, Tuple, Any, Union, List
|
||||
|
||||
|
||||
@@ -118,6 +119,7 @@ def issue_on_results(
|
||||
"parent_id",
|
||||
"cycle_id",
|
||||
"sub_issues_count",
|
||||
"detail_layout",
|
||||
"created_at",
|
||||
"updated_at",
|
||||
"created_by",
|
||||
@@ -141,7 +143,7 @@ def issue_on_results(
|
||||
original_list.append(sub_group_by)
|
||||
|
||||
required_fields.extend(original_list)
|
||||
return list(issues.values(*required_fields))
|
||||
return attach_issue_checker_progress(issues.values(*required_fields))
|
||||
|
||||
|
||||
def issue_group_values(
|
||||
|
||||
@@ -0,0 +1,50 @@
|
||||
# Copyright (c) 2023-present Plane Software, Inc. and contributors
|
||||
# SPDX-License-Identifier: AGPL-3.0-only
|
||||
# See the LICENSE file for details.
|
||||
|
||||
STRUCTURED_BLOCKS_KEY = "nodedc_structured_blocks"
|
||||
|
||||
|
||||
def build_issue_checker_progress(detail_layout):
|
||||
blocks = detail_layout.get(STRUCTURED_BLOCKS_KEY) if isinstance(detail_layout, dict) else []
|
||||
|
||||
checker_blocks_count = 0
|
||||
checker_items_count = 0
|
||||
checker_items_completed_count = 0
|
||||
|
||||
if not isinstance(blocks, list):
|
||||
blocks = []
|
||||
|
||||
for block in blocks:
|
||||
if not isinstance(block, dict) or block.get("type") != "checker":
|
||||
continue
|
||||
|
||||
checker_blocks_count += 1
|
||||
items = block.get("items")
|
||||
|
||||
if not isinstance(items, list):
|
||||
continue
|
||||
|
||||
for item in items:
|
||||
if not isinstance(item, dict):
|
||||
continue
|
||||
|
||||
checker_items_count += 1
|
||||
if item.get("checked"):
|
||||
checker_items_completed_count += 1
|
||||
|
||||
return {
|
||||
"checker_blocks_count": checker_blocks_count,
|
||||
"checker_items_count": checker_items_count,
|
||||
"checker_items_completed_count": checker_items_completed_count,
|
||||
}
|
||||
|
||||
|
||||
def attach_issue_checker_progress(items):
|
||||
prepared_items = list(items)
|
||||
|
||||
for item in prepared_items:
|
||||
detail_layout = item.pop("detail_layout", None)
|
||||
item.update(build_issue_checker_progress(detail_layout))
|
||||
|
||||
return prepared_items
|
||||
Reference in New Issue
Block a user