diff --git a/product/CMFCategory/CategoryTool.py b/product/CMFCategory/CategoryTool.py index ba678282de361f6af8d0bde910ab24dc2224f8d2..f0f6102b21b51fbc2cd5bf649f0c19824243756d 100755 --- a/product/CMFCategory/CategoryTool.py +++ b/product/CMFCategory/CategoryTool.py @@ -694,6 +694,7 @@ class CategoryTool( UniqueObject, Folder, Base ): return [] result = [] + append = result.append # XXX We must use filters in the future # where_expression = self._buildQuery(spec, filter, kw) spec = kw.get('portal_type', ()) @@ -703,15 +704,16 @@ class CategoryTool( UniqueObject, Folder, Base ): # Filter categories if hasattr(context, 'categories'): for category_url in self._getCategoryList(context): - my_base_category = category_url.split('/')[0] + index = category_url.index('/') + my_base_category = category_url[:index] if my_base_category == base_category: #LOG("getSingleCategoryMembershipList",0,"%s %s %s %s" % (context.getRelativeUrl(), # my_base_category, base_category, category_url)) if spec is (): if base: - result += [category_url] + append(category_url) else: - result += [category_url[len(my_base_category)+1:]] + append(category_url[len(my_base_category)+1:]) else: try: my_reference = self.unrestrictedTraverse(category_url) @@ -721,12 +723,11 @@ class CategoryTool( UniqueObject, Folder, Base ): if my_reference is not None: if my_reference.portal_type in spec: if base: - result += [category_url] + append(category_url) else: - result += [category_url[len(my_base_category)+1:]] + append(category_url[len(my_base_category)+1:]) return result - security.declareProtected( Permissions.AccessContentsInformation, 'getSingleCategoryAcquiredMembershipList' ) def getSingleCategoryAcquiredMembershipList(self, context, base_category, base=0, @@ -774,8 +775,8 @@ class CategoryTool( UniqueObject, Folder, Base ): else: context_base_key = (tuple(context.getPhysicalPath()), base_category) if context_base_key in acquired_object_dict: - acquired_object_dict = deepcopy(acquired_object_dict) - type_dict = acquired_object_dict[context_base_key] + acquired_object_dict = acquired_object_dict.copy() + type_dict = acquired_object_dict[context_base_key].copy() if spec is (): if () in type_dict: return [] @@ -787,6 +788,7 @@ class CategoryTool( UniqueObject, Folder, Base ): return [] else: type_dict[pt] = 1 + acquired_object_dict[context_base_key] = type_dict else: type_dict = {} if spec is (): @@ -794,7 +796,7 @@ class CategoryTool( UniqueObject, Folder, Base ): else: for pt in spec: type_dict[pt] = 1 - acquired_object_dict = deepcopy(acquired_object_dict) + acquired_object_dict = acquired_object_dict.copy() acquired_object_dict[context_base_key] = type_dict result = self.getSingleCategoryMembershipList( context, base_category, base=base, @@ -829,7 +831,7 @@ class CategoryTool( UniqueObject, Folder, Base ): # return new_result if base_category_value.acquisition_append_value: # If acquisition appends, then we must append to the result - result += new_result + result.extend(new_result) elif len(new_result) > 0: return new_result # Found enough information to return # Next we look at references @@ -899,7 +901,7 @@ class CategoryTool( UniqueObject, Folder, Base ): new_result = [] if base_category_value.acquisition_append_value: # If acquisition appends, then we must append to the result - result += new_result + result.extend(new_result) elif len(new_result) > 0: #LOG("new_result ",0,str(new_result)) if (base_category_value.acquisition_copy_value and len(original_result) == 0) \ @@ -925,18 +927,20 @@ class CategoryTool( UniqueObject, Folder, Base ): category_list = self.getSingleCategoryAcquiredMembershipList( context, base_category, base=1, spec=spec, filter=filter, acquired_object_dict=acquired_object_dict, **kw ) # Then convert it into value - category_value_list = map(lambda x: self.resolveCategory(x), category_list) + category_value_list = [self.resolveCategory(x) for x in category_list] #category_value_list = _.filter(lambda x: x is not None, category_value_list) # Then build the alternate category if base: - result += map(lambda x: '%s/%s' % (base_category_value.getId(), x.getRelativeUrl()), - category_value_list) + base_category_id = base_category_value.getId() + for category_value in category_value_list: + result.append('%s/%s' % (base_category_id, category_value.getRelativeUrl())) else: - result += map(lambda x: x.getRelativeUrl(), category_value_list) + for category_value in category_value_list: + result.append(category_value.getRelativeUrl()) # WE MUST IMPLEMENT HERE THE REST OF THE SEMANTICS #LOG("Get Acquired Category Result ",0,str(result)) return result - + security.declareProtected( Permissions.AccessContentsInformation, 'getAcquiredCategoryMembershipList' ) def getAcquiredCategoryMembershipList(self, context, base_category = None, base=1, @@ -946,6 +950,7 @@ class CategoryTool( UniqueObject, Folder, Base ): """ #LOG("Get Acquired Category List", 0, "%s %s" % (base_category, context.getRelativeUrl())) result = [] + extend = result.extend if base_category is None: base_category_list = context._categories # XXX incompatible with ERP5Type per portal categories elif type(base_category) is type('a'): @@ -953,9 +958,10 @@ class CategoryTool( UniqueObject, Folder, Base ): else: base_category_list = base_category #LOG('CT.getAcquiredCategoryMembershipList base_category_list',0,base_category_list) + getSingleCategoryAcquiredMembershipList = self.getSingleCategoryAcquiredMembershipList for base_category in base_category_list: - result += self.getSingleCategoryAcquiredMembershipList(context, base_category, base=base, - spec=spec, filter=filter, acquired_object_dict=acquired_object_dict, **kw ) + extend(getSingleCategoryAcquiredMembershipList(context, base_category, base=base, + spec=spec, filter=filter, acquired_object_dict=acquired_object_dict, **kw )) #LOG('CT.getAcquiredCategoryMembershipList new result',0,result) return result @@ -1054,11 +1060,11 @@ class CategoryTool( UniqueObject, Folder, Base ): else: result = [] elif type(context) is type({}): - result = context.get('categories', {}) + result = context.get('categories', []) else: result = [] if getattr(context, 'isCategory', 0): - result = tuple(list(result) + [context.getRelativeUrl()]) # Pure category is member of itself + result.append(context.getRelativeUrl()) # Pure category is member of itself return result security.declareProtected( Permissions.ModifyPortalContent, '_setCategoryList' ) @@ -1077,13 +1083,14 @@ class CategoryTool( UniqueObject, Folder, Base ): def _getAcquiredCategoryList(self, context): result = self.getAcquiredCategoryMembershipList(context, base_category = self.getBaseCategoryList(context=context)) + append = result.append non_acquired = self._getCategoryList(context) for c in non_acquired: # Make sure all local categories are considered if c not in result: - result.append(c) + append(c) if getattr(context, 'isCategory', 0): - result = tuple(list(result) + [context.getRelativeUrl()]) # Pure category is member of itself + append(context.getRelativeUrl()) # Pure category is member of itself return result security.declareProtected( Permissions.ModifyPortalContent, '_cleanupCategories' ) @@ -1092,10 +1099,11 @@ class CategoryTool( UniqueObject, Folder, Base ): # or we get many conflicts requires_update = 0 categories = [] + append = categories.append if hasattr(context, 'categories'): for cat in self._getCategoryList(context): if type(cat) == type('a'): - categories += [cat] + append(cat) else: requires_update = 1 if requires_update: self._setCategoryList(context, tuple(categories))