[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