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