diff --git a/product/ERP5Security/ERP5GroupManager.py b/product/ERP5Security/ERP5GroupManager.py index d0e9374377880445bd8468dd5196618485feb9a9..372a7110cefc1ba9e6941b2ad95949312ee74150 100644 --- a/product/ERP5Security/ERP5GroupManager.py +++ b/product/ERP5Security/ERP5GroupManager.py @@ -93,88 +93,85 @@ class ERP5GroupManager(BasePlugin): security_group_list = [] security_definition_list = () - try: - # To get the complete list of groups, we try to call the - # ERP5Type_getSecurityCategoryMapping which should return a list - # of lists of two elements (script, base_category_list) like : - # ( - # ('script_1', ['base_category_1', 'base_category_2', ...]), - # ('script_2', ['base_category_1', 'base_category_3', ...]) - # ) - # - # else, if the script does not exist, falls back to a list containng - # only one list : - # (('ERP5Type_getSecurityCategoryFromAssignment', - # self.getPortalAssignmentBaseCategoryList() ),) - - mapping_method = getattr(self, - 'ERP5Type_getSecurityCategoryMapping', None) - if mapping_method is None: - security_definition_list = (( - 'ERP5Type_getSecurityCategoryFromAssignment', - self.getPortalAssignmentBaseCategoryList() - ),) - else: - security_definition_list = mapping_method() - - # get the person from its login - no security check needed - user_path_set = { - x['path'] - for x in self.searchUsers(id=user_id, exact_match=True) - if 'path' in x - } - if not user_path_set: - return () - user_path, = user_path_set - person_object = self.getPortalObject().unrestrictedTraverse(user_path) - - # Fetch category values from defined scripts - for (method_name, base_category_list) in security_definition_list: - base_category_list = tuple(base_category_list) - security_category_list = security_category_dict.setdefault( - base_category_list, []) + # To get the complete list of groups, we try to call the + # ERP5Type_getSecurityCategoryMapping which should return a list + # of lists of two elements (script, base_category_list) like : + # ( + # ('script_1', ['base_category_1', 'base_category_2', ...]), + # ('script_2', ['base_category_1', 'base_category_3', ...]) + # ) + # + # else, if the script does not exist, falls back to a list containng + # only one list : + # (('ERP5Type_getSecurityCategoryFromAssignment', + # self.getPortalAssignmentBaseCategoryList() ),) + + mapping_method = getattr(self, + 'ERP5Type_getSecurityCategoryMapping', None) + if mapping_method is None: + security_definition_list = (( + 'ERP5Type_getSecurityCategoryFromAssignment', + self.getPortalAssignmentBaseCategoryList() + ),) + else: + security_definition_list = mapping_method() + + # get the person from its login - no security check needed + user_path_set = { + x['path'] + for x in self.searchUsers(id=user_id, exact_match=True) + if 'path' in x + } + if not user_path_set: + return () + user_path, = user_path_set + person_object = self.getPortalObject().unrestrictedTraverse(user_path) + + # Fetch category values from defined scripts + for (method_name, base_category_list) in security_definition_list: + base_category_list = tuple(base_category_list) + security_category_list = security_category_dict.setdefault( + base_category_list, []) + try: + # The called script may want to distinguish if it is called + # from here or from _updateLocalRolesOnSecurityGroups. + # Currently, passing portal_type='' (instead of 'Person') + # is the only way to make the difference. + method = getattr(self, method_name) + security_category_list.extend( + method(base_category_list, user_id, person_object, '') + ) + except ConflictError: + raise + except: + LOG('ERP5GroupManager', WARNING, + 'could not get security categories from %s' % (method_name,), + error = sys.exc_info()) + + # Get group names from category values + # XXX try ERP5Type_asSecurityGroupIdList first for compatibility + generator_name = 'ERP5Type_asSecurityGroupIdList' + group_id_list_generator = getattr(self, generator_name, None) + if group_id_list_generator is None: + generator_name = ERP5TYPE_SECURITY_GROUP_ID_GENERATION_SCRIPT + group_id_list_generator = getattr(self, generator_name, None) + for base_category_list, category_value_list in \ + security_category_dict.iteritems(): + for category_dict in category_value_list: try: - # The called script may want to distinguish if it is called - # from here or from _updateLocalRolesOnSecurityGroups. - # Currently, passing portal_type='' (instead of 'Person') - # is the only way to make the difference. - method = getattr(self, method_name) - security_category_list.extend( - method(base_category_list, user_id, person_object, '') - ) + group_id_list = group_id_list_generator( + category_order=base_category_list, + **category_dict) + if isinstance(group_id_list, str): + group_id_list = [group_id_list] + security_group_list.extend(group_id_list) except ConflictError: raise except: LOG('ERP5GroupManager', WARNING, - 'could not get security categories from %s' % (method_name,), + 'could not get security groups from %s' % + generator_name, error = sys.exc_info()) - - # Get group names from category values - # XXX try ERP5Type_asSecurityGroupIdList first for compatibility - generator_name = 'ERP5Type_asSecurityGroupIdList' - group_id_list_generator = getattr(self, generator_name, None) - if group_id_list_generator is None: - generator_name = ERP5TYPE_SECURITY_GROUP_ID_GENERATION_SCRIPT - group_id_list_generator = getattr(self, generator_name, None) - for base_category_list, category_value_list in \ - security_category_dict.iteritems(): - for category_dict in category_value_list: - try: - group_id_list = group_id_list_generator( - category_order=base_category_list, - **category_dict) - if isinstance(group_id_list, str): - group_id_list = [group_id_list] - security_group_list.extend(group_id_list) - except ConflictError: - raise - except: - LOG('ERP5GroupManager', WARNING, - 'could not get security groups from %s' % - generator_name, - error = sys.exc_info()) - finally: - pass return tuple(security_group_list) if not NO_CACHE_MODE: