[Checkins] SVN: Products.CMFCore/trunk/Products/CMFCore/ - improved content type registry handler

Yvo Schubbe y.2011 at wcm-solutions.de
Mon Jul 18 07:41:03 EDT 2011


Log message for revision 122277:
  - improved content type registry handler

Changed:
  U   Products.CMFCore/trunk/Products/CMFCore/CHANGES.txt
  UU  Products.CMFCore/trunk/Products/CMFCore/exportimport/contenttyperegistry.py
  U   Products.CMFCore/trunk/Products/CMFCore/exportimport/tests/test_contenttyperegistry.py

-=-
Modified: Products.CMFCore/trunk/Products/CMFCore/CHANGES.txt
===================================================================
--- Products.CMFCore/trunk/Products/CMFCore/CHANGES.txt	2011-07-18 10:16:17 UTC (rev 122276)
+++ Products.CMFCore/trunk/Products/CMFCore/CHANGES.txt	2011-07-18 11:41:02 UTC (rev 122277)
@@ -4,6 +4,9 @@
 2.3.0-alpha (unreleased)
 ------------------------
 
+- setup handlers: Improved content type registry handler.
+  The 'insert-before' and 'insert-after' directives are now supported.
+
 - Optimize `SkinnableObjectManager.__getattr__` to short circuit view (`@`) and
   traverser (`+`) lookup in addition to `_` and `aq_`.
 

Modified: Products.CMFCore/trunk/Products/CMFCore/exportimport/contenttyperegistry.py
===================================================================
--- Products.CMFCore/trunk/Products/CMFCore/exportimport/contenttyperegistry.py	2011-07-18 10:16:17 UTC (rev 122276)
+++ Products.CMFCore/trunk/Products/CMFCore/exportimport/contenttyperegistry.py	2011-07-18 11:41:02 UTC (rev 122277)
@@ -11,8 +11,6 @@
 #
 ##############################################################################
 """Content type registry xml adapters and setup handlers.
-
-$Id$
 """
 
 from zope.component import adapts
@@ -80,18 +78,28 @@
             parent = self.context
 
             predicate_id = str(child.getAttribute('name'))
-            predicate_type = str(child.getAttribute('predicate_type'))
-            content_type_name = str(child.getAttribute('content_type_name'))
             if predicate_id not in parent.predicate_ids:
+                predicate_type = str(child.getAttribute('predicate_type'))
                 parent.addPredicate(predicate_id, predicate_type)
 
+            if child.hasAttribute('content_type_name'):
+                content_type_name = str(child.getAttribute('content_type_name'))
+                parent.assignTypeName(predicate_id, content_type_name)
+
+            if child.hasAttribute('insert-before'):
+                insert_before = child.getAttribute('insert-before')
+                self._movePredicate(predicate_id, insert_before, 0)
+            elif child.hasAttribute('insert-after'):
+                insert_after = child.getAttribute('insert-after')
+                self._movePredicate(predicate_id, insert_after, 1)
+
             arguments = []
             for sub in child.childNodes:
                 if sub.nodeName != 'argument':
                     continue
                 arguments.append(str(sub.getAttribute('value')))
-            parent.getPredicate(predicate_id).edit(*arguments)
-            parent.assignTypeName(predicate_id, content_type_name)
+            if arguments:
+                parent.getPredicate(predicate_id).edit(*arguments)
 
     _KNOWN_PREDICATE_TYPES = {
         'major_minor': lambda x: (','.join(x.major or ()),
@@ -107,6 +115,19 @@
             return cracker(predicate)
         return ()  # XXX:  raise?
 
+    def _movePredicate(self, id, position_id, delta=0):
+        predicate_ids = list(self.context.predicate_ids)
+        if position_id == '*':
+            position_id = predicate_ids[-delta]
+        if position_id == id:
+            return
+        try:
+            predicate_ids.remove(id)
+            position = predicate_ids.index(position_id)
+            predicate_ids.insert(position + delta, id)
+        except ValueError:
+            return
+        self.context.predicate_ids = tuple(predicate_ids)
 
 def importContentTypeRegistry(context):
     """Import content type registry settings from an XML file.


Property changes on: Products.CMFCore/trunk/Products/CMFCore/exportimport/contenttyperegistry.py
___________________________________________________________________
Deleted: svn:keywords
   - Id

Modified: Products.CMFCore/trunk/Products/CMFCore/exportimport/tests/test_contenttyperegistry.py
===================================================================
--- Products.CMFCore/trunk/Products/CMFCore/exportimport/tests/test_contenttyperegistry.py	2011-07-18 10:16:17 UTC (rev 122276)
+++ Products.CMFCore/trunk/Products/CMFCore/exportimport/tests/test_contenttyperegistry.py	2011-07-18 11:41:02 UTC (rev 122277)
@@ -55,7 +55,23 @@
 </object>
 """
 
+_FRAGMENT1_IMPORT = """\
+<?xml version="1.0"?>
+<object name="content_type_registry">
+ <predicate name="plain_text" insert-after="*"/>
+ <predicate name="logfiles" insert-before="*"/>
+</object>
+"""
 
+_FRAGMENT2_IMPORT = """\
+<?xml version="1.0"?>
+<object name="content_type_registry">
+ <predicate name="plain_text" insert-after="stylesheets"/>
+ <predicate name="logfiles" insert-before="images"/>
+</object>
+"""
+
+
 class ContentTypeRegistryXMLAdapterTests(BodyAdapterTestCase,
                                          unittest.TestCase,
                                         ):
@@ -202,6 +218,9 @@
 
     layer = ExportImportZCMLLayer
 
+    _FRAGMENT1_IMPORT = _FRAGMENT1_IMPORT
+    _FRAGMENT2_IMPORT = _FRAGMENT2_IMPORT
+
     def test_normal(self):
         from Products.CMFCore.exportimport.contenttyperegistry \
                 import importContentTypeRegistry
@@ -237,7 +256,43 @@
         self.assertEqual(content_type_name, self.NAME_REGEX_TYPENAME)
         self.assertEqual(predicate.pattern.pattern, self.NAME_REGEX)
 
+    def test_fragment1_skip_purge(self):
+        from Products.CMFCore.exportimport.contenttyperegistry \
+                import importContentTypeRegistry
 
+        site = self._initSite(mit_predikat=True)
+        ctr = site.content_type_registry
+        self.assertEqual(len(ctr.listPredicates()), len(_TEST_PREDICATES))
+        self.assertEqual(ctr.predicate_ids, ('plain_text', 'stylesheets',
+                                             'images', 'logfiles'))
+
+        context = DummyImportContext(site, False)
+        context._files['contenttyperegistry.xml'] = self._FRAGMENT1_IMPORT
+        importContentTypeRegistry(context)
+
+        self.assertEqual(len(ctr.listPredicates()), len(_TEST_PREDICATES))
+        self.assertEqual(ctr.predicate_ids, ('logfiles', 'stylesheets',
+                                             'images', 'plain_text'))
+
+    def test_fragment2_skip_purge(self):
+        from Products.CMFCore.exportimport.contenttyperegistry \
+                import importContentTypeRegistry
+
+        site = self._initSite(mit_predikat=True)
+        ctr = site.content_type_registry
+        self.assertEqual(len(ctr.listPredicates()), len(_TEST_PREDICATES))
+        self.assertEqual(ctr.predicate_ids, ('plain_text', 'stylesheets',
+                                             'images', 'logfiles'))
+
+        context = DummyImportContext(site, False)
+        context._files['contenttyperegistry.xml'] = self._FRAGMENT2_IMPORT
+        importContentTypeRegistry(context)
+
+        self.assertEqual(len(ctr.listPredicates()), len(_TEST_PREDICATES))
+        self.assertEqual(ctr.predicate_ids, ('stylesheets', 'plain_text',
+                                             'logfiles', 'images'))
+
+
 def test_suite():
     return unittest.TestSuite((
         unittest.makeSuite(ContentTypeRegistryXMLAdapterTests),



More information about the checkins mailing list