[Erp5-report] r15780 - in /erp5/trunk/products/ERP5Type: Base.py tests/testClassTool.py

nobody at svn.erp5.org nobody at svn.erp5.org
Wed Aug 22 14:50:39 CEST 2007


Author: jerome
Date: Wed Aug 22 14:50:39 2007
New Revision: 15780

URL: http://svn.erp5.org?rev=15780&view=rev
Log:
Add support for property sheets defining _categories with an expression

Modified:
    erp5/trunk/products/ERP5Type/Base.py
    erp5/trunk/products/ERP5Type/tests/testClassTool.py

Modified: erp5/trunk/products/ERP5Type/Base.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5Type/Base.py?rev=15780&r1=15779&r2=15780&view=diff
==============================================================================
--- erp5/trunk/products/ERP5Type/Base.py (original)
+++ erp5/trunk/products/ERP5Type/Base.py Wed Aug 22 14:50:39 2007
@@ -2924,23 +2924,39 @@
             dynamic_accessor_list.append(subdochelper)
             if getattr(documented_item, property['id'], None) is not None:
               dynamic_property_list.append(subdochelper)
-        if getattr(property_sheet, '_categories', None) is not None:
-          for category in property_sheet._categories:
-            if category in seen_categories:
-              continue
-            seen_categories.append(category)
-            subdochelper = newTempDocumentationHelper(dochelper, category, title=category,
-                      content=pformat(documented_item.getCategoryMembershipList(category)))
-            subdochelper_dynamic_accessor_list = []
-            for accessor_name in generateCategoryAccessorNameList(category):
-              accessor = getattr(item_class, accessor_name, getattr(documented_item, accessor_name, None))
-              # First get it on the class, and if not on the instance, thereby among dynamic accessors.
-              if accessor is not None:
-                subdochelper_dynamic_accessor_list.append(accessorAsDocumentationHelper(accessor))
-            subdochelper_dynamic_accessor_list.sort()
-            subdochelper.setDynamicAccessorList(subdochelper_dynamic_accessor_list)
-            dynamic_accessor_list.append(subdochelper)
-            dynamic_category_list.append(subdochelper)
+        
+        def visitCategory(category):
+          if category in seen_categories:
+            return
+          seen_categories.append(category)
+          subdochelper = newTempDocumentationHelper(dochelper, category, title=category,
+                    content=pformat(documented_item.getCategoryMembershipList(category)))
+          subdochelper_dynamic_accessor_list = []
+          for accessor_name in generateCategoryAccessorNameList(category):
+            accessor = getattr(item_class, accessor_name, getattr(documented_item, accessor_name, None))
+            # First get it on the class, and if not on the instance, thereby among dynamic accessors.
+            if accessor is not None:
+              subdochelper_dynamic_accessor_list.append(accessorAsDocumentationHelper(accessor))
+          subdochelper_dynamic_accessor_list.sort()
+          subdochelper.setDynamicAccessorList(subdochelper_dynamic_accessor_list)
+          dynamic_accessor_list.append(subdochelper)
+          dynamic_category_list.append(subdochelper)
+
+        category_list = getattr(property_sheet, '_categories', [])
+        # some categories are defined by expressions, so we have to do 2
+        # passes, a first one to treat regular category list and collect
+        # categories defined by expression, a second one to treat thoses
+        # new categories from expressions.
+        expression_category_list = []
+        for category in category_list:
+          if isinstance(category, Expression):
+            econtext = createExpressionContext(self)
+            expression_category_list.extend(category(econtext))
+            continue
+          visitCategory(category)
+        
+        for category in expression_category_list:
+          visitCategory(category)
 
 # KEEPME: usefull to track the differences between accessors defined on
 # PortalType and the one detected on the documented item.

Modified: erp5/trunk/products/ERP5Type/tests/testClassTool.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5Type/tests/testClassTool.py?rev=15780&r1=15779&r2=15780&view=diff
==============================================================================
--- erp5/trunk/products/ERP5Type/tests/testClassTool.py (original)
+++ erp5/trunk/products/ERP5Type/tests/testClassTool.py Wed Aug 22 14:50:39 2007
@@ -128,6 +128,28 @@
     self.assertEquals(0, len(portal.portal_activities.getMessageList()))
    
 
+  def test_DocumentationHelperExpressionCategory(self):
+    # This tests checks that Documentation Helper works with propertysheets
+    # that define their categories using expressions.
+    from Products.ERP5Type.Document.Movement import Movement
+    from Products.CMFCore.Expression import Expression
+    movement = Movement('testing_id').__of__(self.getPortal())
+    # This test relies on the fact that Movement class has categories defined
+    # by an expression. 
+    category_list = []
+    found_one = 0
+    for ps in movement.property_sheets:
+      for category in getattr(ps, '_categories', []):
+        if isinstance(category, Expression):
+          found_one = 1
+      if found_one:
+        break
+    else:
+      self.fail("Movement _categories doesn't include expressions; "
+                "this test is outdated")
+    self.assertNotEquals(None, movement.asDocumentationHelper())
+
+
 import unittest
 def test_suite():
     suite = unittest.TestSuite()




More information about the Erp5-report mailing list