[Erp5-report] r24792 - in /erp5/trunk/products/ERP5Catalog: ./ tests/

nobody at svn.erp5.org nobody at svn.erp5.org
Thu Dec 4 16:23:28 CET 2008


Author: romain
Date: Thu Dec  4 16:23:21 2008
New Revision: 24792

URL: http://svn.erp5.org?rev=24792&view=rev
Log:
Add Dynamic Related Key based on related accessors

Modified:
    erp5/trunk/products/ERP5Catalog/CatalogTool.py
    erp5/trunk/products/ERP5Catalog/tests/testERP5Catalog.py

Modified: erp5/trunk/products/ERP5Catalog/CatalogTool.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5Catalog/CatalogTool.py?rev=24792&r1=24791&r2=24792&view=diff
==============================================================================
--- erp5/trunk/products/ERP5Catalog/CatalogTool.py [utf8] (original)
+++ erp5/trunk/products/ERP5Catalog/CatalogTool.py [utf8] Thu Dec  4 16:23:21 2008
@@ -174,20 +174,28 @@
 class RelatedBaseCategory(Method):
     """A Dynamic Method to act as a related key.
     """
-    def __init__(self, id,strict_membership=0):
+    def __init__(self, id, strict_membership=0, related=0):
       self._id = id
       self.strict_membership=strict_membership
+      self.related = related
 
     def __call__(self, instance, table_0, table_1, query_table='catalog', **kw):
       """Create the sql code for this related key."""
       base_category_uid = instance.portal_categories._getOb(self._id).getUid()
       expression_list = []
       append = expression_list.append
-      append('%s.uid = %s.category_uid' % (table_1,table_0))
-      if self.strict_membership:
-        append('AND %s.category_strict_membership = 1' % table_0)
-      append('AND %s.base_category_uid = %s' % (table_0,base_category_uid))
-      append('AND %s.uid = %s.uid' % (table_0,query_table))
+      if self.related:
+        append('%s.uid = %s.uid' % (table_1,table_0))
+        if self.strict_membership:
+          append('AND %s.category_strict_membership = 1' % table_0)
+        append('AND %s.base_category_uid = %s' % (table_0,base_category_uid))
+        append('AND %s.category_uid = %s.uid' % (table_0,query_table))
+      else:
+        append('%s.uid = %s.category_uid' % (table_1,table_0))
+        if self.strict_membership:
+          append('AND %s.category_strict_membership = 1' % table_0)
+        append('AND %s.base_category_uid = %s' % (table_0,base_category_uid))
+        append('AND %s.uid = %s.uid' % (table_0,query_table))
       return ' '.join(expression_list)
 
 class CatalogTool (UniqueObject, ZCatalog, CMFCoreCatalogTool, ActiveObject):
@@ -864,17 +872,34 @@
              expected_base_cat_id in base_cat_id_list:
             # We have found a base_category
             end_key = '_'.join(splitted_key[i:])
-            # accept only some catalog columns
-            if end_key in ('title', 'uid', 'description', 'reference',
-                           'relative_url', 'id', 'portal_type'):
-              if strict:
-                related_key_list.append(
-                      '%s%s | category,catalog/%s/z_related_strict_%s' %
-                      (prefix, key, end_key, expected_base_cat_id))
-              else:
-                related_key_list.append(
-                      '%s%s | category,catalog/%s/z_related_%s' %
-                      (prefix, key, end_key, expected_base_cat_id))
+
+            if end_key.startswith('related_'):
+              end_key = end_key[len('related_'):]
+              # accept only some catalog columns
+              if end_key in ('title', 'uid', 'description', 'reference',
+                             'relative_url', 'id', 'portal_type',
+                             'simulation_state'):
+                if strict:
+                  related_key_list.append(
+                        '%s%s | category,catalog/%s/z_related_strict_%s_related' %
+                        (prefix, key, end_key, expected_base_cat_id))
+                else:
+                  related_key_list.append(
+                        '%s%s | category,catalog/%s/z_related_%s_related' %
+                        (prefix, key, end_key, expected_base_cat_id))
+            else:
+              # accept only some catalog columns
+              if end_key in ('title', 'uid', 'description', 'reference',
+                             'relative_url', 'id', 'portal_type',
+                             'simulation_state'):
+                if strict:
+                  related_key_list.append(
+                        '%s%s | category,catalog/%s/z_related_strict_%s' %
+                        (prefix, key, end_key, expected_base_cat_id))
+                else:
+                  related_key_list.append(
+                        '%s%s | category,catalog/%s/z_related_%s' %
+                        (prefix, key, end_key, expected_base_cat_id))
 
       return related_key_list
 
@@ -891,12 +916,23 @@
         zope_security = '__roles__'
         if (name.startswith(DYNAMIC_METHOD_NAME) and \
           (not name.endswith(zope_security))):
-          if name.startswith(STRICT_DYNAMIC_METHOD_NAME):
-            base_category_id = name[len(STRICT_DYNAMIC_METHOD_NAME):]
-            method = RelatedBaseCategory(base_category_id, strict_membership=1)
+
+          if name.endswith('_related'):
+            if name.startswith(STRICT_DYNAMIC_METHOD_NAME):
+              base_category_id = name[len(STRICT_DYNAMIC_METHOD_NAME):-len('_related')]
+              method = RelatedBaseCategory(base_category_id,
+                                           strict_membership=1, related=1)
+            else:
+              base_category_id = name[len(DYNAMIC_METHOD_NAME):-len('_related')]
+              method = RelatedBaseCategory(base_category_id, related=1)
           else:
-            base_category_id = name[len(DYNAMIC_METHOD_NAME):]
-            method = RelatedBaseCategory(base_category_id)
+            if name.startswith(STRICT_DYNAMIC_METHOD_NAME):
+              base_category_id = name[len(STRICT_DYNAMIC_METHOD_NAME):]
+              method = RelatedBaseCategory(base_category_id, strict_membership=1)
+            else:
+              base_category_id = name[len(DYNAMIC_METHOD_NAME):]
+              method = RelatedBaseCategory(base_category_id)
+
           setattr(self.__class__, name, method)
           klass = aq_base(self).__class__
           if hasattr(klass, 'security'):

Modified: erp5/trunk/products/ERP5Catalog/tests/testERP5Catalog.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5Catalog/tests/testERP5Catalog.py?rev=24792&r1=24791&r2=24792&view=diff
==============================================================================
--- erp5/trunk/products/ERP5Catalog/tests/testERP5Catalog.py [utf8] (original)
+++ erp5/trunk/products/ERP5Catalog/tests/testERP5Catalog.py [utf8] Thu Dec  4 16:23:21 2008
@@ -2823,6 +2823,144 @@
                        Query(site_title='=foo2'),
                        operator='AND'))
 
+  def test_SearchFolderWithRelatedDynamicRelatedKey(self,
+                                  quiet=quiet, run=run_all_test):
+    if not run: return
+    if not quiet:
+      message = 'Search Folder With Related Dynamic Related Key'
+      ZopeTestCase._print('\n%s ' % message)
+      LOG('Testing... ',0,message)
+
+    # Create some objects
+    portal = self.getPortal()
+    portal_category = self.getCategoryTool()
+    portal_category.group.manage_delObjects([x for x in
+        portal_category.group.objectIds()])
+    group_nexedi_category = portal_category.group\
+                                .newContent( id = 'nexedi', title='Nexedi',
+                                             description='a')
+    group_nexedi_category2 = portal_category.group\
+                                .newContent( id = 'storever', title='Storever',
+                                             description='b')
+    module = portal.getDefaultModule('Organisation')
+    organisation = module.newContent(portal_type='Organisation',
+                                     title='Nexedi Orga',
+                                     description='c')
+    organisation.setGroup('nexedi')
+    self.assertEquals(organisation.getGroupValue(), group_nexedi_category)
+    organisation2 = module.newContent(portal_type='Organisation',
+                                      title='Storever Orga',
+                                      description='d')
+    organisation2.setGroup('storever')
+    organisation2.setTitle('Organisation 2')
+    self.assertEquals(organisation2.getGroupValue(), group_nexedi_category2)
+    # Flush message queue
+    get_transaction().commit()
+    self.tic()
+
+    base_category = portal_category.group
+    # Try to get the category with the group related organisation title Nexedi
+    # Orga
+    category_list = [x.getObject() for x in 
+                         base_category.searchFolder(
+                           group_related_title='Nexedi Orga')]
+    self.assertEquals(category_list, [group_nexedi_category])
+    category_list = [x.getObject() for x in 
+                         base_category.searchFolder(
+                           default_group_related_title='Nexedi Orga')]
+    self.assertEquals(category_list, [group_nexedi_category])
+    # Try to get the category with the group related organisation id
+    category_list = [x.getObject() for x in 
+                         base_category.searchFolder(group_related_id='storever')]
+    self.assertEquals(category_list,[group_nexedi_category2])
+    # Try to get the category with the group related organisation description 'd'
+    category_list = [x.getObject() for x in 
+                         base_category.searchFolder(group_related_description='d')]
+    self.assertEquals(category_list,[group_nexedi_category2])
+    # Try to get the category with the group related organisation description
+    # 'e'
+    category_list = [x.getObject() for x in 
+                         base_category.searchFolder(group_related_description='e')]
+    self.assertEquals(category_list,[])
+    # Try to get the category with the default group related organisation description
+    # 'e'
+    category_list = [x.getObject() for x in 
+                         base_category.searchFolder(default_group_related_description='e')]
+    self.assertEquals(category_list,[])
+    # Try to get the category with the group related organisation relative_url
+    organisation_relative_url = organisation.getRelativeUrl()
+    category_list = [x.getObject() for x in 
+                 base_category.searchFolder(group_related_relative_url=organisation_relative_url)]
+    self.assertEquals(category_list, [group_nexedi_category])
+    # Try to get the category with the group related organisation uid
+    category_list = [x.getObject() for x in 
+                 base_category.searchFolder(group_related_uid=organisation.getUid())]
+    self.assertEquals(category_list, [group_nexedi_category])
+    # Try to get the category with the group related organisation id and title
+    # of the category
+    category_list = [x.getObject() for x in 
+                         base_category.searchFolder(group_related_id=organisation2.getId(),
+                                             title='Storever')]
+    self.assertEquals(category_list,[group_nexedi_category2])
+
+  def test_SearchFolderWithRelatedDynamicStrictRelatedKey(self,
+                                  quiet=quiet, run=run_all_test):
+    if not run: return
+    if not quiet:
+      message = 'Search Folder With Related Strict Dynamic Related Key'
+      ZopeTestCase._print('\n%s ' % message)
+      LOG('Testing... ',0,message)
+
+    # Create some objects
+    portal = self.getPortal()
+    portal_category = self.getCategoryTool()
+    portal_category.group.manage_delObjects([x for x in
+        portal_category.group.objectIds()])
+    group_nexedi_category = portal_category.group\
+                                .newContent( id = 'nexedi', title='Nexedi',
+                                             description='a')
+    sub_group_nexedi = group_nexedi_category\
+                                .newContent( id = 'erp5', title='ERP5',
+                                             description='b')
+    module = portal.getDefaultModule('Organisation')
+    organisation = module.newContent(portal_type='Organisation',
+                                     title='ERP5 Orga',
+                                     description='c')
+    organisation.setGroup('nexedi/erp5')
+    self.assertEquals(organisation.getGroupValue(), sub_group_nexedi)
+    organisation2 = module.newContent(portal_type='Organisation',
+                                     title='Nexedi Orga',
+                                     description='d')
+    organisation2.setGroup('nexedi')
+    # Flush message queue
+    get_transaction().commit()
+    self.tic()
+
+    base_category = portal_category.group
+
+    # Try to get the category with the group related organisation title Nexedi
+    # Orga
+    category_list = [x.getObject() for x in 
+                         base_category.portal_catalog(
+                             strict_group_related_title='Nexedi Orga')]
+    self.assertEquals(category_list,[group_nexedi_category])
+    # Try to get the category with the group related organisation title ERP5
+    # Orga
+    category_list = [x.getObject() for x in 
+                         base_category.portal_catalog(
+                           strict_group_related_title='ERP5 Orga')]
+    self.assertEquals(category_list,[sub_group_nexedi])
+    # Try to get the category with the group related organisation description d
+    category_list = [x.getObject() for x in 
+                         base_category.portal_catalog(
+                           strict_group_related_description='d')]
+    self.assertEquals(category_list,[group_nexedi_category])
+    # Try to get the category with the group related organisation description c
+    category_list = [x.getObject() for x in 
+                         base_category.portal_catalog(
+                           strict_group_related_description='c')]
+    self.assertEquals(category_list,[sub_group_nexedi])
+
 def test_suite():
   suite = unittest.TestSuite()
   suite.addTest(unittest.makeSuite(TestERP5Catalog))




More information about the Erp5-report mailing list