From 1c7f210852b4980060adfa7ac4c776f08bcc2ead Mon Sep 17 00:00:00 2001 From: Nicolas Dumazet <nicolas.dumazet@nexedi.com> Date: Thu, 21 Oct 2010 03:41:51 +0000 Subject: [PATCH] Partly re-add hardcoding for bootstraping. you can't call getattr(type_tool, portal_type_name) if Base Type and Solver Type portal types are not loaded yet: type_tool[portal_type_name].__of__(type_tool) requires loading the class to access __of__ method. For now, we'll have to hardcode a bit more to get test results. git-svn-id: https://svn.erp5.org/repos/public/erp5/trunk@39415 20353a03-c40f-0410-a6d1-a30d3c3de9de --- product/ERP5Type/Dynamic/portaltypeclass.py | 85 +++++++++++---------- 1 file changed, 45 insertions(+), 40 deletions(-) diff --git a/product/ERP5Type/Dynamic/portaltypeclass.py b/product/ERP5Type/Dynamic/portaltypeclass.py index d280173afe..e12ea767de 100644 --- a/product/ERP5Type/Dynamic/portaltypeclass.py +++ b/product/ERP5Type/Dynamic/portaltypeclass.py @@ -111,49 +111,54 @@ def portalTypeFactory(portal_type_name): site = getSite() type_tool = site.portal_types - try: - portal_type = getattr(type_tool, portal_type_name) - except: - raise AttributeError('portal type %s not found in Types Tool' \ - % portal_type_name) - - # type_class has a compatibility getter that should return - # something even if the field is not set (i.e. Base Type object - # was not migrated yet) - try: - type_class = portal_type.getTypeClass() - - # But no such getter exists for Mixins and Interfaces: - # in reality, we can live with such a failure + if portal_type_name == "Base Type": + type_class = "ERP5TypeInformation" + elif portal_type_name == "Solver Type": + type_class = "SolverTypeInformation" + else: try: - mixin_list = portal_type.getTypeMixinList() - interface_list = portal_type.getTypeInterfaceList() - except StandardError: - # log loudly the error, but it's not _critical_ - LOG("ERP5Type.Dynamic", ERROR, - "Could not load interfaces or Mixins for portal type %s" \ - % portal_type_name) - except AttributeError: - # Try to figure out a coresponding document class from the document side. - # This is required for the bootstrap (e.g. Base Type). - for name, path in document_class_registry.iteritems(): - # XXX heuristic: bootstrap issues should happen only inside ERP5Type. - if not path.startswith('Products.ERP5Type.'): - continue - - module_path, class_name = path.rsplit('.', 1) - module = __import__(module_path, {}, {}, (module_path,)) - klass = getattr(module, class_name) + portal_type = getattr(type_tool, portal_type_name) + except: + raise AttributeError('portal type %s not found in Types Tool' \ + % portal_type_name) + + # type_class has a compatibility getter that should return + # something even if the field is not set (i.e. Base Type object + # was not migrated yet) + try: + type_class = portal_type.getTypeClass() + + # But no such getter exists for Mixins and Interfaces: + # in reality, we can live with such a failure try: + mixin_list = portal_type.getTypeMixinList() + interface_list = portal_type.getTypeInterfaceList() + except StandardError: + # log loudly the error, but it's not _critical_ + LOG("ERP5Type.Dynamic", ERROR, + "Could not load interfaces or Mixins for portal type %s" \ + % portal_type_name) + except AttributeError: + # Try to figure out a coresponding document class from the document side. + # This is required for the bootstrap (e.g. Base Category). + for name, path in document_class_registry.iteritems(): + # XXX heuristic: bootstrap issues should happen only inside ERP5Type. + if not path.startswith('Products.ERP5Type.'): + continue + + module_path, class_name = path.rsplit('.', 1) + module = __import__(module_path, {}, {}, (module_path,)) + klass = getattr(module, class_name) try: - document_portal_type = getattr(klass, 'portal_type') - if document_portal_type == portal_type_name: - type_class = name - break - except AttributeError: - pass - finally: - del klass + try: + document_portal_type = getattr(klass, 'portal_type') + if document_portal_type == portal_type_name: + type_class = name + break + except AttributeError: + pass + finally: + del klass if type_class is not None: type_class = document_class_registry.get(type_class) -- 2.30.9