3333 TodoStatus ,
3434)
3535from backend .ticket .flow_manager .manager import TicketFlowManager
36+ from backend .ticket .handler import TicketHandler
3637from backend .ticket .models import Flow , Ticket , Todo
3738from backend .ticket .todos import ActionType
3839from backend .ticket .yasg_slz import todo_operate_example
@@ -96,6 +97,7 @@ class TicketSerializer(AuditedSerializer, serializers.ModelSerializer):
9697 details = TicketDetailsSerializer (help_text = _ ("单据详情" ))
9798 # 额外补充展示字段
9899 todo_operators = serializers .SerializerMethodField (help_text = _ ("处理人列表" ))
100+ todo_helpers = serializers .SerializerMethodField (help_text = _ ("协助人列表" ))
99101 status = serializers .SerializerMethodField (help_text = _ ("状态" ), read_only = True )
100102 status_display = serializers .SerializerMethodField (help_text = _ ("状态名称" ))
101103 ticket_type_display = serializers .SerializerMethodField (help_text = _ ("单据类型名称" ))
@@ -121,9 +123,26 @@ def validate_ticket_type(self, value):
121123 return value
122124
123125 def get_todo_operators (self , obj ):
124- # 任取一个运行中的todo,获取operators即可
125- obj .running_todos = [todo for todo in obj .todo_of_ticket .all () if todo .status == TodoStatus .TODO ]
126- return obj .running_todos [0 ].operators if obj .running_todos else []
126+ obj .running_todos = next (
127+ (
128+ TicketHandler .get_todo_operators (todo = todo , bk_biz_id = obj .bk_biz_id , db_type = obj .group )
129+ for todo in obj .todo_of_ticket .all ()
130+ if todo .status == TodoStatus .TODO
131+ ),
132+ None ,
133+ )
134+ return obj .running_todos .get ("operators" , []) if obj .running_todos else []
135+
136+ def get_todo_helpers (self , obj ):
137+ obj .running_todos = next (
138+ (
139+ TicketHandler .get_todo_operators (todo = todo , bk_biz_id = obj .bk_biz_id , db_type = obj .group )
140+ for todo in obj .todo_of_ticket .all ()
141+ if todo .status == TodoStatus .TODO
142+ ),
143+ None ,
144+ )
145+ return obj .running_todos .get ("helpers" , []) if obj .running_todos else []
127146
128147 def get_status (self , obj ):
129148 if obj .status == TicketStatus .RUNNING and obj .running_todos :
@@ -147,6 +166,18 @@ def get_bk_biz_name(self, obj):
147166 def get_db_app_abbr (self , obj ):
148167 return self .context ["ticket_ctx" ].app_abbr_map .get (obj .bk_biz_id ) or ""
149168
169+ def to_representation (self , instance ):
170+ request = self .context .get ("request" )
171+ is_assist = request .query_params .get ("is_assist" , False )
172+ representation = super ().to_representation (instance )
173+ if not int (request .query_params .get ("self_manage" , 0 )):
174+ return representation
175+ # 根据is_assist判断返回待我处理、待我协助页面数据
176+ key = "todo_helpers" if is_assist else "todo_operators"
177+ if request .user .username in representation .get (key , []):
178+ return representation
179+ return
180+
150181
151182class TicketFlowSerializer (TranslationSerializerMixin , serializers .ModelSerializer ):
152183 status = serializers .SerializerMethodField (help_text = _ ("流程状态" ))
@@ -230,14 +261,21 @@ class TodoSerializer(serializers.ModelSerializer):
230261 单据序列化
231262 """
232263
233- operators = serializers .JSONField (help_text = _ ("待办人列表" ))
264+ todo_operators = serializers .SerializerMethodField (help_text = _ ("处理人列表" ))
265+ todo_helpers = serializers .SerializerMethodField (help_text = _ ("协助人列表" ))
234266 cost_time = serializers .SerializerMethodField (help_text = _ ("耗时" ))
235267
236268 def get_cost_time (self , obj ):
237269 if obj .status in TODO_RUNNING_STATUS :
238270 return calculate_cost_time (timezone .now (), obj .create_at )
239271 return calculate_cost_time (obj .done_at , obj .create_at )
240272
273+ def get_todo_operators (self , obj ):
274+ return TicketHandler .get_todo_operators (obj , obj .ticket .bk_biz_id , obj .ticket .group ).get ("operators" , [])
275+
276+ def get_todo_helpers (self , obj ):
277+ return TicketHandler .get_todo_operators (obj , obj .ticket .bk_biz_id , obj .ticket .group ).get ("helpers" , [])
278+
241279 class Meta :
242280 model = Todo
243281 exclude = model .AUDITED_FIELDS
0 commit comments