SVN: CMF/trunk/CMFDefault/formlib/ - fixed some datetime conversion issues (now ISO 8601 is used as intermediate format)

Yvo Schubbe <[email protected]>
Newsgroups gmane.comp.web.zope.cmf.cvs
Message-ID <[email protected]>
Log message for revision 71117:
  - fixed some datetime conversion issues (now ISO 8601 is used as intermediate format)
  - added support for lists and tuples

Changed:
  U   CMF/trunk/CMFDefault/formlib/form.py
  U   CMF/trunk/CMFDefault/formlib/schema.py
  U   CMF/trunk/CMFDefault/formlib/schema.txt

-=-
Modified: CMF/trunk/CMFDefault/formlib/form.py
===================================================================
--- CMF/trunk/CMFDefault/formlib/form.py	2006-11-13 09:52:05 UTC (rev 71116)
+++ CMF/trunk/CMFDefault/formlib/form.py	2006-11-13 13:57:40 UTC (rev 71117)
@@ -21,7 +21,7 @@
 from Products.Five.browser.pagetemplatefile import ViewPageTemplateFile
 from Products.Five.formlib.formbase import PageDisplayForm
 from Products.Five.formlib.formbase import PageForm
-from Products.PluginIndexes.DateIndex.DateIndex import Local
+from zope.datetime import parseDatetimetz
 from zope.formlib import form
 from zope.i18n.interfaces import IUserPreferredLanguages
 from zope.i18n.locales import LoadLocaleError
@@ -133,7 +133,7 @@
             if isinstance(v, Set):
                 data[k] = set(v)
             elif isinstance(v, datetime) and v.tzname() is None:
-                data[k] = v.replace(tzinfo=Local)
+                data[k] = parseDatetimetz(str(v))
         if form.applyChanges(self.context, self.form_fields, data,
                              self.adapters):
             self.context.reindexObject()

Modified: CMF/trunk/CMFDefault/formlib/schema.py
===================================================================
--- CMF/trunk/CMFDefault/formlib/schema.py	2006-11-13 09:52:05 UTC (rev 71116)
+++ CMF/trunk/CMFDefault/formlib/schema.py	2006-11-13 13:57:40 UTC (rev 71117)
@@ -18,7 +18,7 @@
 from datetime import datetime
 
 from DateTime.DateTime import DateTime
-from Products.PluginIndexes.DateIndex.DateIndex import Local
+from zope.datetime import parseDatetimetz
 from zope.interface import implements
 from zope.schema import BytesLine
 from zope.schema.interfaces import IBytesLine
@@ -68,12 +68,16 @@
         if isinstance(attribute, str) and inst.encoding:
             return attribute.decode(inst.encoding)
         elif isinstance(attribute, DateTime):
-            return datetime.fromtimestamp(attribute.timeTime(), Local)
+            return parseDatetimetz(attribute.ISO8601())
         elif isinstance(attribute, (tuple, list)):
             if inst.encoding:
                 attribute = [ isinstance(v, str)
                               and v.decode(inst.encoding) or v
                               for v in attribute ]
+            if self._field._type == list:
+                return attribute
+            if self._field._type == tuple:
+                return tuple(attribute)
             return set(attribute)
         return attribute
 
@@ -85,13 +89,14 @@
         if isinstance(value, unicode) and inst.encoding:
             value = value.encode(inst.encoding)
         elif isinstance(value, datetime):
-            value = DateTime(*value.astimezone(Local).timetuple()[:6])
-        elif isinstance(value, set):
+            value = DateTime(value.isoformat())
+        elif isinstance(value, (set, tuple, list)):
             if inst.encoding:
                 value = [ isinstance(v, unicode)
                           and v.encode(inst.encoding) or v
                           for v in value ]
-            value = tuple(value)
+            if not self._field._type == list:
+                value = tuple(value)
         if self._set_name:
             getattr(inst.context, self._set_name)(value)
         elif inst.context.hasProperty(self._get_name):

Modified: CMF/trunk/CMFDefault/formlib/schema.txt
===================================================================
--- CMF/trunk/CMFDefault/formlib/schema.txt	2006-11-13 09:52:05 UTC (rev 71116)
+++ CMF/trunk/CMFDefault/formlib/schema.txt	2006-11-13 13:57:40 UTC (rev 71117)
@@ -11,6 +11,8 @@
       ...     foo_text = ''
       ...     foo_datetime = None
       ...     foo_set = ()
+      ...     foo_list = []
+      ...     foo_tuple = ()
       ...     foo_prop = ''
 
       >>> from zope.interface import Interface
@@ -19,6 +21,8 @@
       ...     foo_text = schema.Text()
       ...     foo_datetime = schema.Datetime()
       ...     foo_set = schema.Set()
+      ...     foo_list = schema.List()
+      ...     foo_tuple = schema.Tuple()
       ...     foo_prop = schema.Text()
 
       >>> from Products.CMFDefault.formlib.schema import ProxyFieldProperty
@@ -27,6 +31,8 @@
       ...     foo_text = ProxyFieldProperty(IFooContentView['foo_text'])
       ...     foo_datetime = ProxyFieldProperty(IFooContentView['foo_datetime'])
       ...     foo_set = ProxyFieldProperty(IFooContentView['foo_set'])
+      ...     foo_list = ProxyFieldProperty(IFooContentView['foo_list'])
+      ...     foo_tuple = ProxyFieldProperty(IFooContentView['foo_tuple'])
       ...     foo_prop = ProxyFieldProperty(IFooContentView['foo_prop'])
       ... 
       ...     def __init__(self, context):
@@ -57,6 +63,15 @@
       >>> adapter.foo_datetime == foo_datetime
       True
 
+      >>> foo_zope_datetime = DateTime(1970, 0)
+      >>> content.foo_datetime = foo_zope_datetime
+      >>> foo_python_datetime = adapter.foo_datetime
+      >>> adapter.foo_datetime = foo_python_datetime
+      >>> content.foo_datetime == foo_zope_datetime
+      True
+      >>> adapter.foo_datetime == foo_python_datetime
+      True
+
     set is mapped to tuple::
 
       >>> foo_set = set([3, 1, 4])
@@ -66,6 +81,24 @@
       >>> adapter.foo_set == foo_set
       True
 
+    list with unicode is mapped to list with str::
+
+      >>> foo_list = [3, 1, u'foo']
+      >>> adapter.foo_list = foo_list
+      >>> content.foo_list
+      [3, 1, 'foo']
+      >>> adapter.foo_list == foo_list
+      True
+
+    tuple with unicode is mapped to tuple with str::
+
+      >>> foo_tuple = (3, 1, u'foo')
+      >>> adapter.foo_tuple = foo_tuple
+      >>> content.foo_tuple
+      (3, 1, 'foo')
+      >>> adapter.foo_tuple == foo_tuple
+      True
+
     PropertyManager properties use _setProperty::
 
       >>> foo_prop = u'foo'
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.