[Checkins] SVN: zc.datetimewidget/branches/gintas-dateranges/src/zc/datetimewidget/datetimewidget. Do proper multi-date widget initialization.

Gintautas Miliauskas gintas at pov.lt
Wed Dec 6 07:45:08 EST 2006


Log message for revision 71435:
  Do proper multi-date widget initialization.
  Cleaned up tests a little bit.
  

Changed:
  U   zc.datetimewidget/branches/gintas-dateranges/src/zc/datetimewidget/datetimewidget.py
  U   zc.datetimewidget/branches/gintas-dateranges/src/zc/datetimewidget/datetimewidget.txt

-=-
Modified: zc.datetimewidget/branches/gintas-dateranges/src/zc/datetimewidget/datetimewidget.py
===================================================================
--- zc.datetimewidget/branches/gintas-dateranges/src/zc/datetimewidget/datetimewidget.py	2006-12-06 12:38:17 UTC (rev 71434)
+++ zc.datetimewidget/branches/gintas-dateranges/src/zc/datetimewidget/datetimewidget.py	2006-12-06 12:45:07 UTC (rev 71435)
@@ -179,6 +179,8 @@
 class CalendarWidgetConfiguration(object):
     implements(ICalendarWidgetConfiguration)
 
+    _multiple_dates = None
+
     def __init__(self, name, **kw):
         self.name = name.replace('.', '_')
         for name, field in getFieldsInOrder(ICalendarWidgetConfiguration):
@@ -191,7 +193,7 @@
             raise ValueError('unknown arguments: %s' % ', '.join(kw.keys()))
 
     def setMultiple(self, dates):
-        self._multiple_dates = dates # TODO: add the dates
+        self._multiple_dates = dates
         self.multiple = 'multi_%s' % self.name
         self.onClose = ('getMultipleDateClosedHandler("%s", multi_%s)'
                         % (self.inputField, self.name))
@@ -219,7 +221,7 @@
                 elif isinstance(value, bool):
                     value_repr = value and 'true' or 'false'
                 elif isinstance(value, datetime.date):
-                    value_repr = 'date(%d, %d, %d)' % (value.year,
+                    value_repr = 'new Date(%d, %d, %d)' % (value.year,
                                                        value.month-1, value.day)
                 else:
                     raise ValueError(value)
@@ -250,10 +252,16 @@
         return self._render(widget_html)
 
     def hidden(self):
+        """Render the widget with the actual date list field hidden."""
         widget_html = super(DatetimeBase, self).hidden()
         return self._render(widget_html)
 
     def _render(self, widget_html):
+        """Render the date widget.
+
+        `widget_html` is the HTML for the simple date field.  This method
+        wraps that field in some extra code for the advanced JavaScript widget.
+        """
         zc.resourcelibrary.need('zc.datetimewidget')
         lang = self.request.locale.id.language
         lang = lang in LANGS and lang or 'en'
@@ -271,7 +279,9 @@
 
         multiple_init = ''
         if getattr(conf, 'multiple', None):
-            multiple_init = 'var multi_%s = [];' % self.name.replace('.', '_')
+            initial_dates = self.datesInJS(conf._multiple_dates)
+            multi_varname = 'multi_' + self.name.replace('.', '_')
+            multiple_init = 'var %s = %s;' % (multi_varname, initial_dates)
 
         return template % dict(widget_html=widget_html,
                                trigger_name=trigger_name,
@@ -279,6 +289,18 @@
                                multiple_init=multiple_init,
                                calendarSetup=conf.dumpJS())
 
+    def datesInJS(self, dates):
+        """Return a list of dates in JavaScript-ready format.
+
+        `dates` may be None or a set of datetime.date() objects.
+        """
+        if not dates:
+            return '[]'
+
+        date_reprs = ['new Date(%d, %d, %d)' % (dt.year, dt.month-1, dt.day)
+                      for dt in sorted(dates)]
+        return '[' + ', '.join(date_reprs) + ']'
+
     def _configuration(self):
         trigger_name = '%s_trigger' % self.name
         conf = CalendarWidgetConfiguration(self.name,
@@ -361,7 +383,8 @@
 
     def _configuration(self):
         conf = DatetimeBase._configuration(self)
-        conf.setMultiple([]) # TODO insert real dates
+        value = self.context.query(self.context.context, default=[])
+        conf.setMultiple(value)
         return conf
 
     def _toFieldValue(self, input):

Modified: zc.datetimewidget/branches/gintas-dateranges/src/zc/datetimewidget/datetimewidget.txt
===================================================================
--- zc.datetimewidget/branches/gintas-dateranges/src/zc/datetimewidget/datetimewidget.txt	2006-12-06 12:38:17 UTC (rev 71434)
+++ zc.datetimewidget/branches/gintas-dateranges/src/zc/datetimewidget/datetimewidget.txt	2006-12-06 12:45:07 UTC (rev 71435)
@@ -52,7 +52,7 @@
       inputField: 'inp',
       eventName: null,
       daFormat: '%m-%d',
-      date: date(2006, 7, 25)
+      date: new Date(2006, 7, 25)
     });
 
 Invalid arguments are not accepted:
@@ -70,41 +70,47 @@
     >>> from zope.schema import Set
     >>> from zope.publisher.browser import TestRequest
 
+    >>> class Context(object):
+    ...     somedates = set()
+    >>> context = Context()
+
     >>> request = TestRequest()
-    >>> field = Set()
-    >>> field.context = set()
+    >>> field = Set(__name__='somedates')
+    >>> field.set(context, set([datetime.date(2006, 12, 6),
+    ...                         datetime.date(2006, 12, 7)]))
+    >>> field = field.bind(context)
     >>> widget = DateSetWidget(field, object(), request)
 
     >>> print widget() # doctest: +REPORT_NDIFF
     <BLANKLINE>
-    <input class="textType" id="field." name="field." size="30" type="text" value=""  />
-    <input type="button" value="..." id="field._trigger">
+    <input class="textType" id="field.somedates" name="field.somedates" size="30" type="text" value=""  />
+    <input type="button" value="..." id="field.somedates_trigger">
     <script type="text/javascript">
     <BLANKLINE>
-      var multi_field_ = [];
+      var multi_field_somedates = [new Date(2006, 11, 6), new Date(2006, 11, 7)];
       Calendar.setup({
-      inputField: 'field.',
-      button: 'field._trigger',
+      inputField: 'field.somedates',
+      button: 'field.somedates_trigger',
       ifFormat: '%Y-%m-%d',
-      onClose: getMultipleDateClosedHandler("field.", multi_field_),
-      multiple: multi_field_
+      onClose: getMultipleDateClosedHandler("field.somedates", multi_field_somedates),
+      multiple: multi_field_somedates
     });
     <BLANKLINE>
     </script>
     <BLANKLINE>
 
-    >>> print widget.hidden()
-    <input class="hiddenType" id="field." name="field." type="hidden" value=""  />
-    <input type="button" value="..." id="field._trigger">
+    >>> print widget.hidden() # doctest: +REPORT_NDIFF
+    <input class="hiddenType" id="field.somedates" name="field.somedates" type="hidden" value=""  />
+    <input type="button" value="..." id="field.somedates_trigger">
     <script type="text/javascript">
     <BLANKLINE>
-      var multi_field_ = [];
+      var multi_field_somedates = [new Date(2006, 11, 6), new Date(2006, 11, 7)];
       Calendar.setup({
-      inputField: 'field.',
-      button: 'field._trigger',
+      inputField: 'field.somedates',
+      button: 'field.somedates_trigger',
       ifFormat: '%Y-%m-%d',
-      onClose: getMultipleDateClosedHandler("field.", multi_field_),
-      multiple: multi_field_
+      onClose: getMultipleDateClosedHandler("field.somedates", multi_field_somedates),
+      multiple: multi_field_somedates
     });
     <BLANKLINE>
     </script>



More information about the Checkins mailing list