From fcc065469160f2dc7d9261a5e0cebfe8ec47bf20 Mon Sep 17 00:00:00 2001
From: Nicolas Dumazet <nicolas.dumazet@nexedi.com>
Date: Tue, 8 Feb 2011 03:15:57 +0000
Subject: [PATCH] update DocumentationHelper-related code and tests after move
 to ZODB property sheets

git-svn-id: https://svn.erp5.org/repos/public/erp5/trunk@43151 20353a03-c40f-0410-a6d1-a30d3c3de9de
---
 product/ERP5Type/Base.py                | 41 ++++++++++---------------
 product/ERP5Type/Tool/ClassTool.py      |  7 ++---
 product/ERP5Type/tests/testClassTool.py | 20 +++++-------
 3 files changed, 27 insertions(+), 41 deletions(-)

diff --git a/product/ERP5Type/Base.py b/product/ERP5Type/Base.py
index 689c414b13..5e89cd29a6 100644
--- a/product/ERP5Type/Base.py
+++ b/product/ERP5Type/Base.py
@@ -550,7 +550,6 @@ def initializePortalTypeDynamicWorkflowMethods(ptype_klass, portal_workflow):
 
   dc_workflow_dict = dict()
   interaction_workflow_dict = dict()
-
   for wf in portal_workflow.getWorkflowsFor(portal_type):
     wf_id = wf.id
     wf_type = wf.__class__.__name__
@@ -3421,7 +3420,7 @@ class Base( CopyContainer,
     dynamic_accessor_list = [] # Accessors
     found_accessors = {}       # Accessor names : filled by PortalType-level
                                # scan, and used in PropertySheet-level scan.
-    dochelper = newTempDocumentationHelper(self.getParentValue(), self.getId(),
+    dochelper = newTempDocumentationHelper(self, self.getId(),
                   title=item_id, type=item_class.__name__,
                   description=inspect.getdoc(documented_item),
                 )
@@ -3439,9 +3438,22 @@ class Base( CopyContainer,
     for k, v in item_class.__dict__.items():
       if k in excluded_property_set:
         continue
+      if k.startswith('_base') or k.startswith('_category'):
+        continue
       subdochelper = newTempDocumentationHelper(dochelper, k,
                   title=k, description=inspect.getdoc(v),
                   security=repr(getattr(documented_item, '%s__roles__' % (k,),None)))
+      if callable(v):
+        try:
+          my_type = v.__class__.__name__
+          subdochelper.setType(my_type)
+        except AttributeError:
+          pass
+        if 'Setter' not in my_type and \
+           'Getter' not in my_type and \
+           'Tester' not in my_type: # Accessors are handled separatelly.
+          dynamic_method_list.append(subdochelper)
+
       try:
         subdochelper.setType(v.__class__.__name__)
       except AttributeError:
@@ -3468,22 +3480,6 @@ class Base( CopyContainer,
 
     # PortalType-level methods
     # XXX: accessing portal_type directly because accessors are not generated on instances
-    if getattr(documented_item, 'portal_type', None) is not None:
-      aq_key = documented_item._aq_key()
-      for k, v in Base.aq_portal_type[aq_key].__dict__.items():
-        if callable(v) and not (k.startswith('_base') or k.startswith('_category')):
-          subdochelper = newTempDocumentationHelper(dochelper, k,
-                    title=k, description=inspect.getdoc(v),
-                    security=repr(getattr(documented_item, '%s__roles__' % (k,),None)))
-          try:
-            my_type = v.__class__.__name__
-            subdochelper.setType(my_type)
-          except AttributeError:
-            pass
-          if 'Setter' not in my_type and \
-             'Getter' not in my_type and \
-             'Tester' not in my_type: # Accessors are handled separatelly.
-            dynamic_method_list.append(subdochelper)
 # KEEPME: usefull to track the differences between accessors defined on
 # PortalType and the one detected on the documented item.
 #          else:
@@ -3823,12 +3819,9 @@ class TempBase(Base):
 InitializeClass(TempBase)
 
 def newTempDocumentationHelper(folder, id, REQUEST=None, **kw):
-  o = TempDocumentationHelper(id)
-  o = o.__of__(folder)
-  if kw is not None:
-    o._edit(force_update=1, **kw)
-  return o
-
+  type_tool = folder.getPortalObject().portal_types
+  type_info = getattr(type_tool, 'Documentation Helper')
+  return type_info.constructTempInstance(folder, id, **kw)
 
 class DocumentationHelper(Base):
   """
diff --git a/product/ERP5Type/Tool/ClassTool.py b/product/ERP5Type/Tool/ClassTool.py
index a1c6fef219..9537753bee 100644
--- a/product/ERP5Type/Tool/ClassTool.py
+++ b/product/ERP5Type/Tool/ClassTool.py
@@ -1101,14 +1101,13 @@ def initialize( context ):
           XXX: this code is (almost) duplicated from ERP5Types/Base.py:asDocumentationHelper
         """
 
-        from Products.ERP5Type import document_class_registry
-        from Products.ERP5Type.dynamic.portal_type_class import _importClass
+        import erp5.portal_type
         # XXX so this is ugly, but should disappear with classes in ZODB
-        my_class = _importClass(document_class_registry[class_id])
+        my_class = getattr(erp5.portal_type, class_id)
 
         method_list = []
         property_list = []
-        dochelper = newTempDocumentationHelper(self.getPortalObject(), class_id, title=class_id,
+        dochelper = newTempDocumentationHelper(self, self.getId(), title=class_id,
                       type=my_class.__class__.__name__,
                       description=inspect.getdoc(my_class))
         try:
diff --git a/product/ERP5Type/tests/testClassTool.py b/product/ERP5Type/tests/testClassTool.py
index a91e877e29..5db5a25b28 100644
--- a/product/ERP5Type/tests/testClassTool.py
+++ b/product/ERP5Type/tests/testClassTool.py
@@ -124,24 +124,18 @@ class TestClassTool(ERP5TypeTestCase):
     This tests checks that Documentation Helper works with propertysheets
     that define their categories using expressions.
     """
-    from Products.ERP5Type import PropertySheet
-    from Products.ERP5Type.Document.Movement import Movement
-    from Products.ERP5Type.Document.Delivery import Delivery
-    from Products.CMFCore.Expression import Expression
+    from Products.ERP5Type.Core import DynamicCategoryProperty
+    from erp5.portal_type import Movement, Delivery
     movement = Movement('dummy_movement').__of__(
                         Delivery('dummy_delivery').__of__(self.portal))
     # This test relies on the fact that Movement class has categories defined
     # by an expression.
-    found_one = 0
-    for ps in movement.property_sheets:
-      if isinstance(ps, basestring):
-        ps = getattr(PropertySheet, ps)
-      for category in getattr(ps, '_categories', []):
-        if isinstance(category, Expression):
-          found_one = 1
+    portal_property_sheets = self.portal.portal_property_sheets
+    movement_propert_sheet = portal_property_sheets.Movement
+
+    for ps in movement_propert_sheet.contentValues():
+      if isinstance(ps, DynamicCategoryProperty.DynamicCategoryProperty):
           break
-      if found_one:
-        break
     else:
       self.fail("Movement _categories doesn't include expressions; "
                 "this test is outdated")
-- 
2.30.9