[Checkins] SVN: Products.CMFDefault/trunk/Products/CMFDefault/ - MetadataTool: Replaced write-on-read upgrade for the Dublin Core

Jens Vagelpohl jens at dataflake.org
Wed Dec 9 06:36:56 EST 2009


Log message for revision 106327:
  - MetadataTool: Replaced write-on-read upgrade for the Dublin Core
    metadata definitions with a set of GenericSetup upgrade steps.
  

Changed:
  U   Products.CMFDefault/trunk/Products/CMFDefault/CHANGES.txt
  U   Products.CMFDefault/trunk/Products/CMFDefault/MetadataTool.py
  U   Products.CMFDefault/trunk/Products/CMFDefault/tests/test_MetadataTool.py
  U   Products.CMFDefault/trunk/Products/CMFDefault/upgrade/configure.zcml
  A   Products.CMFDefault/trunk/Products/CMFDefault/upgrade/to20.py
  U   Products.CMFDefault/trunk/Products/CMFDefault/upgrade/to22.py

-=-
Modified: Products.CMFDefault/trunk/Products/CMFDefault/CHANGES.txt
===================================================================
--- Products.CMFDefault/trunk/Products/CMFDefault/CHANGES.txt	2009-12-09 11:36:40 UTC (rev 106326)
+++ Products.CMFDefault/trunk/Products/CMFDefault/CHANGES.txt	2009-12-09 11:36:55 UTC (rev 106327)
@@ -4,7 +4,10 @@
 2.3.0-alpha (unreleased)
 ------------------------
 
+- MetadataTool: Replaced write-on-read upgrade for the Dublin Core
+  metadata definitions with a set of GenericSetup upgrade steps.
 
+
 2.2.0-beta (2009-12-06)
 -----------------------
 

Modified: Products.CMFDefault/trunk/Products/CMFDefault/MetadataTool.py
===================================================================
--- Products.CMFDefault/trunk/Products/CMFDefault/MetadataTool.py	2009-12-09 11:36:40 UTC (rev 106326)
+++ Products.CMFDefault/trunk/Products/CMFDefault/MetadataTool.py	2009-12-09 11:36:55 UTC (rev 106327)
@@ -375,34 +375,6 @@
     id = 'portal_metadata'
     meta_type = 'Default Metadata Tool'
 
-    _DCMI = None
-    def _get_DCMI( self ):
-        # BBB: for metadata tools created with CMF 1.6 (or older) and
-        #      for never used metadata tools created with CMF 2.0 or CMF 2.1
-        # XXX: this should be replaced by upgrade steps
-        if self._DCMI is None:
-            dcmi = self._DCMI = MetadataSchema( 'DCMI', _DCMI_ELEMENT_SPECS )
-
-            old_specs = getattr( self, 'element_specs', None )
-            if old_specs is not None:
-                del self.element_specs
-                for element_id, old_spec in old_specs.items():
-                    new_spec = dcmi.getElementSpec( element_id )
-                    for typ, policy in old_spec.listPolicies():
-                        if typ is not None:
-                            new_spec.addPolicy( typ )
-                        tp = new_spec.getPolicy( typ )
-                        tp.edit( is_required=policy.isRequired()
-                               , supply_default=policy.supplyDefault()
-                               , default_value=policy.defaultValue()
-                               , enforce_vocabulary=policy.enforceVocabulary()
-                               , allowed_vocabulary=policy.allowedVocabulary()
-                               )
-
-        return self._DCMI
-
-    DCMI = property(_get_DCMI, None)
-
     #
     #   Default values.
     #
@@ -413,7 +385,7 @@
     def __init__( self, publisher=None ):
 
         self.editProperties(publisher)
-        self._DCMI = MetadataSchema('DCMI', _DCMI_ELEMENT_SPECS)
+        self.DCMI = MetadataSchema('DCMI', _DCMI_ELEMENT_SPECS)
 
     #
     #   ZMI methods

Modified: Products.CMFDefault/trunk/Products/CMFDefault/tests/test_MetadataTool.py
===================================================================
--- Products.CMFDefault/trunk/Products/CMFDefault/tests/test_MetadataTool.py	2009-12-09 11:36:40 UTC (rev 106326)
+++ Products.CMFDefault/trunk/Products/CMFDefault/tests/test_MetadataTool.py	2009-12-09 11:36:55 UTC (rev 106327)
@@ -480,48 +480,7 @@
         tool.removeSchema( 'Arbitrary' )
         self.assertRaises( KeyError, tool.removeSchema, 'Arbitrary' )
 
-    def test_migration( self ):
-        # Test that we forward-migrate old-style DCMI policies.
-        from Products.CMFDefault.MetadataTool import ElementSpec
 
-        tool = self._makeOne()
-        tool._DCMI = None
-        tool.element_specs = { 'Title' : ElementSpec( 0 )
-                             , 'Description' : ElementSpec( 0 )
-                             , 'Subject' : ElementSpec( 1 )
-                             , 'Format' : ElementSpec( 0 )
-                             , 'Language' : ElementSpec( 0 )
-                             , 'Rights' : ElementSpec( 0 )
-                             }
-        subj = tool.element_specs[ 'Subject' ]
-        subj.addPolicy( 'Foo' )
-        subj.getPolicy( 'Foo' ).edit( False
-                                    , False
-                                    , None
-                                    , True
-                                    , ( 'bar', 'baz' )
-                                    )
-
-        dcmi = tool.DCMI
-
-        self.assertEqual( dcmi.getId(), 'DCMI' )
-
-        # Accessing the DCMI property converts and clears 'element_specs'
-        self.assertRaises(AttributeError, lambda: tool.element_specs )
-
-        subj2 = dcmi.getElementSpec( 'Subject' )
-        subj_default = subj2.getPolicy( None )
-        subj_foo = subj2.getPolicy( 'Foo' )
-
-        self.assertEqual( subj_foo.isRequired(), False )
-        self.assertEqual( subj_foo.supplyDefault(), False )
-        self.assertEqual( subj_foo.defaultValue(), None )
-        self.assertEqual( subj_foo.enforceVocabulary(), True )
-        self.assertEqual( len( subj_foo.allowedVocabulary() ), 2 )
-        self.failUnless( 'bar' in subj_foo.allowedVocabulary() )
-        self.failUnless( 'baz' in subj_foo.allowedVocabulary() )
-
-
 def test_suite():
     return unittest.TestSuite((
         unittest.makeSuite(TestMetadataElementPolicy),

Modified: Products.CMFDefault/trunk/Products/CMFDefault/upgrade/configure.zcml
===================================================================
--- Products.CMFDefault/trunk/Products/CMFDefault/upgrade/configure.zcml	2009-12-09 11:36:40 UTC (rev 106326)
+++ Products.CMFDefault/trunk/Products/CMFDefault/upgrade/configure.zcml	2009-12-09 11:36:55 UTC (rev 106327)
@@ -3,20 +3,34 @@
     xmlns:genericsetup="http://namespaces.zope.org/genericsetup"
     i18n_domain="cmf_default">
 
+  <genericsetup:upgradeSteps
+      source="*"
+      destination="2.0"
+      profile="Products.CMFDefault:default"
+      sortkey="1">
+
+    <genericsetup:upgradeStep
+        title="Upgrade Dublin Core metadata definitions"
+        handler=".to20.upgrade_dcmi_metadata"
+        checker=".to20.check_dcmi_metadata"
+        />
+
+  </genericsetup:upgradeSteps>
+
   <genericsetup:upgradeStep
       title="Mark 2.0 upgrade as finished"
       source="*"
       destination="2.0"
       profile="Products.CMFDefault:default"
       handler=".mark_as_finished"
-      sortkey="1"
+      sortkey="2"
       />
 
   <genericsetup:upgradeSteps
       source="2.0"
       destination="2.1"
       profile="Products.CMFDefault:default"
-      sortkey="2">
+      sortkey="3">
 
     <genericsetup:upgradeStep
         title="Add root site manager"
@@ -50,14 +64,14 @@
       destination="2.1"
       profile="Products.CMFDefault:default"
       handler=".mark_as_finished"
-      sortkey="3"
+      sortkey="4"
       />
 
   <genericsetup:upgradeSteps
       source="2.1"
       destination="2.2"
       profile="Products.CMFDefault:default"
-      sortkey="4">
+      sortkey="5">
 
     <genericsetup:upgradeStep
         title="Upgrade setup tool"
@@ -107,6 +121,12 @@
         checker=".to22.check_catalog_columns"
         />
 
+    <genericsetup:upgradeStep
+        title="Upgrade Dublin Core metadata definitions"
+        handler=".to22.upgrade_dcmi_metadata"
+        checker=".to22.check_dcmi_metadata"
+        />
+
   </genericsetup:upgradeSteps>
 
   <genericsetup:upgradeStep
@@ -115,7 +135,7 @@
       destination="2.2"
       profile="Products.CMFDefault:default"
       handler=".mark_as_finished"
-      sortkey="5"
+      sortkey="6"
       />
 
 </configure>

Copied: Products.CMFDefault/trunk/Products/CMFDefault/upgrade/to20.py (from rev 106324, Products.CMFDefault/branches/2.2/Products/CMFDefault/upgrade/to20.py)
===================================================================
--- Products.CMFDefault/trunk/Products/CMFDefault/upgrade/to20.py	                        (rev 0)
+++ Products.CMFDefault/trunk/Products/CMFDefault/upgrade/to20.py	2009-12-09 11:36:55 UTC (rev 106327)
@@ -0,0 +1,53 @@
+##############################################################################
+#
+# Copyright (c) 2009 Zope Corporation and Contributors. All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+"""Upgrade steps to CMFDefault 2.0.
+
+$Id$
+"""
+import logging
+
+from Acquisition import aq_base
+
+from Products.CMFCore.utils import getToolByName
+from Products.CMFDefault.MetadataTool import _DCMI_ELEMENT_SPECS
+from Products.CMFDefault.MetadataTool import MetadataSchema
+
+
+def check_dcmi_metadata(tool):
+    """1.6.x to 2.0.0 upgrade step checker
+    """
+    metadata_tool = getToolByName(tool, 'portal_metadata')
+    return getattr(aq_base(metadata_tool), 'element_specs', None) is not None
+
+def upgrade_dcmi_metadata(tool):
+    """1.6.x to 2.0.0 upgrade step handler
+    """
+    logger = logging.getLogger('GenericSetup.upgrade')
+    metadata_tool = getToolByName(tool, 'portal_metadata')
+    old_specs = getattr(metadata_tool, 'element_specs', None)
+    if old_specs is not None:
+        del metadata_tool.element_specs
+        dcmi = metadata_tool._DCMI = MetadataSchema('DCMI', _DCMI_ELEMENT_SPECS)
+        for element_id, old_spec in old_specs.items():
+            new_spec = dcmi.getElementSpec(element_id)
+            for typ, policy in old_spec.listPolicies():
+                if typ is not None:
+                    new_spec.addPolicy(typ)
+                tp = new_spec.getPolicy(typ)
+                tp.edit( is_required=policy.isRequired()
+                       , supply_default=policy.supplyDefault()
+                       , default_value=policy.defaultValue()
+                       , enforce_vocabulary=policy.enforceVocabulary()
+                       , allowed_vocabulary=policy.allowedVocabulary()
+                       )
+    logger.info('Dublin Core metadata definition updated.')

Modified: Products.CMFDefault/trunk/Products/CMFDefault/upgrade/to22.py
===================================================================
--- Products.CMFDefault/trunk/Products/CMFDefault/upgrade/to22.py	2009-12-09 11:36:40 UTC (rev 106326)
+++ Products.CMFDefault/trunk/Products/CMFDefault/upgrade/to22.py	2009-12-09 11:36:55 UTC (rev 106327)
@@ -17,6 +17,7 @@
 import logging
 from urllib import quote
 
+from Acquisition import aq_base
 from Acquisition import aq_inner
 from Acquisition import aq_parent
 from zope.component.interfaces import ComponentLookupError
@@ -298,3 +299,20 @@
     if 'getIconURL' not in columns:
         ctool.addColumn('getIconURL')
         logger.info("Catalog column 'getIconURL' added.")
+
+def check_dcmi_metadata(tool):
+    """2.1.x to 2.2.0 upgrade step checker
+    """
+    metadata_tool = getToolByName(tool, 'portal_metadata')
+    return getattr(aq_base(metadata_tool), '_DCMI', None) is not None
+
+def upgrade_dcmi_metadata(tool):
+    """2.1.x to 2.2.0 upgrade step handler
+    """
+    logger = logging.getLogger('GenericSetup.upgrade')
+    metadata_tool = getToolByName(tool, 'portal_metadata')
+    dcmi = metadata_tool._DCMI
+    del metadata_tool._DCMI
+    metadata_tool.DCMI = dcmi
+    logger.info('Dublin Core metadata definition updated.')
+



More information about the checkins mailing list