[Erp5-report] r39357 leonardo - in /erp5/trunk/products/ZSQLCatalog: ./ Extensions/
nobody at svn.erp5.org
nobody at svn.erp5.org
Tue Oct 19 17:20:28 CEST 2010
Author: leonardo
Date: Tue Oct 19 17:20:23 2010
New Revision: 39357
URL: http://svn.erp5.org?rev=39357&view=rev
Log:
allow passing the zsql_brain for ZSQLMethods and provide a brain that never gets the original object
Modified:
erp5/trunk/products/ZSQLCatalog/Extensions/zsqlbrain.py
erp5/trunk/products/ZSQLCatalog/SQLCatalog.py
Modified: erp5/trunk/products/ZSQLCatalog/Extensions/zsqlbrain.py
URL: http://svn.erp5.org/erp5/trunk/products/ZSQLCatalog/Extensions/zsqlbrain.py?rev=39357&r1=39356&r2=39357&view=diff
==============================================================================
--- erp5/trunk/products/ZSQLCatalog/Extensions/zsqlbrain.py [utf8] (original)
+++ erp5/trunk/products/ZSQLCatalog/Extensions/zsqlbrain.py [utf8] Tue Oct 19 17:20:23 2010
@@ -15,26 +15,27 @@
import string
import Acquisition
import sys
+import traceback
from ZODB.POSException import ConflictError
from AccessControl import ClassSecurityInfo
from AccessControl.SecurityInfo import allow_class
-from zLOG import LOG
+from zLOG import LOG, WARNING
_MARKER = []
-class ZSQLBrain(Acquisition.Implicit):
+class ZSQLBrain(Acquisition.Implicit):
security = ClassSecurityInfo()
security.declareObjectPublic()
def _aq_dynamic(self, name):
- """Acquire an attribute from a real object.
- """
- if name.startswith('__') :
- return None
- o = self.getObject()
- return getattr(o, name, None)
+ """Acquire an attribute from a real object.
+ """
+ if name.startswith('__') :
+ return None
+ o = self.getObject()
+ return getattr(o, name, None)
def getURL(self):
return self.path
@@ -120,3 +121,38 @@ class ZSQLBrain(Acquisition.Implicit):
pass
allow_class(ZSQLBrain)
+
+class ZSQLBrainNoObject(ZSQLBrain):
+ security = ClassSecurityInfo()
+ security.declareObjectPublic()
+
+ def getObject(self):
+ stack = ''.join(traceback.format_stack())
+ LOG('Products.ZSQLCatalog.Extentions.zsqlbrain.ZSQLBrainNoObject', WARNING,
+ "Attempted direct access to object %r:\n%s" % (self.getPath(), stack))
+ return None
+
+ def getProperty(self, name, d=_MARKER, **kw):
+ value = None
+ if hasattr(self, name):
+ value = getattr(self, name)
+ else:
+ stack = ''.join(traceback.format_stack())
+ LOG('Products.ZSQLCatalog.Extentions.zsqlbrain.ZSQLBrainNoObject',
+ WARNING,
+ "Non-existing property %r on record for %r:\n%s" % (name,
+ self.getPath(),
+ stack))
+ return None
+ return value
+
+ def _aq_dynamic(self, name):
+ """Do not acquire an attribute from a real object.
+ """
+ stack = ''.join(traceback.format_stack(limit=5))
+ LOG('Products.ZSQLCatalog.Extentions.zsqlbrain.ZSQLBrainNoObject', WARNING,
+ "Non-existing attribute %r on record for %r:\n%s" % (name,
+ self.getPath(),
+ stack))
+allow_class(ZSQLBrainNoObject)
+
Modified: erp5/trunk/products/ZSQLCatalog/SQLCatalog.py
URL: http://svn.erp5.org/erp5/trunk/products/ZSQLCatalog/SQLCatalog.py?rev=39357&r1=39356&r2=39357&view=diff
==============================================================================
--- erp5/trunk/products/ZSQLCatalog/SQLCatalog.py [utf8] (original)
+++ erp5/trunk/products/ZSQLCatalog/SQLCatalog.py [utf8] Tue Oct 19 17:20:23 2010
@@ -2354,6 +2354,12 @@ class Catalog(Folder,
"""
return getComparisonOperatorInstance(operator)
+ PROPAGATE_PARAMETER_SET = set(['selection_domain',
+ 'selection_report',
+ # XXX should get the next parameters from
+ # the ZSQLMethod class itself
+ 'zsql_brain',
+ ])
@profiler_decorator
def _queryResults(self, REQUEST=None, build_sql_query_method=None, **kw):
""" Returns a list of brains from a set of constraints on variables """
@@ -2363,11 +2369,10 @@ class Catalog(Folder,
# XXX: decide if this should be made normal
ENFORCE_SEPARATION = True
if ENFORCE_SEPARATION:
- new_kw = {}
# Some parameters must be propagated:
- for parameter_id in ('selection_domain', 'selection_report'):
- if parameter_id in kw:
- new_kw[parameter_id] = kw[parameter_id]
+ new_kw = dict((name, kw[name])
+ for name in self.PROPAGATE_PARAMETER_SET & set(kw))
+ # discard all others:
kw = new_kw
kw['where_expression'] = query['where_expression']
kw['sort_on'] = query['order_by_expression']
@@ -2376,6 +2381,7 @@ class Catalog(Folder,
kw['limit_expression'] = query['limit_expression']
kw['select_expression'] = query['select_expression']
kw['group_by_expression'] = query['group_by_expression']
+ # XXX: why not kw.update(query)??
return kw
def queryResults(self, sql_method, REQUEST=None, src__=0, build_sql_query_method=None, **kw):
More information about the Erp5-report
mailing list