55"""
66from __future__ import annotations
77
8+ import copy
89import os
910import re
1011import io
@@ -1007,29 +1008,44 @@ def get_users(
10071008
10081009 if not fields :
10091010 fields = self .get_default_fields_for_type ("user" )
1011+ else :
1012+ fields = set (fields )
1013+ add_all_attrib = False
1014+ for field in tuple (fields ):
1015+ if field == "attrib" or field .startswith ("attrib." ):
1016+ fields .discard (field )
1017+ add_all_attrib = True
1018+
1019+ if add_all_attrib :
1020+ fields .add ("allAttrib" )
10101021
1011- query = users_graphql_query (set ( fields ) )
1022+ query = users_graphql_query (fields )
10121023 for attr , filter_value in filters .items ():
10131024 query .set_variable_value (attr , filter_value )
10141025
1015- attributes = self .get_attributes_for_type ("user" )
1026+ attributes = {}
1027+ if "allAttrib" in fields :
1028+ attributes = self .get_attributes_for_type ("user" )
1029+
10161030 for parsed_data in query .continuous_query (self ):
10171031 for user in parsed_data ["users" ]:
10181032 access_groups = user .get ("accessGroups" )
10191033 if isinstance (access_groups , str ):
10201034 user ["accessGroups" ] = json .loads (access_groups )
1021- all_attrib = user .get ("allAttrib" )
1022- if isinstance (all_attrib , str ):
1023- user ["allAttrib" ] = json .loads (all_attrib )
1024- if "attrib" in user :
1025- user ["ownAttrib" ] = user ["attrib" ].copy ()
1026- attrib = user ["attrib" ]
1027- for key , value in tuple (attrib .items ()):
1028- if value is not None :
1029- continue
1030- attr_def = attributes .get (key )
1031- if attr_def is not None :
1032- attrib [key ] = attr_def ["default" ]
1035+
1036+ attrib = user .get ("allAttrib" )
1037+ if isinstance (attrib , str ):
1038+ attrib = json .loads (attrib )
1039+
1040+ if attrib is not None :
1041+ own_attrib = copy .deepcopy (attrib )
1042+ user ["ownAttrib" ] = own_attrib
1043+ for name , attr_data in attributes .items ():
1044+ attrib .setdefault (name , attr_data ["default" ])
1045+ own_attrib .setdefault (name , None )
1046+
1047+ user ["attrib" ] = attrib
1048+
10331049 yield user
10341050
10351051 def get_user_by_name (
@@ -1089,10 +1105,9 @@ def get_user(
10891105 response .raise_for_status ()
10901106 user = response .data
10911107
1092- # NOTE Server does return only filled attributes right now.
1093- # This would fill all missing attributes with 'None'.
1094- # for attr_name in self.get_attributes_for_type("user"):
1095- # user["attrib"].setdefault(attr_name, None)
1108+ attributes = self .get_attributes_for_type ("user" )
1109+ for attr_name , attr_data in attributes .items ():
1110+ user ["attrib" ].setdefault (attr_name , attr_data ["default" ])
10961111
10971112 fill_own_attribs (user )
10981113 return user
@@ -2124,6 +2139,9 @@ def get_default_fields_for_type(self, entity_type: str) -> set[str]:
21242139 if entity_type == "activity" :
21252140 return set (DEFAULT_ACTIVITY_FIELDS )
21262141
2142+ if entity_type == "productType" :
2143+ return set (DEFAULT_PRODUCT_TYPE_FIELDS )
2144+
21272145 if entity_type == "project" :
21282146 entity_type_defaults = set (DEFAULT_PROJECT_FIELDS )
21292147 maj_v , min_v , patch_v , _ , _ = self .server_version_tuple
@@ -2154,9 +2172,6 @@ def get_default_fields_for_type(self, entity_type: str) -> set[str]:
21542172 if not self .graphql_allows_traits_in_representations :
21552173 entity_type_defaults .discard ("traits" )
21562174
2157- elif entity_type == "productType" :
2158- entity_type_defaults = set (DEFAULT_PRODUCT_TYPE_FIELDS )
2159-
21602175 elif entity_type == "workfile" :
21612176 entity_type_defaults = set (DEFAULT_WORKFILE_INFO_FIELDS )
21622177
@@ -2165,15 +2180,13 @@ def get_default_fields_for_type(self, entity_type: str) -> set[str]:
21652180
21662181 elif entity_type == "entityList" :
21672182 entity_type_defaults = set (DEFAULT_ENTITY_LIST_FIELDS )
2168- # Attributes scope is 'list'
2169- entity_type = "list"
21702183
21712184 else :
21722185 raise ValueError (f"Unknown entity type \" { entity_type } \" " )
2173- return (
2174- entity_type_defaults
2175- | self . get_attributes_fields_for_type ( entity_type )
2176- )
2186+
2187+ entity_type_defaults . add ( "allAttrib" )
2188+
2189+ return entity_type_defaults
21772190
21782191 def get_rest_entity_by_id (
21792192 self ,
0 commit comments