[Erp5-report] r30454 - in /erp5/trunk/products: ERP5Catalog/ ZSQLCatalog/
nobody at svn.erp5.org
nobody at svn.erp5.org
Tue Nov 10 11:00:45 CET 2009
Author: jm
Date: Tue Nov 10 11:00:41 2009
New Revision: 30454
URL: http://svn.erp5.org?rev=30454&view=rev
Log:
Small optimizations in CatalogTool.wrapObject
Modified:
erp5/trunk/products/ERP5Catalog/CatalogTool.py
erp5/trunk/products/ZSQLCatalog/SQLCatalog.py
Modified: erp5/trunk/products/ERP5Catalog/CatalogTool.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5Catalog/CatalogTool.py?rev=30454&r1=30453&r2=30454&view=diff
==============================================================================
--- erp5/trunk/products/ERP5Catalog/CatalogTool.py [utf8] (original)
+++ erp5/trunk/products/ERP5Catalog/CatalogTool.py [utf8] Tue Nov 10 11:00:41 2009
@@ -33,7 +33,6 @@
from Products.ERP5Type import Permissions
from Products.ERP5Type.Cache import CachingMethod
from AccessControl import ClassSecurityInfo, getSecurityManager
-from Products.CMFCore.CatalogTool import IndexableObjectWrapper as CMFCoreIndexableObjectWrapper
from Products.CMFCore.utils import UniqueObject, _checkPermission, _getAuthenticatedUser, getToolByName
from Products.ERP5Type.Globals import InitializeClass, DTMLFile, package_home
from Acquisition import aq_base, aq_inner, aq_parent, ImplicitAcquisitionWrapper
@@ -55,7 +54,6 @@
import os, time, urllib, warnings
import sys
from zLOG import LOG, PROBLEM, WARNING, INFO
-import sets
ACQUIRE_PERMISSION_VALUE = []
@@ -63,41 +61,32 @@
from Acquisition import Implicit
-class IndexableObjectWrapper(CMFCoreIndexableObjectWrapper):
-
- def __init__(self, vars, ob):
- # sigh... CMFCoreIndexableObjectWrapper changed signature between
- # CMF 1.5 and 2.x. The new signature is (self, ob, catalog), and the
- # 'vars' calculation is done by __init__ itself
- # FIXME, we should consider taking a page from the CMFCore parent and
- # move the 'vars' logic here. We would be actually making use of the
- # 'catalog' parameter, instead of just using it to fetch
- # portal_workflow.
- self.__vars = vars
+class IndexableObjectWrapper(object):
+
+ def __init__(self, ob):
self.__ob = ob
- def __setattr__(self, name, value):
- # We need to update the uid during the cataloging process
- if name == 'uid':
- setattr(self.__ob, name, value)
- else:
- self.__dict__[name] = value
+ def __getattr__(self, name):
+ return getattr(self.__ob, name)
+
+ # We need to update the uid during the cataloging process
+ uid = property(lambda self: self.__ob.uid,
+ lambda self, value: setattr(self.__ob, 'uid', value))
def _getSecurityParameterList(self):
- result_key = '_cache_result'
- if result_key not in self.__dict__:
+ result = self.__dict__.get('_cache_result', None)
+ if result is None:
ob = self.__ob
- localroles = mergedLocalRoles(ob)
# For each group or user, we have a list of roles, this list
# give in this order : [roles on object, roles acquired on the parent,
# roles acquired on the parent of the parent....]
# So if we have ['-Author','Author'] we should remove the role 'Author'
# but if we have ['Author','-Author'] we have to keep the role 'Author'
- flat_localroles = {}
- skip_role_set = sets.Set()
+ localroles = {}
+ skip_role_set = set()
skip_role = skip_role_set.add
clear_skip_role = skip_role_set.clear
- for key, role_list in localroles.iteritems():
+ for key, role_list in mergedLocalRoles(ob).iteritems():
new_role_list = []
new_role = new_role_list.append
clear_skip_role()
@@ -107,10 +96,9 @@
elif role not in skip_role_set:
new_role(role)
if len(new_role_list)>0:
- flat_localroles[key] = new_role_list
- localroles = flat_localroles
-
- portal = self.getPortalObject()
+ localroles[key] = new_role_list
+
+ portal = ob.getPortalObject()
role_dict = dict(portal.portal_catalog.getSQLCatalog().\
getSQLCatalogRoleKeysList())
getUserById = portal.acl_users.getUserById
@@ -121,7 +109,7 @@
# user:<user_id>
# user:<user_id>:<role_id>
# A line must not be present twice in final result.
- allowed = sets.Set(rolesForPermissionOn('View', ob))
+ allowed = set(rolesForPermissionOn('View', ob))
# XXX Owner is hardcoded, in order to prevent searching for user on the
# site root.
allowed.discard('Owner')
@@ -141,13 +129,9 @@
add(prefix)
add(prefix + ':' + role)
- # __setattr__ explicitely set the parameter on the wrapper
- setattr(self, result_key,
- (list(allowed), user_role_dict,
- user_view_permission_role_dict))
-
- # Return expected value
- return self.__dict__[result_key]
+ self._cache_result = result = (sorted(allowed), user_role_dict,
+ user_view_permission_role_dict)
+ return result
def allowedRolesAndUsers(self):
"""
@@ -740,17 +724,15 @@
LOG('wrapObject', 0, 'Warning: catalog is not available')
return (None, None)
+ document_object = aq_inner(object)
+ w = IndexableObjectWrapper(document_object)
+
wf = getToolByName(self, 'portal_workflow')
if wf is not None:
- vars = wf.getCatalogVariablesFor(object)
- else:
- vars = {}
- #LOG('catalog_object vars', 0, str(vars))
+ w.__dict__.update(wf.getCatalogVariablesFor(object))
# Find the parent definition for security
- document_object = aq_inner(object)
is_acquired = 0
- w = IndexableObjectWrapper(vars, document_object)
while getattr(document_object, 'isRADContent', 0):
# This condition tells which object should acquire
# from their parent.
@@ -762,21 +744,18 @@
else:
break
if is_acquired:
- document_w = IndexableObjectWrapper({}, document_object)
+ document_w = IndexableObjectWrapper(document_object)
else:
document_w = w
(security_uid, optimised_roles_and_users) = catalog.getSecurityUid(document_w)
#LOG('catalog_object optimised_roles_and_users', 0, str(optimised_roles_and_users))
# XXX we should build vars begore building the wrapper
- if optimised_roles_and_users is not None:
- vars['optimised_roles_and_users'] = optimised_roles_and_users
- else:
- vars['optimised_roles_and_users'] = None
+ w.optimised_roles_and_users = optimised_roles_and_users
predicate_property_dict = catalog.getPredicatePropertyDict(object)
if predicate_property_dict is not None:
- vars['predicate_property_dict'] = predicate_property_dict
- vars['security_uid'] = security_uid
+ w.predicate_property_dict = predicate_property_dict
+ w.security_uid = security_uid
return ImplicitAcquisitionWrapper(w, aq_parent(document_object))
Modified: erp5/trunk/products/ZSQLCatalog/SQLCatalog.py
URL: http://svn.erp5.org/erp5/trunk/products/ZSQLCatalog/SQLCatalog.py?rev=30454&r1=30453&r2=30454&view=diff
==============================================================================
--- erp5/trunk/products/ZSQLCatalog/SQLCatalog.py [utf8] (original)
+++ erp5/trunk/products/ZSQLCatalog/SQLCatalog.py [utf8] Tue Nov 10 11:00:41 2009
@@ -727,15 +727,11 @@
and to assign security only to root document
"""
# Get security information
- allowed_roles_and_users = wrapped_object.allowedRolesAndUsers()
- # Sort it
- allowed_roles_and_users = list(allowed_roles_and_users)
- allowed_roles_and_users.sort()
- allowed_roles_and_users = tuple(allowed_roles_and_users)
+ allowed_roles_and_users = tuple(wrapped_object.allowedRolesAndUsers())
# Make sure no duplicates
if getattr(aq_base(self), 'security_uid_dict', None) is None:
self._clearSecurityCache()
- if self.security_uid_dict.has_key(allowed_roles_and_users):
+ elif self.security_uid_dict.has_key(allowed_roles_and_users):
return (self.security_uid_dict[allowed_roles_and_users], None)
# If the id_tool is there, it is better to use it, it allows
# to create many new security uids by the same time
More information about the Erp5-report
mailing list