[Erp5-report] r6576 - in /erp5/trunk/products/ERP5Catalog: ./ tests/
nobody at svn.erp5.org
nobody at svn.erp5.org
Thu Apr 13 13:29:12 CEST 2006
Author: seb
Date: Thu Apr 13 13:29:11 2006
New Revision: 6576
URL: http://svn.erp5.org?rev=6576&view=rev
Log:
added support and unit test for dynamic keys
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=6576&r1=6575&r2=6576&view=diff
==============================================================================
--- erp5/trunk/products/ERP5Catalog/CatalogTool.py (original)
+++ erp5/trunk/products/ERP5Catalog/CatalogTool.py Thu Apr 13 13:29:11 2006
@@ -43,6 +43,7 @@
from Products.PageTemplates.Expressions import SecureModuleImporter
from Products.CMFCore.Expression import Expression
from Products.PageTemplates.Expressions import getEngine
+from MethodObject import Method
import os, time, urllib
from zLOG import LOG
@@ -119,6 +120,20 @@
del allowed['Owner']
#LOG("allowedRolesAndUsers",0,str(allowed.keys()))
return list(allowed.keys())
+
+class RelatedBaseCategory(Method):
+
+ def __init__(self, id):
+ self._id = id
+
+ def __call__(self, instance, table_0, table_1, query_table='catalog',**kw):
+ 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))
+ 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):
"""
@@ -511,7 +526,61 @@
property_dict['membership_criterion_category_list'] = object.getMembershipCriterionCategoryList()
return property_dict
-
+ security.declarePrivate('getDynamicRelatedKeyList')
+ def getDynamicRelatedKeyList(self, sql_catalog_id=None,**kw):
+ """
+ Return the list of related keys.
+ This method will try to automatically generate new related key
+ by looking at the category tree.
+ """
+ if len(kw)>0:
+ # import pdb;pdb.set_trace()
+ pass
+ related_key_list = []
+ base_cat_id_list = self.portal_categories.getBaseCategoryList()
+ for key in kw.keys():
+ splitted_key = key.split('_')
+ for i in range(1,len(splitted_key))[::-1]:
+ expected_base_cat_id = '_'.join(splitted_key[0:i])
+ if expected_base_cat_id!='parent' and \
+ expected_base_cat_id in base_cat_id_list:
+ # We have found a base_category
+ end_key = '_'.join(splitted_key[i:])
+ if end_key in ('title','uid','description','id'):
+ related_key_list.append('%s | category,catalog/%s/z_related_%s' %
+ (key,end_key,expected_base_cat_id))
+
+ return related_key_list
+
+ def _aq_dynamic(self, name):
+ """
+ Automatic related key generation.
+ Will generate z_related_destination if possible
+ """
+ aq_base_name = getattr(aq_base(self), name, None)
+ if aq_base_name == None:
+ DYNAMIC_METHOD_NAME = 'z_related_'
+ method_name_length = len(DYNAMIC_METHOD_NAME)
+
+ zope_security = '__roles__'
+ if (name.startswith(DYNAMIC_METHOD_NAME) and \
+ (not name.endswith(zope_security))):
+ 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'):
+ from Products.ERP5Type import Permissions as ERP5Permissions
+ klass.security.declareProtected(ERP5Permissions.View, name)
+ else:
+ # XXX security declaration always failed....
+ LOG('WARNING ERP5Form SelectionTool, security not defined on',
+ 0, klass.__name__)
+ return getattr(self, name)
+ else:
+ return aq_base_name
+ return aq_base_name
Modified: erp5/trunk/products/ERP5Catalog/tests/testERP5Catalog.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5Catalog/tests/testERP5Catalog.py?rev=6576&r1=6575&r2=6576&view=diff
==============================================================================
--- erp5/trunk/products/ERP5Catalog/tests/testERP5Catalog.py (original)
+++ erp5/trunk/products/ERP5Catalog/tests/testERP5Catalog.py Thu Apr 13 13:29:11 2006
@@ -658,4 +658,47 @@
person_module.searchFolder(title=title)]
self.assertEquals(['5'],folder_object_list)
-
+ def test_20_SearchFolderWithDynamicRelatedKey(self, quiet=0, run=run_all_test):
+ # Test if portal_synchronizations was created
+ if not run: return
+ if not quiet:
+ message = 'Search Folder With 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',)
+ organisation.setGroup('nexedi')
+ self.assertEquals(organisation.getGroupValue(), group_nexedi_category)
+ organisation2 = module.newContent(portal_type='Organisation',)
+ organisation2.setGroup('storever')
+ self.assertEquals(organisation2.getGroupValue(), group_nexedi_category2)
+ # Flush message queue
+ get_transaction().commit()
+ self.tic()
+
+ # Try to get the organisation with the group title Nexedi
+ organisation_list = [x.getObject() for x in
+ module.searchFolder(group_title='Nexedi')]
+ self.assertEquals(organisation_list,[organisation])
+ # Try to get the organisation with the group id nexedi
+ organisation_list = [x.getObject() for x in
+ module.searchFolder(group_id='storever')]
+ self.assertEquals(organisation_list,[organisation2])
+ # Try to get the organisation with the group description 'a'
+ organisation_list = [x.getObject() for x in
+ module.searchFolder(group_description='a')]
+ self.assertEquals(organisation_list,[organisation])
+
+
More information about the Erp5-report
mailing list