diff --git a/product/ERP5Type/Base.py b/product/ERP5Type/Base.py index 901ae6e6fb3537498492d1c5e6fe0884997f8db3..a0c21619eda9ebfefa3ed8c172a9c4e5251581d3 100755 --- a/product/ERP5Type/Base.py +++ b/product/ERP5Type/Base.py @@ -100,8 +100,8 @@ class WorkflowMethod(Method): def _aq_reset(): - Base.aq_method_generated = PersistentMapping() - Base.aq_portal_type = PersistentMapping() + Base.aq_method_generated = {} + Base.aq_portal_type = {} Base.aq_related_generated = 0 class PropertyHolder: @@ -121,8 +121,6 @@ def initializeClassDynamicProperties(self, klass, recursive=0): id = '' #LOG('before aq_method_generated %s' % id, 0, str(klass.__name__)) if not Base.aq_method_generated.has_key(klass): - # Mark as generated - Base.aq_method_generated[klass] = 1 # Recurse to superclasses for super_klass in klass.__bases__: if getattr(super_klass, 'isRADContent', 0): initializeClassDynamicProperties(self, super_klass, recursive=1) @@ -131,13 +129,16 @@ def initializeClassDynamicProperties(self, klass, recursive=0): from Utils import initializeDefaultProperties if not getattr(klass, 'isPortalContent', None): initializeDefaultProperties([klass], object=self) + # Mark as generated + Base.aq_method_generated[klass] = 1 def initializePortalTypeDynamicProperties(self, klass, ptype, recursive=0): id = '' #LOG('before aq_portal_type %s' % id, 0, str(ptype)) if not Base.aq_portal_type.has_key(ptype): # Mark as generated - prop_holder = Base.aq_portal_type[ptype] = PropertyHolder() + #prop_holder = Base.aq_portal_type[ptype] = PropertyHolder() + prop_holder = PropertyHolder() # Recurse to parent object parent_object = self.aq_parent parent_klass = parent_object.__class__ @@ -146,7 +147,7 @@ def initializePortalTypeDynamicProperties(self, klass, ptype, recursive=0): initializePortalTypeDynamicProperties(self, parent_klass, parent_type, recursive=1) if not recursive: # Initiatise portal_type properties (XXX) - ptype_object = getattr(self.portal_types, self.portal_type, None) + ptype_object = getattr(aq_base(self.portal_types), ptype, None) cat_list = [] prop_list = [] constraint_list = [] @@ -265,8 +266,11 @@ def initializePortalTypeDynamicProperties(self, klass, ptype, recursive=0): LOG('Base', ERROR, 'Could not generate worklow transition methods for workflow %s on class %s.' % (wf_id, klass), error=sys.exc_info()) - - + + # We can now associate it + Base.aq_portal_type[ptype] = prop_holder + + class Base( CopyContainer, PortalContent, ActiveObject, ERP5PropertyManager ): """ This is the base class for all ERP5 Zope objects. @@ -305,8 +309,8 @@ class Base( CopyContainer, PortalContent, ActiveObject, ERP5PropertyManager ): isPredicate = 0 # # Dynamic method acquisition system (code generation) - aq_method_generated = PersistentMapping() - aq_portal_type = PersistentMapping() + aq_method_generated = {} + aq_portal_type = {} aq_related_generated = 0 # Declarative security @@ -347,6 +351,9 @@ class Base( CopyContainer, PortalContent, ActiveObject, ERP5PropertyManager ): # for that portal_type, try to return a value ASAP if Base.aq_portal_type.has_key(ptype): return getattr(Base.aq_portal_type[ptype], id, None) + elif id in ('portal_types', 'portal_url', 'portal_workflow'): + # This is required to precent infinite loop (we need to access portal_types tool) + return None # Proceed with property generation klass = self.__class__