@@ -82,9 +82,11 @@ class Meta:
8282
8383 def get_people_groups (self , user : ProjectUser ) -> list :
8484 organization = self .context .get ("organization" )
85- queryset = PeopleGroup .objects .filter (
86- groups__users = user , is_root = False
87- ).distinct ()
85+ queryset = (
86+ PeopleGroup .objects .filter (groups__users = user , is_root = False )
87+ .select_related ("organization" )
88+ .distinct ()
89+ )
8890 if organization :
8991 queryset = queryset .filter (organization = organization ).distinct ()
9092 return PeopleGroupSuperLightSerializer (
@@ -199,6 +201,7 @@ def get_people_groups(self, user: ProjectUser) -> list:
199201 queryset = (
200202 request_user .get_people_group_queryset ()
201203 .filter (groups__users = user , is_root = False )
204+ .select_related ("organization" )
202205 .distinct ()
203206 )
204207 if organization :
@@ -226,9 +229,11 @@ def get_can_mentor_on(self, user: ProjectUser) -> List[Dict]:
226229class PeopleGroupSuperLightSerializer (
227230 AutoTranslatedModelSerializer , serializers .ModelSerializer
228231):
232+ organization = serializers .SlugRelatedField (read_only = True , slug_field = "code" )
233+
229234 class Meta :
230235 model = PeopleGroup
231- read_only_fields = ["id" , "slug" , "name" ]
236+ read_only_fields = ["id" , "slug" , "name" , "organization" ]
232237 fields = read_only_fields
233238
234239
@@ -264,6 +269,57 @@ class Meta:
264269 ]
265270
266271
272+ class PeopleGroupHierarchySerializer (
273+ AutoTranslatedModelSerializer ,
274+ serializers .ModelSerializer ,
275+ ):
276+ children = serializers .SerializerMethodField ()
277+ header_image = ImageSerializer (read_only = True )
278+ roles = serializers .SlugRelatedField (
279+ many = True ,
280+ slug_field = "name" ,
281+ read_only = True ,
282+ source = "groups" ,
283+ )
284+
285+ class Meta :
286+ model = PeopleGroup
287+ read_only_fields = [
288+ "id" ,
289+ "slug" ,
290+ "name" ,
291+ "publication_status" ,
292+ "header_image" ,
293+ "children" ,
294+ "roles" ,
295+ ]
296+ fields = read_only_fields
297+
298+ def get_children (
299+ self , people_group : PeopleGroup
300+ ) -> List [Dict [str , Union [str , int ]]]:
301+ context = self .context
302+ request = context .get ("request" )
303+ mapping = context .get ("mapping" )
304+ if not mapping :
305+ base_queryset = request .user .get_people_group_queryset ().filter (
306+ organization = people_group .organization
307+ )
308+ mapping = {group .id : group for group in base_queryset }
309+ context ["mapping" ] = mapping
310+ children_ids = list (people_group .children .all ().values_list ("id" , flat = True ))
311+ if people_group .is_root :
312+ children_ids += list (
313+ PeopleGroup .objects .filter (
314+ organization = people_group .organization ,
315+ parent__isnull = True ,
316+ is_root = False ,
317+ ).values_list ("id" , flat = True )
318+ )
319+ children = [mapping .get (child ) for child in children_ids if child in mapping ]
320+ return PeopleGroupHierarchySerializer (children , many = True , context = context ).data
321+
322+
267323class PeopleGroupAddTeamMembersSerializer (serializers .Serializer ):
268324 people_group = HiddenPrimaryKeyRelatedField (
269325 required = False , write_only = True , queryset = PeopleGroup .objects .all ()
@@ -386,23 +442,23 @@ def get_hierarchy(self, obj: PeopleGroup) -> List[Dict[str, Union[str, int]]]:
386442 while obj .parent and not obj .parent .is_root :
387443 obj = obj .parent
388444 if obj in queryset :
389- hierarchy .append ({"id" : obj .id , "slug" : obj .slug , "name" : obj .name })
445+ hierarchy .append (
446+ PeopleGroupSuperLightSerializer (obj , context = self .context ).data
447+ )
390448 return [{"order" : i , ** h } for i , h in enumerate (hierarchy [::- 1 ])]
391449
392450 def get_children (self , obj : PeopleGroup ) -> List [Dict [str , Union [str , int ]]]:
393451 request = self .context .get ("request" )
394452 queryset = (
395- request .user .get_people_group_queryset () & obj .children .all ().distinct ()
453+ request .user .get_people_group_queryset ()
454+ .select_related ("organization" )
455+ .filter (parent = obj )
456+ .order_by ("name" )
457+ .distinct ()
396458 )
397- return [
398- {
399- "id" : child .id ,
400- "slug" : child .slug ,
401- "name" : child .name ,
402- "organization" : child .organization .code ,
403- }
404- for child in queryset .order_by ("name" )
405- ]
459+ return PeopleGroupSuperLightSerializer (
460+ queryset , many = True , context = self .context
461+ ).data
406462
407463 def validate_featured_projects (self , projects : List [Project ]) -> List [Project ]:
408464 request = self .context .get ("request" )
0 commit comments