[Erp5-report] r13755 - /erp5/trunk/products/ERP5Type/Base.py
nobody at svn.erp5.org
nobody at svn.erp5.org
Wed Mar 28 14:48:33 CEST 2007
Author: yo
Date: Wed Mar 28 14:48:31 2007
New Revision: 13755
URL: http://svn.erp5.org?rev=13755&view=rev
Log:
Use a transactional variable instead of a transaction object for acquisition stacks. Remove unneeded imports.
Modified:
erp5/trunk/products/ERP5Type/Base.py
Modified: erp5/trunk/products/ERP5Type/Base.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5Type/Base.py?rev=13755&r1=13754&r2=13755&view=diff
==============================================================================
--- erp5/trunk/products/ERP5Type/Base.py (original)
+++ erp5/trunk/products/ERP5Type/Base.py Wed Mar 28 14:48:31 2007
@@ -28,9 +28,8 @@
from struct import unpack
import warnings
-import ExtensionClass
-
-from Globals import InitializeClass, DTMLFile, PersistentMapping
+
+from Globals import InitializeClass, DTMLFile
from AccessControl import ClassSecurityInfo
from AccessControl.Permission import pname, Permission
from AccessControl.PermissionRole import rolesForPermissionOn
@@ -56,7 +55,7 @@
from Products.CMFCore.WorkflowCore import ObjectDeleted
from Accessor import WorkflowState
from Products.ERP5Type.Log import log as unrestrictedLog
-
+from Products.ERP5Type.TransactionalVariable import getTransactionalVariable
from ZopePatch import ERP5PropertyManager
from CopySupport import CopyContainer, CopyError,\
@@ -69,21 +68,13 @@
from string import join
import sys
import psyco
-import traceback
from cStringIO import StringIO
from socket import gethostname, gethostbyaddr
import random
-from DateTime import DateTime
-
import inspect
from pprint import pformat
-
-try:
- from transaction import get as get_transaction
-except ImportError:
- pass
from ZODB.POSException import ConflictError
from zLOG import LOG, INFO, ERROR, WARNING
@@ -682,120 +673,112 @@
Other case : we want to change the phone number of a related object without
going to edit the related object
-
"""
# Push context to prevent loop
- # We use TRANSACTION but should use REQUEST
- from Globals import get_request
- TRANSACTION = get_transaction()
- if not hasattr(TRANSACTION, '_erp5_acquisition_stack'): TRANSACTION._erp5_acquisition_stack = {}
+ tv = getTransactionalVariable()
if isinstance(portal_type, list):
portal_type = tuple(portal_type)
acquisition_key = ('_getDefaultAcquiredProperty', self.getPath(), key, base_category,
portal_type, copy_value, mask_value, sync_value,
accessor_id, depends, storage_id, alt_accessor_id, is_list_type, is_tales_type)
- if TRANSACTION._erp5_acquisition_stack.has_key(acquisition_key): return null_value
- TRANSACTION._erp5_acquisition_stack[acquisition_key] = 1
-
- if storage_id is None: storage_id=key
- #LOG("Get Acquired Property storage_id",0,str(storage_id))
- # Test presence of attribute without acquisition
- # if present, get it in its context, thus we keep acquisition if
- # returned value is an object
- d = getattr(aq_base(self), storage_id, _MARKER)
- if d is not _MARKER:
- value = getattr(self, storage_id, None)
- else:
- value = None
- # If we hold an attribute and mask_value is set, return the attribute
- if mask_value and value is not None:
- # Pop context
- del TRANSACTION._erp5_acquisition_stack[acquisition_key]
- if is_tales_type:
- expression = Expression(value)
- econtext = createExpressionContext(self)
- return expression(econtext)
+ if acquisition_key in tv:
+ return null_value
+
+ tv[acquisition_key] = 1
+
+ try:
+ if storage_id is None: storage_id=key
+ #LOG("Get Acquired Property storage_id",0,str(storage_id))
+ # Test presence of attribute without acquisition
+ # if present, get it in its context, thus we keep acquisition if
+ # returned value is an object
+ d = getattr(aq_base(self), storage_id, _MARKER)
+ if d is not _MARKER:
+ value = getattr(self, storage_id, None)
else:
- return value
- # Retrieve the list of related objects
- #LOG("Get Acquired Property self",0,str(self))
- #LOG("Get Acquired Property portal_type",0,str(portal_type))
- #LOG("Get Acquired Property base_category",0,str(base_category))
- #super_list = self._getValueList(base_category, portal_type=portal_type) # We only do a single jump
- super_list = self._getAcquiredValueList(base_category, portal_type=portal_type) # Full acquisition
- super_list = filter(lambda o: o.getPhysicalPath() != self.getPhysicalPath(), super_list) # Make sure we do not create stupid loop here
- #LOG("Get Acquired Property super_list",0,str(super_list))
- #LOG("Get Acquired Property accessor_id",0,str(accessor_id))
- if len(super_list) > 0:
- super = super_list[0]
- # Retrieve the value
- if accessor_id is None:
- value = super.getProperty(key)
+ value = None
+ # If we hold an attribute and mask_value is set, return the attribute
+ if mask_value and value is not None:
+ # Pop context
+ if is_tales_type:
+ expression = Expression(value)
+ econtext = createExpressionContext(self)
+ return expression(econtext)
+ else:
+ return value
+ # Retrieve the list of related objects
+ #LOG("Get Acquired Property self",0,str(self))
+ #LOG("Get Acquired Property portal_type",0,str(portal_type))
+ #LOG("Get Acquired Property base_category",0,str(base_category))
+ #super_list = self._getValueList(base_category, portal_type=portal_type) # We only do a single jump
+ super_list = self._getAcquiredValueList(base_category, portal_type=portal_type) # Full acquisition
+ super_list = filter(lambda o: o.getPhysicalPath() != self.getPhysicalPath(), super_list) # Make sure we do not create stupid loop here
+ #LOG("Get Acquired Property super_list",0,str(super_list))
+ #LOG("Get Acquired Property accessor_id",0,str(accessor_id))
+ if len(super_list) > 0:
+ super = super_list[0]
+ # Retrieve the value
+ if accessor_id is None:
+ value = super.getProperty(key)
+ else:
+ method = getattr(super, accessor_id)
+ value = method() # We should add depends here XXXXXX
+ # There is also a strong risk here of infinite loop
+ if copy_value:
+ if getattr(self, storage_id, None) is None:
+ # Copy the value if it does not already exist as an attribute of self
+ # Like in the case of orders / invoices
+ setattr(self, storage_id, value)
+ if is_list_type:
+ # We must provide the first element of the acquired list
+ if value is None:
+ result = None
+ else:
+ if isinstance(value, (list, tuple)):
+ if len(value) is 0:
+ result = None
+ else:
+ result = value[0]
+ else:
+ result = value
+ else:
+ # Value is a simple type
+ result = value
else:
- method = getattr(super, accessor_id)
- value = method() # We should add depends here XXXXXX
- # There is also a strong risk here of infinite loop
- if copy_value:
- if getattr(self, storage_id, None) is None:
- # Copy the value if it does not already exist as an attribute of self
- # Like in the case of orders / invoices
- setattr(self, storage_id, value)
- if is_list_type:
- # We must provide the first element of the acquired list
- if value is None:
- result = None
+ result = None
+ if result is not None:
+ return result
+ else:
+ #LOG("alt_accessor_id",0,str(alt_accessor_id))
+ if alt_accessor_id is not None:
+ for id in alt_accessor_id:
+ #LOG("method",0,str(id))
+ method = getattr(self, id, None)
+ if callable(method):
+ result = method()
+ if result is not None:
+ if is_list_type:
+ if isinstance(result, (list, tuple)):
+ # We must provide the first element of the alternate result
+ if len(result) > 0:
+ return result[0]
+ else:
+ return result
+ else:
+ # Result is a simple type
+ return result
+
+ if copy_value:
+ return getattr(self,storage_id, default_value)
else:
- if isinstance(value, (list, tuple)):
- if len(value) is 0:
- result = None
- else:
- result = value[0]
- else:
- result = value
- else:
- # Value is a simple type
- result = value
- else:
- result = None
- if result is not None:
- # Pop context
- del TRANSACTION._erp5_acquisition_stack[acquisition_key]
- return result
- else:
- #LOG("alt_accessor_id",0,str(alt_accessor_id))
- if alt_accessor_id is not None:
- for id in alt_accessor_id:
- #LOG("method",0,str(id))
- method = getattr(self, id, None)
- if callable(method):
- result = method()
- if result is not None:
- if is_list_type:
- if isinstance(result, (list, tuple)):
- # We must provide the first element of the alternate result
- if len(result) > 0:
- # Pop context
- del TRANSACTION._erp5_acquisition_stack[acquisition_key]
- return result[0]
- else:
- # Pop context
- del TRANSACTION._erp5_acquisition_stack[acquisition_key]
- return result
- else:
- # Pop context
- del TRANSACTION._erp5_acquisition_stack[acquisition_key]
- # Result is a simple type
- return result
-
- if copy_value:
- # Pop context
- del TRANSACTION._erp5_acquisition_stack[acquisition_key]
- return getattr(self,storage_id, default_value)
- else:
- # Pop context
- del TRANSACTION._erp5_acquisition_stack[acquisition_key]
- # Return the default value defined at the class level XXXXXXXXXXXXXXX
- return default_value
+ # Return the default value defined at the class level XXXXXXXXXXXXXXX
+ return default_value
+ finally:
+ # Pop the acquisition context.
+ try:
+ del tv[acquisition_key]
+ except KeyError:
+ pass
def _getAcquiredPropertyList(self, key, default_value, null_value,
base_category, portal_type=None, copy_value=0, mask_value=0, sync_value=0, append_value=0,
@@ -811,66 +794,67 @@
"""
# Push context to prevent loop
- from Globals import get_request
- TRANSACTION = get_transaction()
- if not hasattr(TRANSACTION, '_erp5_acquisition_stack'): TRANSACTION._erp5_acquisition_stack = {}
+ tv = getTransactionalVariable()
+ if isinstance(portal_type, list):
+ portal_type = tuple(portal_type)
acquisition_key = ('_getAcquiredPropertyList', self.getPath(), key, base_category,
portal_type, copy_value, mask_value, sync_value,
accessor_id, depends, storage_id, alt_accessor_id, is_list_type, is_tales_type)
- if TRANSACTION._erp5_acquisition_stack.has_key(acquisition_key): return null_value
- TRANSACTION._erp5_acquisition_stack[acquisition_key] = 1
-
- if storage_id is None: storage_id=key
- value = getattr(self, storage_id, None)
- if mask_value and value is not None:
- # Pop context
- del TRANSACTION._erp5_acquisition_stack[acquisition_key]
- if is_tales_type:
- expression = Expression(value)
- econtext = createExpressionContext(self)
- return expression(econtext)
+ if acquisition_key in tv:
+ return null_value
+
+ tv[acquisition_key] = 1
+
+ try:
+ if storage_id is None: storage_id=key
+ value = getattr(self, storage_id, None)
+ if mask_value and value is not None:
+ if is_tales_type:
+ expression = Expression(value)
+ econtext = createExpressionContext(self)
+ return expression(econtext)
+ else:
+ return value
+ super_list = self._getAcquiredValueList(base_category, portal_type=portal_type) # Full acquisition
+ super_list = filter(lambda o: o.getPhysicalPath() != self.getPhysicalPath(), super_list) # Make sure we do not create stupid loop here
+ if len(super_list) > 0:
+ value = []
+ for super in super_list:
+ if accessor_id is None:
+ if is_list_type:
+ result = super.getPropertyList(key)
+ if isinstance(result, (list, tuple)):
+ value += result
+ else:
+ value += [result]
+ else:
+ value += [super.getProperty(key)]
+ else:
+ method = getattr(super, accessor_id)
+ if is_list_type:
+ result = method() # We should add depends here
+ if isinstance(result, (list, tuple)):
+ value += result
+ else:
+ value += [result]
+ else:
+ value += [method()] # We should add depends here
+ if copy_value:
+ if not hasattr(self, storage_id):
+ setattr(self, storage_id, value)
+ return value
else:
- return value
- super_list = self._getAcquiredValueList(base_category, portal_type=portal_type) # Full acquisition
- super_list = filter(lambda o: o.getPhysicalPath() != self.getPhysicalPath(), super_list) # Make sure we do not create stupid loop here
- if len(super_list) > 0:
- value = []
- for super in super_list:
- if accessor_id is None:
- if is_list_type:
- result = super.getPropertyList(key)
- if isinstance(result, (list, tuple)):
- value += result
- else:
- value += [result]
- else:
- value += [super.getProperty(key)]
+ # ?????
+ if copy_value:
+ return getattr(self,storage_id, default_value)
else:
- method = getattr(super, accessor_id)
- if is_list_type:
- result = method() # We should add depends here
- if isinstance(result, (list, tuple)):
- value += result
- else:
- value += [result]
- else:
- value += [method()] # We should add depends here
- if copy_value:
- if not hasattr(self, storage_id):
- setattr(self, storage_id, value)
- # Pop context
- del TRANSACTION._erp5_acquisition_stack[acquisition_key]
- return value
- else:
- # ?????
- if copy_value:
- # Pop context
- del TRANSACTION._erp5_acquisition_stack[acquisition_key]
- return getattr(self,storage_id, default_value)
- else:
- # Pop context
- del TRANSACTION._erp5_acquisition_stack[acquisition_key]
- return default_value
+ return default_value
+ finally:
+ # Pop the acquisition context.
+ try:
+ del tv[acquisition_key]
+ except KeyError:
+ pass
security.declareProtected( Permissions.AccessContentsInformation, 'getProperty' )
def getProperty(self, key, d=_MARKER, **kw):
More information about the Erp5-report
mailing list