[Checkins] SVN: Products.GenericSetup/trunk/ - fixed two 'date' property issues

Yvo Schubbe y.2011 at wcm-solutions.de
Thu Feb 24 03:28:59 EST 2011


Log message for revision 120559:
  - fixed two 'date' property issues
  - refactored PropertyManagerHelpers tests

Changed:
  U   Products.GenericSetup/trunk/Products/GenericSetup/tests/test_utils.py
  U   Products.GenericSetup/trunk/Products/GenericSetup/utils.py
  UU  Products.GenericSetup/trunk/docs/CHANGES.rst

-=-
Modified: Products.GenericSetup/trunk/Products/GenericSetup/tests/test_utils.py
===================================================================
--- Products.GenericSetup/trunk/Products/GenericSetup/tests/test_utils.py	2011-02-23 19:42:14 UTC (rev 120558)
+++ Products.GenericSetup/trunk/Products/GenericSetup/tests/test_utils.py	2011-02-24 08:28:59 UTC (rev 120559)
@@ -16,11 +16,35 @@
 import unittest
 import Testing
 
+from DateTime.DateTime import DateTime
+from Testing.ZopeTestCase import installProduct
 from Testing.ZopeTestCase import ZopeTestCase
-from Testing.ZopeTestCase import installProduct
 
 installProduct('GenericSetup')
 
+_TESTED_PROPERTIES = (
+    {'id': 'foo_boolean', 'type': 'boolean', 'mode': 'wd'},
+    {'id': 'foo_date', 'type': 'date', 'mode': 'wd'},
+    {'id': 'foo_float', 'type': 'float', 'mode': 'wd'},
+    {'id': 'foo_int', 'type': 'int', 'mode': 'wd'},
+    {'id': 'foo_lines', 'type': 'lines', 'mode': 'wd'},
+    {'id': 'foo_long', 'type': 'long', 'mode': 'wd'},
+    {'id': 'foo_string', 'type': 'string', 'mode': 'wd'},
+    {'id': 'foo_text', 'type': 'text', 'mode': 'wd'},
+    {'id': 'foo_tokens', 'type': 'tokens', 'mode': 'wd'},
+    {'id': 'foo_selection', 'type': 'selection',
+           'select_variable': 'foobarbaz', 'mode': 'wd'},
+    {'id': 'foo_mselection', 'type': 'multiple selection',
+           'select_variable': 'foobarbaz', 'mode': 'wd'},
+    {'id': 'foo_boolean0', 'type': 'boolean', 'mode': 'wd'},
+    {'id': 'foo_date_naive', 'type': 'date', 'mode': 'wd'},
+    {'id': 'foo_ro', 'type': 'string', 'mode': ''},
+    {'id': 'foo_boolean_nodel', 'type': 'boolean', 'mode': 'w'},
+    {'id': 'foo_date_nodel', 'type': 'date', 'mode': 'w'},
+    {'id': 'foo_float_nodel', 'type': 'float', 'mode': 'w'},
+    {'id': 'foo_int_nodel', 'type': 'int', 'mode': 'w'},
+)
+
 _EMPTY_PROPERTY_EXPORT = """\
 <?xml version="1.0"?>
 <dummy>
@@ -38,9 +62,11 @@
  <property name="foo_mselection" select_variable="foobarbaz"
     type="multiple selection"/>
  <property name="foo_boolean0" type="boolean">False</property>
+ <property name="foo_date_naive" type="date">1970/01/01 00:00:00</property>
+ <property name="foo_boolean_nodel">False</property>
+ <property name="foo_date_nodel">1970/01/01 00:00:00 UTC</property>
+ <property name="foo_float_nodel">0.0</property>
  <property name="foo_int_nodel">0</property>
- <property name="foo_float_nodel">0.0</property>
- <property name="foo_boolean_nodel">False</property>
 </dummy>
 """
 
@@ -72,9 +98,11 @@
   <element value="Baz"/>
  </property>
  <property name="foo_boolean0" type="boolean">False</property>
+ <property name="foo_date_naive" type="date">2000/01/01 00:00:00</property>
+ <property name="foo_boolean_nodel">True</property>
+ <property name="foo_date_nodel">2000/01/01 00:00:00 UTC</property>
+ <property name="foo_float_nodel">3.1415</property>
  <property name="foo_int_nodel">1789</property>
- <property name="foo_float_nodel">3.1415</property>
- <property name="foo_boolean_nodel">True</property>
 </dummy>
 """.encode('utf-8')
 
@@ -104,9 +132,11 @@
   <element value="Baz"/>
  </property>
  <property name="foo_boolean0">False</property>
+ <property name="foo_date_naive">2000/01/01 00:00:00</property>
+ <property name="foo_boolean_nodel">True</property>
+ <property name="foo_date_nodel">2000/01/01 00:00:00 UTC</property>
+ <property name="foo_float_nodel">3.1415</property>
  <property name="foo_int_nodel">1789</property>
- <property name="foo_float_nodel">3.1415</property>
- <property name="foo_boolean_nodel">True</property>
 </dummy>
 """.encode('utf-8')
 
@@ -268,32 +298,34 @@
 
         return Foo(context, environ)
 
+    def _getContextClass(self):
+        from OFS.PropertyManager import PropertyManager
+
+        class DummyContext(PropertyManager):
+            _properties = _TESTED_PROPERTIES
+        return DummyContext
+
     def _makeContext(self):
-        from OFS.PropertyManager import PropertyManager
-        obj = PropertyManager('obj')
+        obj = self._getContextClass()()
         obj.foobarbaz = ('Foo', 'Bar', 'Baz')
-        obj._properties = ()
-        obj.manage_addProperty('foo_boolean', '', 'boolean')
-        obj.manage_addProperty('foo_date', '1970/01/01 00:00:00 UTC', 'date')
-        obj.manage_addProperty('foo_float', '0', 'float')
-        obj.manage_addProperty('foo_int', '0', 'int')
-        obj.manage_addProperty('foo_lines', '', 'lines')
-        obj.manage_addProperty('foo_long', '0', 'long')
-        obj.manage_addProperty('foo_string', '', 'string')
-        obj.manage_addProperty('foo_text', '', 'text')
-        obj.manage_addProperty('foo_tokens', '', 'tokens')
-        obj.manage_addProperty('foo_selection', 'foobarbaz', 'selection')
-        obj.manage_addProperty('foo_mselection', 'foobarbaz',
-                               'multiple selection')
-        obj.manage_addProperty('foo_boolean0', '', 'boolean')
-        obj.manage_addProperty('foo_ro', '', 'string')
-        obj._properties[-1]['mode'] = '' # Read-only, not exported or purged
-        obj.manage_addProperty('foo_int_nodel', 0, 'int')
-        obj._properties[-1]['mode'] = 'w' # Not deletable
-        obj.manage_addProperty('foo_float_nodel', 0, 'float')
-        obj._properties[-1]['mode'] = 'w' # Not deletable
-        obj.manage_addProperty('foo_boolean_nodel', '', 'boolean')
-        obj._properties[-1]['mode'] = 'w' # Not deletable
+        obj.foo_boolean = False
+        obj.foo_date = DateTime('1970/01/01 00:00:00 UTC')
+        obj.foo_float = 0.0
+        obj.foo_int = 0
+        obj.foo_lines = []
+        obj.foo_long = 0
+        obj.foo_string = ''
+        obj.foo_text = ''
+        obj.foo_tokens = ()
+        obj.foo_selection = ''
+        obj.foo_mselection = ()
+        obj.foo_boolean0 = 0
+        obj.foo_date_naive = DateTime('1970/01/01 00:00:00')
+        obj.foo_ro = ''
+        obj.foo_boolean_nodel = False
+        obj.foo_date_nodel = DateTime('1970/01/01 00:00:00 UTC')
+        obj.foo_float_nodel = 0.0
+        obj.foo_int_nodel = 0
         return obj
 
     def _getReal(self, obj):
@@ -313,10 +345,12 @@
         obj._updateProperty('foo_selection', 'Foo')
         obj._updateProperty( 'foo_mselection', ('Foo', 'Baz') )
         obj.foo_boolean0 = 0
+        obj._updateProperty('foo_date_naive', '2000/01/01 00:00:00')
         obj._updateProperty('foo_ro', 'RO')
+        obj._updateProperty('foo_boolean_nodel', 'True')
+        obj._updateProperty('foo_date_nodel', '2000/01/01 00:00:00 UTC')
+        obj._updateProperty('foo_float_nodel', '3.1415')
         obj._updateProperty('foo_int_nodel', '1789')
-        obj._updateProperty('foo_float_nodel', '3.1415')
-        obj._updateProperty('foo_boolean_nodel', 'True')
 
     def test__extractProperties_empty(self):
         from Products.GenericSetup.utils import PrettyDocument
@@ -364,7 +398,13 @@
         self.assertEqual(getattr(obj, 'foo_selection', None), None)
         self.assertEqual(getattr(obj, 'foo_mselection', None), None)
         self.assertEqual(getattr(obj, 'foo_boolean0', None), None)
-        self.assertEqual(getattr(obj, 'foo_ro', None), 'RO')
+        self.assertEqual(getattr(obj, 'foo_date_naive', None), None)
+        self.assertEqual(obj.foo_ro, 'RO')
+        self.assertEqual(obj.foo_boolean_nodel, False)
+        self.assertEqual(obj.foo_date_nodel,
+                         DateTime('1970/01/01 00:00:00 UTC'))
+        self.assertEqual(obj.foo_float_nodel, 0.0)
+        self.assertEqual(obj.foo_int_nodel, 0)
 
     def test__initProperties_normal(self):
         from Products.GenericSetup.utils import PrettyDocument
@@ -469,26 +509,7 @@
         from Products.GenericSetup.testing import DummySetupEnviron
 
         class Foo(self._getTargetClass(), NodeAdapterBase):
-            _PROPERTIES = (
-                {'id': 'foo_boolean', 'type': 'boolean', 'mode': 'wd'},
-                {'id': 'foo_date', 'type': 'date', 'mode': 'wd'},
-                {'id': 'foo_float', 'type': 'float', 'mode': 'wd'},
-                {'id': 'foo_int', 'type': 'int', 'mode': 'wd'},
-                {'id': 'foo_lines', 'type': 'lines', 'mode': 'wd'},
-                {'id': 'foo_long', 'type': 'long', 'mode': 'wd'},
-                {'id': 'foo_string', 'type': 'string', 'mode': 'wd'},
-                {'id': 'foo_text', 'type': 'text', 'mode': 'wd'},
-                {'id': 'foo_tokens', 'type': 'tokens', 'mode': 'wd'},
-                {'id': 'foo_selection', 'type': 'selection',
-                       'select_variable': 'foobarbaz', 'mode': 'wd'},
-                {'id': 'foo_mselection', 'type': 'multiple selection',
-                       'select_variable': 'foobarbaz', 'mode': 'wd'},
-                {'id': 'foo_boolean0', 'type': 'boolean', 'mode': 'wd'},
-                {'id': 'foo_ro', 'type': 'string', 'mode': ''},
-                {'id': 'foo_int_nodel', 'type': 'int', 'mode': 'w'},
-                {'id': 'foo_float_nodel', 'type': 'float', 'mode': 'w'},
-                {'id': 'foo_boolean_nodel', 'type': 'boolean', 'mode': 'w'},
-            )
+            _PROPERTIES = _TESTED_PROPERTIES
 
         if context is None:
             context = self._makeContext()
@@ -498,35 +519,15 @@
 
         return Foo(context, environ)
 
-    def _makeContext(self):
-        from DateTime.DateTime import DateTime
+    def _getContextClass(self):
         class NonPropertyManager:
             pass
-        obj = NonPropertyManager()
-        obj.foobarbaz = ('Foo', 'Bar', 'Baz')
-        obj.foo_boolean = False
-        obj.foo_date = DateTime('1970/01/01 00:00:00 UTC')
-        obj.foo_float = 0.0
-        obj.foo_int = 0
-        obj.foo_lines = []
-        obj.foo_long = 0
-        obj.foo_string = ''
-        obj.foo_text = ''
-        obj.foo_tokens = ()
-        obj.foo_selection = ''
-        obj.foo_mselection = ()
-        obj.foo_boolean0 = 0
-        obj.foo_ro = ''
-        obj.foo_int_nodel = 0
-        obj.foo_float_nodel = 0.0
-        obj.foo_boolean_nodel = False
-        return obj
+        return NonPropertyManager
 
     def _getReal(self, obj):
         return obj._real
 
     def _populate(self, obj):
-        from DateTime.DateTime import DateTime
         obj.foo_boolean = True
         obj.foo_date = DateTime('2000/01/01 00:00:00 UTC')
         obj.foo_float = 1.1
@@ -539,10 +540,12 @@
         obj.foo_selection = 'Foo'
         obj.foo_mselection = ('Foo', 'Baz')
         obj.foo_boolean0 = 0
+        obj.foo_date_naive = DateTime('2000/01/01 00:00:00')
         obj.foo_ro = 'RO'
+        obj.foo_boolean_nodel = True
+        obj.foo_date_nodel = DateTime('2000/01/01 00:00:00 UTC')
+        obj.foo_float_nodel = 3.1415
         obj.foo_int_nodel = 1789
-        obj.foo_float_nodel = 3.1415
-        obj.foo_boolean_nodel = True
 
 
 class MarkerInterfaceHelpersTests(unittest.TestCase):

Modified: Products.GenericSetup/trunk/Products/GenericSetup/utils.py
===================================================================
--- Products.GenericSetup/trunk/Products/GenericSetup/utils.py	2011-02-23 19:42:14 UTC (rev 120558)
+++ Products.GenericSetup/trunk/Products/GenericSetup/utils.py	2011-02-24 08:28:59 UTC (rev 120559)
@@ -655,6 +655,11 @@
             else:
                 if prop_map.get('type') == 'boolean':
                     prop = unicode(bool(prop))
+                elif prop_map.get('type') == 'date':
+                    if prop.timezoneNaive():
+                        prop = unicode(prop).rsplit(' ', 1)[0]
+                    else:
+                        prop = unicode(prop)
                 elif isinstance(prop, str):
                     prop = prop.decode(self._encoding)
                 elif not isinstance(prop, basestring):
@@ -690,6 +695,8 @@
                     prop_value = ()
                 elif prop_type in ('int', 'float'):
                     prop_value = 0
+                elif prop_type == 'date':
+                    prop_value = '1970/01/01 00:00:00 UTC' # DateTime(0) as UTC
                 else:
                     prop_value = ''
                 self.context._updateProperty(prop_id, prop_value)

Modified: Products.GenericSetup/trunk/docs/CHANGES.rst
===================================================================
--- Products.GenericSetup/trunk/docs/CHANGES.rst	2011-02-23 19:42:14 UTC (rev 120558)
+++ Products.GenericSetup/trunk/docs/CHANGES.rst	2011-02-24 08:28:59 UTC (rev 120559)
@@ -4,6 +4,10 @@
 1.6.3 (unreleased)
 ------------------
 
+- Property import/export: Fixed two 'date' property issues.
+  Naive 'date' values are now exported without time zone. And purging
+  non-deletable 'date' properties is fixed.
+
 - Export content objects whose 'manage_FTPget' returns a custom iterator
   with 'file' and 'size' properties.  https://bugs.launchpad.net/bugs/722726
 


Property changes on: Products.GenericSetup/trunk/docs/CHANGES.rst
___________________________________________________________________
Deleted: svn:mergeinfo
   - 



More information about the checkins mailing list