[Erp5-report] r39714 jm - in /erp5/trunk/products/ERP5Type: dynamic/ tests/
nobody at svn.erp5.org
nobody at svn.erp5.org
Fri Oct 29 21:45:19 CEST 2010
Author: jm
Date: Fri Oct 29 21:45:17 2010
New Revision: 39714
URL: http://svn.erp5.org?rev=39714&view=rev
Log:
Reinitialize all subclasses when class hierarchy changes, and add unit test
This fixes testERP5Commerce.
Modified:
erp5/trunk/products/ERP5Type/dynamic/lazy_class.py
erp5/trunk/products/ERP5Type/dynamic/portal_type_class.py
erp5/trunk/products/ERP5Type/tests/testDynamicClassGeneration.py
Modified: erp5/trunk/products/ERP5Type/dynamic/lazy_class.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5Type/dynamic/lazy_class.py?rev=39714&r1=39713&r2=39714&view=diff
==============================================================================
--- erp5/trunk/products/ERP5Type/dynamic/lazy_class.py [utf8] (original)
+++ erp5/trunk/products/ERP5Type/dynamic/lazy_class.py [utf8] Fri Oct 29 21:45:17 2010
@@ -1,6 +1,6 @@
# -*- coding: utf-8 -*-
-import sys
+import gc, sys
from Products.ERP5Type.Base import Base as ERP5Base
from ExtensionClass import Base as ExtensionBase
from ZODB.broken import Broken, PersistentBroken
@@ -12,6 +12,14 @@ ERP5BaseBroken = type('ERP5BaseBroken',
for x in PersistentBroken.__dict__.iteritems()
if x[0] not in ('__dict__', '__module__', '__weakref__')))
+ExtensionClass = type(ExtensionBase)
+def InitializePortalTypeClass(klass):
+ # beware of the scary meta type
+ ExtensionClass.__init__(klass, klass)
+ for klass in gc.get_referrers(klass):
+ if isinstance(klass, ExtensionClass):
+ InitializePortalTypeClass(klass)
+
def generateLazyPortalTypeClass(portal_type_name,
portal_type_class_loader):
def load(self, attr):
@@ -41,8 +49,7 @@ def generateLazyPortalTypeClass(portal_t
for key, value in attributes.iteritems():
setattr(klass, key, value)
- # beware of the scary meta type
- type(ExtensionBase).__init__(klass, klass)
+ InitializePortalTypeClass(klass)
return getattr(self, attr)
Modified: erp5/trunk/products/ERP5Type/dynamic/portal_type_class.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5Type/dynamic/portal_type_class.py?rev=39714&r1=39713&r2=39714&view=diff
==============================================================================
--- erp5/trunk/products/ERP5Type/dynamic/portal_type_class.py [utf8] (original)
+++ erp5/trunk/products/ERP5Type/dynamic/portal_type_class.py [utf8] Fri Oct 29 21:45:17 2010
@@ -33,14 +33,13 @@ import inspect
from types import ModuleType
from dynamic_module import registerDynamicModule
-from lazy_class import generateLazyPortalTypeClass
+from lazy_class import generateLazyPortalTypeClass, InitializePortalTypeClass
from Products.ERP5Type.Base import _aq_reset
from Products.ERP5Type.Globals import InitializeClass
from Products.ERP5Type.Utils import setDefaultClassProperties
from Products.ERP5Type import document_class_registry, mixin_class_registry
from Products.ERP5Type import PropertySheet as FilesystemPropertySheet
-from ExtensionClass import Base as ExtensionBase
from zLOG import LOG, ERROR, INFO
def _importClass(classpath):
@@ -241,7 +240,7 @@ def initializeDynamicModules():
class TempDocument(klass):
isTempDocument = PropertyConstantGetter('isTempDocument', value=True)
__roles__ = None
- TempDocument.__name__ = "Temp" + portal_type_name
+ TempDocument.__name__ = "Temp " + portal_type_name
# Replace some attributes.
for name in ('isIndexable', 'reindexObject', 'recursiveReindexObject',
@@ -309,7 +308,7 @@ def synchronizeDynamicModules(context, f
if attr != '__module__':
delattr(klass, attr)
klass.__bases__ = ghostbase
- type(ExtensionBase).__init__(klass, klass)
+ InitializePortalTypeClass(klass)
# Clear accessor holders of ZODB Property Sheets
_clearAccessorHolderModule(erp5.zodb_accessor_holder)
Modified: erp5/trunk/products/ERP5Type/tests/testDynamicClassGeneration.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5Type/tests/testDynamicClassGeneration.py?rev=39714&r1=39713&r2=39714&view=diff
==============================================================================
--- erp5/trunk/products/ERP5Type/tests/testDynamicClassGeneration.py [utf8] (original)
+++ erp5/trunk/products/ERP5Type/tests/testDynamicClassGeneration.py [utf8] Fri Oct 29 21:45:17 2010
@@ -31,7 +31,7 @@
import unittest
import transaction
-
+from Products.ERP5Type.dynamic.portal_type_class import synchronizeDynamicModules
from Products.ERP5Type.tests.ERP5TypeTestCase import ERP5TypeTestCase
from Products.ERP5Type.tests.backportUnittest import skip
@@ -141,6 +141,21 @@ class TestPortalTypeClass(ERP5TypeTestCa
person_type.setTypeClass('Person')
transaction.commit()
+ def testTempPortalType(self):
+ newType = self.portal.portal_types.newContent
+ new_type_list = [newType(portal_type='Base Type', type_class='Folder',
+ type_filter_content_type=False).getId()
+ for i in (0, 1)]
+ newDocument = self.portal.newContent(self.id(), 'Folder').newContent
+ for temp_first, portal_type in enumerate(new_type_list):
+ obj = newDocument(portal_type='Folder', temp_object=temp_first)
+ obj.newContent('file', portal_type)
+ obj.file.aq_base
+ obj = newDocument(portal_type='Folder', temp_object=not temp_first)
+ obj.newContent('file', portal_type)
+ obj.file.aq_base
+
+
class TestZodbPropertySheet(ERP5TypeTestCase):
"""
XXX: WORK IN PROGRESS
More information about the Erp5-report
mailing list