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