Projet

Général

Profil

0001-fields-be-lax-on-date-time-format-of-date-field-sett.patch

Frédéric Péters, 28 avril 2016 18:41

Télécharger (3,8 ko)

Voir les différences:

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(-)
tests/test_widgets.py
256 256
    assert not widget.has_error()
257 257
    assert widget.parse() == '2014-01-20'
258 258

  
259
    widget = DateWidget('test', maximum_date='1/1/2014') # accept "fr" format
260
    mock_form_submission(req, widget, {'test': '2014-1-20'})
261
    assert widget.has_error()
262

  
259 263
    pub.cfg['language'] = {'language': 'fr'}
260 264
    widget = DateWidget('test')
261 265
    mock_form_submission(req, widget, {'test': '20/1/2014'})
......
282 286
    mock_form_submission(req, widget, {'test': '20/1/2014'})
283 287
    assert widget.has_error()
284 288

  
289
    widget = DateWidget('test', maximum_date='2014-1-1') # accept "C" format
290
    mock_form_submission(req, widget, {'test': '20/1/2014'})
291
    assert widget.has_error()
292

  
285 293
    yesterday = (datetime.date.today() - datetime.timedelta(days=1)).strftime(widget.get_format_string())
286 294
    tomorrow = (datetime.date.today() + datetime.timedelta(days=1)).strftime(widget.get_format_string())
287 295

  
wcs/qommon/form.py
943 943
        self.minimum_date = None
944 944

  
945 945
        if kwargs.get('minimum_date'):
946
            self.minimum_date = time.strptime(kwargs.get('minimum_date'), misc.date_format())[:3]
946
            self.minimum_date = misc.get_as_datetime(kwargs.get('minimum_date')).timetuple()[:3]
947 947
            del kwargs['minimum_date']
948 948
        if kwargs.get('maximum_date'):
949
            self.maximum_date = time.strptime(kwargs.get('maximum_date'), misc.date_format())[:3]
949
            self.maximum_date = misc.get_as_datetime(kwargs.get('maximum_date')).timetuple()[:3]
950 950
            del kwargs['maximum_date']
951 951
        if kwargs.get('minimum_is_future'):
952 952
            if kwargs.get('date_can_be_today'):
wcs/qommon/misc.py
157 157
        return ''
158 158
    return strftime.strftime(datetime_format(), t)
159 159

  
160
DATE_FORMATS = {
161
    'C': ['%Y-%m-%d'],
162
    'fr': ['%d/%m/%Y'],
163
}
164

  
165
DATETIME_FORMATS = {
166
    'C': ['%Y-%m-%d %H:%M'],
167
    'fr': ['%d/%m/%Y %H:%M'],
168
}
169

  
160 170
def datetime_format():
161
    format_string = '%Y-%m-%d %H:%M'
162 171
    lang = get_datetime_language()
163
    if lang == 'fr':
164
        format_string = '%d/%m/%Y %H:%M'
165
    return format_string
172
    if lang not in DATETIME_FORMATS:
173
        lang = 'C'
174
    return DATETIME_FORMATS[lang][0]
166 175

  
167 176
def date_format():
168
    format_string = '%Y-%m-%d'
169 177
    lang = get_datetime_language()
170
    if lang == 'fr':
171
        format_string = '%d/%m/%Y'
172
    return format_string
178
    if lang not in DATE_FORMATS:
179
        lang = 'C'
180
    return DATE_FORMATS[lang][0]
173 181

  
174 182
def get_as_datetime(s):
175
    for format_string in (datetime_format(), date_format(), '%Y-%m-%d %H:%M', '%Y-%m-%d'):
183
    formats = [datetime_format(), date_format()] # prefer current locale
184
    for value in DATETIME_FORMATS.values():
185
        formats.extend(value)
186
    for value in DATE_FORMATS.values():
187
        formats.extend(value)
188
    for format_string in formats:
176 189
        try:
177 190
            return datetime.datetime.strptime(s, format_string)
178 191
        except ValueError:
179
-