[Checkins] SVN: Products.CMFCore/trunk/Products/CMFCore/ - Properties export/import: Get the string encoding for property

Jens Vagelpohl jens at dataflake.org
Wed Sep 24 15:57:57 EDT 2008


Log message for revision 91451:
  - Properties export/import: Get the string encoding for property
    imports from the import context and fall back to UTF-8, which
    mirrors the behavior for exports. This fixes property export/import
    round tripping.
    (https://bugs.launchpad.net/zope-cmf/+bug/248853)
  

Changed:
  U   Products.CMFCore/trunk/Products/CMFCore/CHANGES.txt
  U   Products.CMFCore/trunk/Products/CMFCore/exportimport/properties.py
  U   Products.CMFCore/trunk/Products/CMFCore/exportimport/tests/test_properties.py

-=-
Modified: Products.CMFCore/trunk/Products/CMFCore/CHANGES.txt
===================================================================
--- Products.CMFCore/trunk/Products/CMFCore/CHANGES.txt	2008-09-24 19:35:17 UTC (rev 91450)
+++ Products.CMFCore/trunk/Products/CMFCore/CHANGES.txt	2008-09-24 19:57:57 UTC (rev 91451)
@@ -4,6 +4,12 @@
 2.2.0 (unreleased)
 ------------------
 
+- Properties export/import: Get the string encoding for property 
+  imports from the import context and fall back to UTF-8, which 
+  mirrors the behavior for exports. This fixes property export/import 
+  round tripping.
+  (https://bugs.launchpad.net/zope-cmf/+bug/248853)
+
 - traversal: Added ++add++ namespace for add views.
 
 - Skinstool import: Fix imports that manipulate existing skins.

Modified: Products.CMFCore/trunk/Products/CMFCore/exportimport/properties.py
===================================================================
--- Products.CMFCore/trunk/Products/CMFCore/exportimport/properties.py	2008-09-24 19:35:17 UTC (rev 91450)
+++ Products.CMFCore/trunk/Products/CMFCore/exportimport/properties.py	2008-09-24 19:57:57 UTC (rev 91451)
@@ -51,6 +51,8 @@
     def _importNode(self, node):
         """Import the object from the DOM node.
         """
+        self._encoding = self.context.getProperty('default_charset', 'utf-8')
+
         for child in node.childNodes:
             if child.nodeName != 'property':
                 continue

Modified: Products.CMFCore/trunk/Products/CMFCore/exportimport/tests/test_properties.py
===================================================================
--- Products.CMFCore/trunk/Products/CMFCore/exportimport/tests/test_properties.py	2008-09-24 19:35:17 UTC (rev 91450)
+++ Products.CMFCore/trunk/Products/CMFCore/exportimport/tests/test_properties.py	2008-09-24 19:57:57 UTC (rev 91451)
@@ -32,7 +32,7 @@
  <property name="title">Foo</property>
  <property name="default_charset" type="string">iso-8859-1</property>
  <property name="foo_string" type="string">foo</property>
- <property name="bar_string" type="string">Bär</property>
+ <property name="bar_string" type="string">B\xe4r</property>
  <property name="foo_boolean" type="boolean">False</property>
 </site>
 """.encode('utf-8')
@@ -73,7 +73,7 @@
         obj._setPropValue('title', 'Foo')
         obj._setProperty('default_charset', 'iso-8859-1', 'string')
         obj._setProperty('foo_string', 'foo', 'string')
-        obj._setProperty('bar_string', 'Bär', 'string')
+        obj._setProperty('bar_string', u'B\xe4r'.encode('iso-8859-1'), 'string')
         obj._setProperty('foo_boolean', False, 'boolean')
 
     def _verifyImport(self, obj):
@@ -82,7 +82,7 @@
         self.assertEqual(type(obj.foo_string), str)
         self.assertEqual(obj.foo_string, 'foo')
         self.assertEqual(type(obj.bar_string), str)
-        self.assertEqual(obj.bar_string, 'Bär')
+        self.assertEqual(obj.bar_string, u'B\xe4r'.encode('iso-8859-1'))
         self.assertEqual(type(obj.foo_boolean), bool)
         self.assertEqual(obj.foo_boolean, False)
 
@@ -230,11 +230,45 @@
         self.assertEqual( site.getProperty('bar'), ('Bar',) )
 
 
+class roundtripSitePropertiesTests(_SitePropertiesSetup):
+
+    layer = ExportImportZCMLLayer
+
+    def test_nonascii_no_default_charset(self):
+        from Products.CMFCore.exportimport.properties \
+                import exportSiteProperties
+        from Products.CMFCore.exportimport.properties \
+                import importSiteProperties
+
+        NONASCII = u'B\xe4r'.encode('utf-8')
+        site = self._initSite(foo=0, bar=0)
+        site._updateProperty('title', NONASCII)
+
+        self.assertEquals(site.title, NONASCII)
+
+        # export the site properties
+        context = DummyExportContext( site )
+        exportSiteProperties(context)
+        filename, text, content_type = context._wrote[0]
+
+        # Clear the title property
+        site._updateProperty('title', '')
+        self.assertEquals(site.title, '')
+
+        # Import from the previous export
+        context = DummyImportContext(site)
+        context._files['properties.xml'] = text
+        importSiteProperties(context)
+
+        self.assertEquals(site.title, NONASCII)
+
+
 def test_suite():
     return unittest.TestSuite((
         unittest.makeSuite(PropertiesXMLAdapterTests),
         unittest.makeSuite(exportSitePropertiesTests),
         unittest.makeSuite(importSitePropertiesTests),
+        unittest.makeSuite(roundtripSitePropertiesTests),
         ))
 
 if __name__ == '__main__':



More information about the Checkins mailing list