@@ -73,9 +73,22 @@ def build_condition(**kwargs) -> Condition:
7373
7474
7575def serialize_custom_fields (
76- service_provider : ServiceProvider , data : List [dict ], entity : CustomFieldEntityEnum
76+ team_id : int ,
77+ project_id : int ,
78+ service_provider : ServiceProvider ,
79+ data : List [dict ],
80+ entity : CustomFieldEntityEnum ,
81+ parent_entity : CustomFieldEntityEnum ,
7782) -> List [dict ]:
78- existing_custom_fields = service_provider .list_custom_field_names (entity )
83+ pk = (
84+ project_id
85+ if entity == CustomFieldEntityEnum .PROJECT
86+ else (team_id if parent_entity == CustomFieldEntityEnum .TEAM else project_id )
87+ )
88+
89+ existing_custom_fields = service_provider .list_custom_field_names (
90+ pk , entity , parent = parent_entity
91+ )
7992 for i in range (len (data )):
8093 if not data [i ]:
8194 data [i ] = {}
@@ -85,7 +98,7 @@ def serialize_custom_fields(
8598 field_id = int (custom_field_name )
8699 try :
87100 component_id = service_provider .get_custom_field_component_id (
88- field_id , entity = entity
101+ field_id , entity = entity , parent = parent_entity
89102 )
90103 except AppException :
91104 # The component template can be deleted, but not from the entity, so it will be skipped.
@@ -95,7 +108,7 @@ def serialize_custom_fields(
95108 field_value /= 1000 # Convert timestamp
96109
97110 new_field_name = service_provider .get_custom_field_name (
98- field_id , entity = entity
111+ field_id , entity = entity , parent = parent_entity
99112 )
100113 updated_fields [new_field_name ] = field_value
101114
@@ -139,10 +152,10 @@ def set_custom_field_value(
139152 if entity == CustomFieldEntityEnum .PROJECT :
140153 _context ["project_id" ] = entity_id
141154 template_id = self .service_provider .get_custom_field_id (
142- field_name , entity = entity
155+ field_name , entity = entity , parent = parent_entity
143156 )
144157 component_id = self .service_provider .get_custom_field_component_id (
145- template_id , entity = entity
158+ template_id , entity = entity , parent = parent_entity
146159 )
147160 # timestamp: convert seconds to milliseconds
148161 if component_id == CustomFieldType .DATE_PICKER .value and value is not None :
@@ -159,40 +172,59 @@ def set_custom_field_value(
159172 context = _context ,
160173 )
161174
162- def list_users (self , include : List [Literal ["custom_fields" ]] = None , ** filters ):
175+ def list_users (
176+ self , include : List [Literal ["custom_fields" ]] = None , project = None , ** filters
177+ ):
178+ if project :
179+ parent_entity = CustomFieldEntityEnum .PROJECT
180+ project_id = project .id
181+ else :
182+ parent_entity = CustomFieldEntityEnum .TEAM
183+ project_id = None
163184 valid_fields = generate_schema (
164185 UserFilters .__annotations__ ,
165186 self .service_provider .get_custom_fields_templates (
166- CustomFieldEntityEnum .CONTRIBUTOR
187+ CustomFieldEntityEnum .CONTRIBUTOR , parent = parent_entity
167188 ),
168189 )
169190 chain = QueryBuilderChain (
170191 [
171192 FieldValidationHandler (valid_fields .keys ()),
172193 UserFilterHandler (
194+ team_id = self .service_provider .client .team_id ,
195+ project_id = project_id ,
173196 service_provider = self .service_provider ,
174197 entity = CustomFieldEntityEnum .CONTRIBUTOR ,
198+ parent = parent_entity ,
175199 ),
176200 ]
177201 )
178202 query = chain .handle (filters , EmptyQuery ())
179203 if include and "custom_fields" in include :
180204 response = self .service_provider .work_management .list_users (
181- query , include_custom_fields = True
205+ query ,
206+ include_custom_fields = True ,
207+ parent_entity = parent_entity ,
208+ project_id = project_id ,
182209 )
183210 if not response .ok :
184211 raise AppException (response .error )
185212 users = response .data
186213 custom_fields_list = [user .custom_fields for user in users ]
187214 serialized_fields = serialize_custom_fields (
215+ self .service_provider .client .team_id ,
216+ project_id ,
188217 self .service_provider ,
189218 custom_fields_list ,
190- CustomFieldEntityEnum .CONTRIBUTOR ,
219+ entity = CustomFieldEntityEnum .CONTRIBUTOR ,
220+ parent_entity = parent_entity ,
191221 )
192222 for users , serialized_custom_fields in zip (users , serialized_fields ):
193223 users .custom_fields = serialized_custom_fields
194224 return response .data
195- return self .service_provider .work_management .list_users (query ).data
225+ return self .service_provider .work_management .list_users (
226+ query , parent_entity = parent_entity , project_id = project_id
227+ ).data
196228
197229 def update_user_activity (
198230 self ,
@@ -406,14 +438,18 @@ def list_projects(
406438 valid_fields = generate_schema (
407439 ProjectFilters .__annotations__ ,
408440 self .service_provider .get_custom_fields_templates (
409- CustomFieldEntityEnum .PROJECT
441+ CustomFieldEntityEnum .PROJECT , parent = CustomFieldEntityEnum . TEAM
410442 ),
411443 )
412444 chain = QueryBuilderChain (
413445 [
414446 FieldValidationHandler (valid_fields .keys ()),
415447 ProjectFilterHandler (
416- self .service_provider , entity = CustomFieldEntityEnum .PROJECT
448+ team_id = self .service_provider .client .team_id ,
449+ project_id = None ,
450+ service_provider = self .service_provider ,
451+ entity = CustomFieldEntityEnum .PROJECT ,
452+ parent = CustomFieldEntityEnum .TEAM ,
417453 ),
418454 ]
419455 )
@@ -435,7 +471,11 @@ def list_projects(
435471 if include_custom_fields :
436472 custom_fields_list = [project .custom_fields for project in projects ]
437473 serialized_fields = serialize_custom_fields (
438- self .service_provider , custom_fields_list , CustomFieldEntityEnum .PROJECT
474+ self .service_provider .client .team_id ,
475+ None ,
476+ self .service_provider ,
477+ custom_fields_list ,
478+ CustomFieldEntityEnum .PROJECT ,
439479 )
440480 for project , serialized_custom_fields in zip (projects , serialized_fields ):
441481 project .custom_fields = serialized_custom_fields
0 commit comments