From 23e6cab89fdd5f253e8b0a334788bf7aa4274ef6 Mon Sep 17 00:00:00 2001 From: Jean-Paul Smets <jp@nexedi.com> Date: Tue, 4 May 2004 08:07:31 +0000 Subject: [PATCH] propagate acquisition for acquired_membership git-svn-id: https://svn.erp5.org/repos/public/erp5/trunk@812 20353a03-c40f-0410-a6d1-a30d3c3de9de --- product/CMFCategory/CategoryTool.py | 53 +++++++++++++++++++++-------- product/ERP5Type/Base.py | 8 +++-- 2 files changed, 44 insertions(+), 17 deletions(-) diff --git a/product/CMFCategory/CategoryTool.py b/product/CMFCategory/CategoryTool.py index d3e8266a46..7a8d2e7282 100755 --- a/product/CMFCategory/CategoryTool.py +++ b/product/CMFCategory/CategoryTool.py @@ -746,16 +746,26 @@ class CategoryTool( UniqueObject, Folder, Base ): #LOG("Get Acquired Category ",0,str((base_category, context))) # XXX We must use filters in the future # query = self._buildQuery(spec, filter, kw) - if acquired_object_dict is None: - acquired_object_dict = {} portal_type = kw.get('portal_type', ()) if spec is (): spec = portal_type # This is bad XXX - JPS - spec is for meta_type, not for portal_type - be consistent ! if type(spec) is type('a'): spec = [spec] + + if acquired_object_dict is None: + acquired_object_dict = {} + else: + context_key = (context.getPhysicalPath(), base_category, portal_type) # Prevents recursion in category acquisition + if context_key in acquired_object_dict: + # Stop recursion if this object if already used + return [] + else: + acquired_object_dict[context_key] = 1 + result = self.getSingleCategoryMembershipList( context, base_category, base=base, spec=spec, filter=filter, **kw ) + base_category_value = self.getCategoryValue(base_category) if base_category_value is not None: # If we do not mask or append, return now if not empty @@ -767,10 +777,11 @@ class CategoryTool( UniqueObject, Folder, Base ): # First we look at local ids for object_id in base_category_value.getAcquisitionObjectIdList(): my_acquisition_object = context.get(object_id) - if my_acquisition_object in acquired_object_dict: - continue - acquired_object_dict[my_acquisition_object] = 1 if my_acquisition_object is not None: + #my_acquisition_object_path = my_acquisition_object.getPhysicalPath() + #if my_acquisition_object_path in acquired_object_dict: + # continue + #acquired_object_dict[my_acquisition_object_path] = 1 if spec is () or my_acquisition_object.portal_type in base_category_value.getAcquisitionPortalTypeList(): new_result = self.getSingleCategoryAcquiredMembershipList(my_acquisition_object, base_category, spec=spec, filter=filter, portal_type=portal_type, base=base, acquired_object_dict=acquired_object_dict) @@ -797,13 +808,27 @@ class CategoryTool( UniqueObject, Folder, Base ): #LOG("Parent Object List ",0,str(parent.getRelativeUrl())) #LOG("Parent Object List ",0,str(parent.portal_type)) #LOG("Parent Object List ",0,str(acquisition_pt)) + #my_acquisition_object_path = parent.getPhysicalPath() + #if my_acquisition_object_path in acquired_object_dict: if acquisition_pt is () or parent.portal_type in acquisition_pt: - my_acquisition_object_list = [parent] + my_acquisition_object_list = [parent] else: my_acquisition_object_list = [] + #else: + # my_acquisition_object_list = [] else: - my_acquisition_object_list = context.getValueList(my_base_category, - portal_type=tuple(base_category_value.getAcquisitionPortalTypeList(()))) + #LOG('getAcquiredCategoryMembershipList', 0, 'my_acquisition_object = %s, acquired_object_dict = %s' % (str(context), str(acquired_object_dict))) + my_acquisition_list = self.getAcquiredCategoryMembershipList(context, + my_base_category, + portal_type=tuple(base_category_value.getAcquisitionPortalTypeList(())), + acquired_object_dict=acquired_object_dict) + my_acquisition_object_list = [] + for c in my_acquisition_object_list: + o = self.resolveCategory(c) + if o is not None: + my_acquisition_object_list.append(o) + #my_acquisition_object_list = context.getValueList(my_base_category, + # portal_type=tuple(base_category_value.getAcquisitionPortalTypeList(()))) #LOG("Get Acquired PT",0,str(base_category.getAcquisitionPortalTypeList(()))) #LOG("Object List ",0,str(my_acquisition_object_list)) original_result = result @@ -814,10 +839,10 @@ class CategoryTool( UniqueObject, Folder, Base ): #LOG('getSingleCategoryAcquiredMembershipList', 0, 'my_acquisition_object.__hash__ = %s' % str(my_acquisition_object.__hash__())) #if my_acquisition_object is not None: if my_acquisition_object is not None: - if hasattr(my_acquisition_object, '__hash__'): - if my_acquisition_object in acquired_object_dict: - continue - acquired_object_dict[my_acquisition_object] = 1 + #my_acquisition_object_path = my_acquisition_object.getPhysicalPath() + #if my_acquisition_object_path in acquired_object_dict: + # continue + #acquired_object_dict[my_acquisition_object_path] = 1 if hasattr(my_acquisition_object, '_categories'): # We should only consider objects which define that category if base_category in my_acquisition_object._categories: @@ -855,7 +880,7 @@ class CategoryTool( UniqueObject, Folder, Base ): security.declareProtected( Permissions.AccessContentsInformation, 'getAcquiredCategoryMembershipList' ) def getAcquiredCategoryMembershipList(self, context, base_category = None, base=1, - spec=(), filter=None, **kw): + spec=(), filter=None, acquired_object_dict=None, **kw): """ Returns all acquired category values """ @@ -869,7 +894,7 @@ class CategoryTool( UniqueObject, Folder, Base ): base_category_list = base_category for base_category in base_category_list: result += self.getSingleCategoryAcquiredMembershipList(context, base_category, base=base, - spec=spec, filter=filter, **kw ) + spec=spec, filter=filter, acquired_object_dict=acquired_object_dict, **kw ) return result security.declareProtected( Permissions.AccessContentsInformation, 'isMemberOf' ) diff --git a/product/ERP5Type/Base.py b/product/ERP5Type/Base.py index baaff3b09f..7dc82a9a51 100755 --- a/product/ERP5Type/Base.py +++ b/product/ERP5Type/Base.py @@ -197,7 +197,8 @@ class Base( CopyContainer, PortalContent, Base18, ActiveObject, ERP5PropertyMana return getattr(self, storage_id) # Retrieve the list of related objects #LOG("Get Acquired Property portal_type",0,str(portal_type)) - super_list = self._getValueList(base_category, portal_type=portal_type) # We only do a single jump + #super_list = self._getValueList(base_category, portal_type=portal_type) # We only do a single jump + super_list = self._getAcquiredValueList(base_category, portal_type=portal_type) # We only do a single jump #LOG("Get Acquired Property super_list",0,str(super_list)) #LOG("Get Acquired Property accessor_id",0,str(accessor_id)) if len(super_list) > 0: @@ -281,7 +282,8 @@ class Base( CopyContainer, PortalContent, Base18, ActiveObject, ERP5PropertyMana super = None psuper = [] for cat in base_category: - super_list = self._getValueList(cat) # We only do a single jump - no acquisition + #super_list = self._getValueList(cat) # We only do a single jump - no acquisition + super_list = self._getAcquiredValueList(cat) # We only do a single jump - no acquisition for super in super_list: if super is not None: # Performance should be increased @@ -706,7 +708,7 @@ class Base( CopyContainer, PortalContent, Base18, ActiveObject, ERP5PropertyMana security.declareProtected( Permissions.View, '_getDefaultRelatedValue' ) def _getDefaultRelatedValue(self, id, spec=(), filter=None, portal_type=()): - value_list =self._getCategoryTool().getRelatedValueList(self, id, spec=spec, filter=filter, portal_type=portal_type) + value_list =self._getRelatedValueList(id, spec=spec, filter=filter, portal_type=portal_type) try: return value_list[0] except: -- 2.30.9