From 591af182628a8086be8ca9d7ae3daa1d63f282e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20P=C3=A9ters?= Date: Thu, 28 Apr 2016 18:14:08 +0200 Subject: [PATCH] fields: be lax on date(/time) format of date field settings (#10742) --- tests/test_widgets.py | 8 ++++++++ wcs/qommon/form.py | 4 ++-- wcs/qommon/misc.py | 31 ++++++++++++++++++++++--------- 3 files changed, 32 insertions(+), 11 deletions(-) diff --git a/tests/test_widgets.py b/tests/test_widgets.py index d9d4e52..484753f 100644 --- a/tests/test_widgets.py +++ b/tests/test_widgets.py @@ -256,6 +256,10 @@ def test_date_widget(): assert not widget.has_error() assert widget.parse() == '2014-01-20' + widget = DateWidget('test', maximum_date='1/1/2014') # accept "fr" format + mock_form_submission(req, widget, {'test': '2014-1-20'}) + assert widget.has_error() + pub.cfg['language'] = {'language': 'fr'} widget = DateWidget('test') mock_form_submission(req, widget, {'test': '20/1/2014'}) @@ -282,6 +286,10 @@ def test_date_widget(): mock_form_submission(req, widget, {'test': '20/1/2014'}) assert widget.has_error() + widget = DateWidget('test', maximum_date='2014-1-1') # accept "C" format + mock_form_submission(req, widget, {'test': '20/1/2014'}) + assert widget.has_error() + yesterday = (datetime.date.today() - datetime.timedelta(days=1)).strftime(widget.get_format_string()) tomorrow = (datetime.date.today() + datetime.timedelta(days=1)).strftime(widget.get_format_string()) diff --git a/wcs/qommon/form.py b/wcs/qommon/form.py index 07fd773..52c6b69 100644 --- a/wcs/qommon/form.py +++ b/wcs/qommon/form.py @@ -943,10 +943,10 @@ class DateWidget(StringWidget): self.minimum_date = None if kwargs.get('minimum_date'): - self.minimum_date = time.strptime(kwargs.get('minimum_date'), misc.date_format())[:3] + self.minimum_date = misc.get_as_datetime(kwargs.get('minimum_date')).timetuple()[:3] del kwargs['minimum_date'] if kwargs.get('maximum_date'): - self.maximum_date = time.strptime(kwargs.get('maximum_date'), misc.date_format())[:3] + self.maximum_date = misc.get_as_datetime(kwargs.get('maximum_date')).timetuple()[:3] del kwargs['maximum_date'] if kwargs.get('minimum_is_future'): if kwargs.get('date_can_be_today'): diff --git a/wcs/qommon/misc.py b/wcs/qommon/misc.py index 4df90ee..dedd3b4 100644 --- a/wcs/qommon/misc.py +++ b/wcs/qommon/misc.py @@ -157,22 +157,35 @@ def localstrftime(t): return '' return strftime.strftime(datetime_format(), t) +DATE_FORMATS = { + 'C': ['%Y-%m-%d'], + 'fr': ['%d/%m/%Y'], +} + +DATETIME_FORMATS = { + 'C': ['%Y-%m-%d %H:%M'], + 'fr': ['%d/%m/%Y %H:%M'], +} + def datetime_format(): - format_string = '%Y-%m-%d %H:%M' lang = get_datetime_language() - if lang == 'fr': - format_string = '%d/%m/%Y %H:%M' - return format_string + if lang not in DATETIME_FORMATS: + lang = 'C' + return DATETIME_FORMATS[lang][0] def date_format(): - format_string = '%Y-%m-%d' lang = get_datetime_language() - if lang == 'fr': - format_string = '%d/%m/%Y' - return format_string + if lang not in DATE_FORMATS: + lang = 'C' + return DATE_FORMATS[lang][0] def get_as_datetime(s): - for format_string in (datetime_format(), date_format(), '%Y-%m-%d %H:%M', '%Y-%m-%d'): + formats = [datetime_format(), date_format()] # prefer current locale + for value in DATETIME_FORMATS.values(): + formats.extend(value) + for value in DATE_FORMATS.values(): + formats.extend(value) + for format_string in formats: try: return datetime.datetime.strptime(s, format_string) except ValueError: -- 2.8.1