[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