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,21 @@ 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+ for todo in obj .todo_of_ticket .all ():
127+ if todo .status == TodoStatus .TODO :
128+ running_todos = TicketHandler .get_todo_operators (todo = todo , bk_biz_id = obj .bk_biz_id , db_type = obj .group )
129+ return running_todos .get ("operators" , [])
130+ return []
131+
132+ # obj.running_todos = [todo for todo in obj.todo_of_ticket.all() if todo.status == TodoStatus.TODO]
133+ # return obj.running_todos["operators"]
134+
135+ def get_todo_helpers (self , obj ):
136+ for todo in obj .todo_of_ticket .all ():
137+ if todo .status == TodoStatus .TODO :
138+ running_todos = TicketHandler .get_todo_operators (todo = todo , bk_biz_id = obj .bk_biz_id , db_type = obj .group )
139+ return running_todos .get ("helpers" , [])
140+ return []
127141
128142 def get_status (self , obj ):
129143 if obj .status == TicketStatus .RUNNING and obj .running_todos :
@@ -147,6 +161,18 @@ def get_bk_biz_name(self, obj):
147161 def get_db_app_abbr (self , obj ):
148162 return self .context ["ticket_ctx" ].app_abbr_map .get (obj .bk_biz_id ) or ""
149163
164+ def to_representation (self , instance ):
165+ request = self .context .get ("request" )
166+ is_assist = request .query_params .get ("is_assist" , False )
167+ representation = super ().to_representation (instance )
168+ if not int (request .query_params .get ("self_manage" , 0 )):
169+ return representation
170+ # 根据is_assist判断返回待我处理、待我协助页面数据
171+ key = "todo_helpers" if is_assist else "todo_operators"
172+ if request .user .username in representation .get (key , []):
173+ return representation
174+ return
175+
150176
151177class TicketFlowSerializer (TranslationSerializerMixin , serializers .ModelSerializer ):
152178 status = serializers .SerializerMethodField (help_text = _ ("流程状态" ))
@@ -230,14 +256,21 @@ class TodoSerializer(serializers.ModelSerializer):
230256 单据序列化
231257 """
232258
233- operators = serializers .JSONField (help_text = _ ("待办人列表" ))
259+ todo_operators = serializers .SerializerMethodField (help_text = _ ("处理人列表" ))
260+ todo_helpers = serializers .SerializerMethodField (help_text = _ ("协助人列表" ))
234261 cost_time = serializers .SerializerMethodField (help_text = _ ("耗时" ))
235262
236263 def get_cost_time (self , obj ):
237264 if obj .status in TODO_RUNNING_STATUS :
238265 return calculate_cost_time (timezone .now (), obj .create_at )
239266 return calculate_cost_time (obj .done_at , obj .create_at )
240267
268+ def get_todo_operators (self , obj ):
269+ return TicketHandler .get_todo_operators (obj , obj .ticket .bk_biz_id , obj .ticket .group ).get ("operators" , [])
270+
271+ def get_todo_helpers (self , obj ):
272+ return TicketHandler .get_todo_operators (obj , obj .ticket .bk_biz_id , obj .ticket .group ).get ("helpers" , [])
273+
241274 class Meta :
242275 model = Todo
243276 exclude = model .AUDITED_FIELDS
0 commit comments