# HG changeset patch # User Damien Garaud # Date 1329734716 -3600 # Node ID 9550555e4c26d2503059b2d72c898fa66b42d4fa # Parent 65b0d2587fb5028ef37b9b94701069e0b833e660 Fix bug about missing Interval field (closes #1463996). Implement Field and Widget dedicated to the yams entity 'Interval': - TimeIntervalField - IntervalTimeWidget Allow to set an integer with a character as a period of time '20s', '48h' or '3d' for instance (turn into seconds). diff -r 65b0d2587fb5 -r 9550555e4c26 i18n/de.po --- a/i18n/de.po Wed Feb 15 18:12:38 2012 +0100 +++ b/i18n/de.po Mon Feb 20 11:45:16 2012 +0100 @@ -962,6 +962,9 @@ msgid "a float is expected" msgstr "Eine Dezimalzahl (float) wird erwartet." +msgid "a number (in seconds) or 20s, 10min, 24h or 4d are expected" +msgstr "" + msgid "" "a simple cache entity characterized by a name and a validity date. The " "target application is responsible for updating timestamp when necessary to " diff -r 65b0d2587fb5 -r 9550555e4c26 i18n/en.po --- a/i18n/en.po Wed Feb 15 18:12:38 2012 +0100 +++ b/i18n/en.po Mon Feb 20 11:45:16 2012 +0100 @@ -922,6 +922,9 @@ msgid "a float is expected" msgstr "" +msgid "a number (in seconds) or 20s, 10min, 24h or 4d are expected" +msgstr "" + msgid "" "a simple cache entity characterized by a name and a validity date. The " "target application is responsible for updating timestamp when necessary to " diff -r 65b0d2587fb5 -r 9550555e4c26 i18n/es.po --- a/i18n/es.po Wed Feb 15 18:12:38 2012 +0100 +++ b/i18n/es.po Mon Feb 20 11:45:16 2012 +0100 @@ -967,6 +967,9 @@ msgid "a float is expected" msgstr "un nĂºmero flotante es requerido" +msgid "a number (in seconds) or 20s, 10min, 24h or 4d are expected" +msgstr "" + msgid "" "a simple cache entity characterized by a name and a validity date. The " "target application is responsible for updating timestamp when necessary to " diff -r 65b0d2587fb5 -r 9550555e4c26 i18n/fr.po --- a/i18n/fr.po Wed Feb 15 18:12:38 2012 +0100 +++ b/i18n/fr.po Mon Feb 20 11:45:16 2012 +0100 @@ -967,6 +967,9 @@ msgid "a float is expected" msgstr "un nombre flottant est attendu" +msgid "a number (in seconds) or 20s, 10min, 24h or 4d are expected" +msgstr "un nombre (en seconde) ou 20s, 10min, 24h ou 4d sont attendus" + msgid "" "a simple cache entity characterized by a name and a validity date. The " "target application is responsible for updating timestamp when necessary to " diff -r 65b0d2587fb5 -r 9550555e4c26 web/formfields.py --- a/web/formfields.py Wed Feb 15 18:12:38 2012 +0100 +++ b/web/formfields.py Mon Feb 20 11:45:16 2012 +0100 @@ -1,4 +1,4 @@ -# copyright 2003-2011 LOGILAB S.A. (Paris, FRANCE), all rights reserved. +# copyright 2003-2012 LOGILAB S.A. (Paris, FRANCE), all rights reserved. # contact http://www.logilab.fr/ -- mailto:contact@logilab.fr # # This file is part of CubicWeb. @@ -43,6 +43,7 @@ .. autoclass:: cubicweb.web.formfields.DateField() .. autoclass:: cubicweb.web.formfields.DateTimeField() .. autoclass:: cubicweb.web.formfields.TimeField() +.. autoclass:: cubicweb.web.formfields.TimeIntervalField() Compound fields '''''''''''''''' @@ -63,11 +64,13 @@ __docformat__ = "restructuredtext en" from warnings import warn -from datetime import datetime +from datetime import datetime, timedelta from logilab.mtconverter import xml_escape from logilab.common import nullobject from logilab.common.date import ustrftime +from logilab.common.configuration import format_time +from logilab.common.textutils import apply_units, TIME_UNITS from yams.schema import KNOWN_METAATTRIBUTES, role_name from yams.constraints import (SizeConstraint, StaticVocabularyConstraint, @@ -929,6 +932,38 @@ return None +class TimeIntervalField(StringField): + """Use this field to edit time interval (`Interval` yams type). + + Unless explicitly specified, the widget for this field will be a + :class:`~cubicweb.web.formwidgets.TextInput`. + """ + widget = fw.TextInput + + def format_single_value(self, req, value): + if value: + value = format_time(value.days * 24 * 3600 + value.seconds) + return unicode(value) + return u'' + + def example_format(self, req): + """return a sample string describing what can be given as input for this + field + """ + return u'20s, 10min, 24h, 4d' + + def _ensure_correctly_typed(self, form, value): + if isinstance(value, basestring): + value = value.strip() + if not value: + return None + try: + value = apply_units(value, TIME_UNITS) + except ValueError: + raise ProcessFormError(form._cw._('a number (in seconds) or 20s, 10min, 24h or 4d are expected')) + return timedelta(0, value) + + class DateField(StringField): """Use this field to edit date (`Date` yams type). @@ -1201,5 +1236,5 @@ 'TZDatetime': DateTimeField, 'Time': TimeField, 'TZTime': TimeField, - # XXX implement 'Interval': TimeIntervalField, + 'Interval': TimeIntervalField, }