From 40e025f4df528685c56e4761964561d810c0b1e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20P=C3=A9ters?= Date: Thu, 30 Aug 2018 12:18:24 +0200 Subject: [PATCH] formdata: improve compatibility of lazy date fields (#25961) --- tests/test_formdata.py | 29 +++++++++++++++++++++++++- wcs/variables.py | 46 ++++++++++++++++++++++++++++++++++++++---- 2 files changed, 70 insertions(+), 5 deletions(-) diff --git a/tests/test_formdata.py b/tests/test_formdata.py index ef742732..68d2c2af 100644 --- a/tests/test_formdata.py +++ b/tests/test_formdata.py @@ -618,7 +618,14 @@ def test_lazy_formdata(pub, variable_test_data): assert bool(lazy_formdata.var.boolfield) is False assert lazy_formdata.var.boolfield2 == 'True' assert bool(lazy_formdata.var.boolfield2) is True - assert lazy_formdata.var.datefield == time.strptime('2018-07-31', '%Y-%m-%d') + assert lazy_formdata.var.datefield == '2018-07-31' + assert lazy_formdata.var.datefield.raw == time.strptime('2018-07-31', '%Y-%m-%d') + assert lazy_formdata.var.datefield.tm_year == 2018 + assert lazy_formdata.var.datefield.tm_mon == 7 + assert lazy_formdata.var.datefield.tm_mday == 31 + for attr in ('tm_year', 'tm_mon', 'tm_mday', 'tm_hour', 'tm_min', 'tm_sec', + 'tm_wday', 'tm_yday'): + getattr(lazy_formdata.var.datefield, attr) assert lazy_formdata.var.itemsfield == 'aa, ac' assert 'aa' in lazy_formdata.var.itemsfield # taken as a list assert 'aa,' not in lazy_formdata.var.itemsfield # not as a string @@ -689,3 +696,23 @@ def test_lazy_templates(pub, variable_test_data): tmpl = Template('{{form_user_name_identifier_0}}') assert tmpl.render(context) == pub.user_class.select()[0].name_identifiers[0] + +def test_form_digest_date(pub): + formdef = FormDef() + formdef.name = 'foobar' + formdef.url_name = 'foobar' + formdef.fields = [fields.DateField(id='0', label='date', varname='date')] + formdef.digest_template = 'plop {{ form_var_date }} plop' + formdef.store() + + formdata = formdef.data_class()() + formdata.data = {'0': time.strptime('2015-05-12', '%Y-%m-%d')} + formdata.store() + assert formdef.data_class().get(formdata.id).digest == 'plop 2015-05-12 plop' + + pub.cfg['language'] = {'language': 'fr'} + pub.write_cfg() + formdata = formdef.data_class()() + formdata.data = {'0': time.strptime('2015-05-12', '%Y-%m-%d')} + formdata.store() + assert formdef.data_class().get(formdata.id).digest == 'plop 12/05/2015 plop' diff --git a/wcs/variables.py b/wcs/variables.py index 791dd7a6..01384a86 100644 --- a/wcs/variables.py +++ b/wcs/variables.py @@ -306,9 +306,7 @@ class LazyFormDataVar(object): raise KeyError(key) if field.key == 'date': - # for backward compatibility with sites using time.struct_time - # methods we still have to return a raw value for date fields. - return self.data.get(field.id) + return LazyFieldVarDate(self.data, field, self.formdata) return LazyFieldVar(self.data, field, self.formdata) @@ -327,7 +325,7 @@ class LazyFieldVar(object): @property def raw(self): - if self.field.store_display_value or self.field.key == 'file': + if self.field.store_display_value or self.field.key in ('file', 'date'): return self.data.get(self.field.id) raise KeyError('raw') @@ -395,6 +393,46 @@ class LazyFieldVar(object): raise AssertionError('lazy cannot be pickled') +class LazyFieldVarDate(LazyFieldVar): + # for backward compatibility with sites using time.struct_time + # methods we still have to provide time.struct_time properties. + + def get_raw(self): + return self.data.get(self.field.id) + + @property + def tm_year(self): + return self.get_raw().tm_year + + @property + def tm_mon(self): + return self.get_raw().tm_mon + + @property + def tm_mday(self): + return self.get_raw().tm_mday + + @property + def tm_hour(self): + return self.get_raw().tm_hour + + @property + def tm_min(self): + return self.get_raw().tm_min + + @property + def tm_sec(self): + return self.get_raw().tm_sec + + @property + def tm_wday(self): + return self.get_raw().tm_wday + + @property + def tm_yday(self): + return self.get_raw().tm_yday + + class LazyUser(object): def __init__(self, user): self.user = user -- 2.18.0