Commit a59731a0 authored by Cédric Le Ninivin's avatar Cédric Le Ninivin

Preference: optimize preference access (Thanks Julien M.)

parent ba498122
...@@ -60,6 +60,7 @@ class Preference( Folder ): ...@@ -60,6 +60,7 @@ class Preference( Folder ):
, PropertySheet.XMLObject , PropertySheet.XMLObject
, PropertySheet.DublinCore , PropertySheet.DublinCore
, PropertySheet.Preference , PropertySheet.Preference
, PropertySheet.SortIndex
) )
# Declarative security # Declarative security
......
...@@ -42,6 +42,7 @@ from Products.ERP5Type.Cache import CachingMethod ...@@ -42,6 +42,7 @@ from Products.ERP5Type.Cache import CachingMethod
from Products.ERP5Type.Utils import convertToUpperCase from Products.ERP5Type.Utils import convertToUpperCase
from Products.ERP5Type.TransactionalVariable import getTransactionalVariable from Products.ERP5Type.TransactionalVariable import getTransactionalVariable
from Products.ERP5Form import _dtmldir from Products.ERP5Form import _dtmldir
from Products.ZSQLCatalog.SQLCatalog import SimpleQuery, ComplexQuery
_marker = object() _marker = object()
...@@ -159,31 +160,26 @@ class PreferenceTool(BaseTool): ...@@ -159,31 +160,26 @@ class PreferenceTool(BaseTool):
newSecurityManager(None, actual_user.__of__(acl_users)) newSecurityManager(None, actual_user.__of__(acl_users))
tv_key = 'PreferenceTool._getSortedPreferenceList/%s/%s' % (user, tv_key = 'PreferenceTool._getSortedPreferenceList/%s/%s' % (user,
sql_catalog_id) sql_catalog_id)
if tv.get(tv_key, None) is None: try:
prefs = [] return tv[tv_key]
# XXX will also cause problems with Manager (too long) except KeyError:
# XXX For manager, create a manager specific preference kw = {'validation_state': ('enabled', 'global'),
# or better solution # system preferences before user preferences
user_is_manager = 'Manager' in user.getRolesInContext(self) 'sort_on': (('portal_type', 'DESC'), ('int_index', 'DESC'))}
for pref in self.searchFolder(portal_type='Preference', sql_catalog_id=sql_catalog_id): if 'Manager' in user.getRolesInContext(self):
kw['query'] = ComplexQuery(
SimpleQuery(portal_type='System Preference'),
SimpleQuery(int_index=Priority.USER, comparison_operator='!='),
SimpleQuery(owner=user.getId()),
operator='OR')
tv[tv_key] = preference_list = []
for pref in self.searchFolder(sql_catalog_id=sql_catalog_id, **kw):
pref = pref.getObject() pref = pref.getObject()
if pref is not None and pref.getProperty('preference_state', if pref is not None:
'broken') in ('enabled', 'global'): preference_list.append(pref)
# XXX quick workaround so that manager only see user preference if not preference_list: # BBB maybe not migrated yet
# they actually own. pass
if user_is_manager and pref.getPriority() == Priority.USER : return preference_list
if pref.getOwnerTuple()[1] == user.getId():
prefs.append(pref)
else :
prefs.append(pref)
prefs.sort(key=lambda x: x.getPriority(), reverse=True)
# add system preferences before user preferences
sys_prefs = [x.getObject() for x in self.searchFolder(portal_type='System Preference', sql_catalog_id=sql_catalog_id) \
if x.getObject().getProperty('preference_state', 'broken') in ('enabled', 'global')]
sys_prefs.sort(key=lambda x: x.getPriority(), reverse=True)
preference_list = sys_prefs + prefs
tv[tv_key] = preference_list
return tv[tv_key]
finally: finally:
setSecurityManager(security_manager) setSecurityManager(security_manager)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment