Projet

Général

Profil

0001-add-new-templatetags-logic-for-date-datetime-time-de.patch

Thomas Noël, 18 décembre 2018 10:48

Télécharger (9,15 ko)

Voir les différences:

Subject: [PATCH] add new templatetags logic for date, datetime, time, decimal
 (#28738)

 tests/test_templates.py           | 101 ++++++++++++++++++++++++++++++
 wcs/qommon/templatetags/qommon.py |  54 +++++++++++++---
 2 files changed, 145 insertions(+), 10 deletions(-)
tests/test_templates.py
110 110

  
111 111

  
112 112
def test_datetime_templatetags():
113
    tmpl = Template('{{ plop|datetime }}')
114
    assert tmpl.render({'plop': '2017-12-21 10:32'}) == 'Dec. 21, 2017, 10:32 a.m.'
115
    assert tmpl.render({'plop': '21/12/2017 10h32'}) == 'Dec. 21, 2017, 10:32 a.m.'
116
    assert tmpl.render({'plop': '2017-12-21'}) == 'Dec. 21, 2017, midnight'
117
    assert tmpl.render({'plop': '21/12/2017'}) == 'Dec. 21, 2017, midnight'
118
    assert tmpl.render({'plop': '10h32'}) == ''
119
    assert tmpl.render({'plop': 'x'}) == ''
120
    assert tmpl.render({'plop': None}) == ''
121
    assert tmpl.render({'plop': 3}) == ''
122
    assert tmpl.render({'plop': {'foo': 'bar'}}) == ''
123
    assert tmpl.render() == ''
124

  
125
    tmpl = Template('{{ plop|datetime:"d i" }}')
126
    assert tmpl.render({'plop': '2017-12-21 10:32'}) == '21 32'
127
    assert tmpl.render({'plop': '2017-12-21 10:32:42'}) == '21 32'
128
    assert tmpl.render({'plop': '21/12/2017 10:32'}) == '21 32'
129
    assert tmpl.render({'plop': '21/12/2017 10:32:42'}) == '21 32'
130
    assert tmpl.render({'plop': '21/12/2017 10h32'}) == '21 32'
131
    assert tmpl.render({'plop': '21/12/2017'}) == '21 00'
132
    assert tmpl.render({'plop': '10h32'}) == ''
133
    assert tmpl.render({'plop': 'x'}) == ''
134
    assert tmpl.render({'plop': None}) == ''
135
    assert tmpl.render({'plop': 3}) == ''
136
    assert tmpl.render({'plop': {'foo': 'bar'}}) == ''
137
    assert tmpl.render() == ''
138

  
139
    tmpl = Template('{% if d1|datetime > d2|datetime %}d1>d2{% else %}d1<=d2{% endif %}')
140
    assert tmpl.render({'d1': '2017-12-22', 'd2': '2017-12-21'}) == 'd1>d2'
141
    assert tmpl.render({'d1': '2017-12-21', 'd2': '2017-12-21'}) == 'd1<=d2'
142
    assert tmpl.render({'d1': '2017-12-21 10:30', 'd2': '2017-12-21 09:00'}) == 'd1>d2'
143
    assert tmpl.render({'d1': '2017-12-21 10:30', 'd2': '2017-12-21'}) == 'd1>d2'
144
    assert tmpl.render({'d1': '2017-12-22'}) == 'd1<=d2'
145
    assert tmpl.render({'d2': '2017-12-22'}) == 'd1<=d2'
146

  
147
    tmpl = Template('{{ plop|date }}')
148
    assert tmpl.render({'plop': '2017-12-21'}) == 'Dec. 21, 2017'
149
    assert tmpl.render({'plop': '21/12/2017'}) == 'Dec. 21, 2017'
150
    assert tmpl.render({'plop': '2017-12-21 10:32'}) == 'Dec. 21, 2017'
151
    assert tmpl.render({'plop': '21/12/2017 10:32'}) == 'Dec. 21, 2017'
152
    assert tmpl.render({'plop': '21/12/2017 10h32'}) == 'Dec. 21, 2017'
153
    assert tmpl.render({'plop': '21/12/2017 10:32:42'}) == 'Dec. 21, 2017'
154
    assert tmpl.render({'plop': '10:32'}) == ''
155
    assert tmpl.render({'plop': 'x'}) == ''
156
    assert tmpl.render({'plop': None}) == ''
157
    assert tmpl.render({'plop': 3}) == ''
158
    assert tmpl.render({'plop': {'foo': 'bar'}}) == ''
159
    assert tmpl.render() == ''
160

  
161
    tmpl = Template('{{ plop|date:"d" }}')
162
    assert tmpl.render({'plop': '2017-12-21'}) == '21'
163
    assert tmpl.render({'plop': '21/12/2017'}) == '21'
164
    assert tmpl.render({'plop': '2017-12-21 10:32'}) == '21'
165
    assert tmpl.render({'plop': '10:32'}) == ''
166
    assert tmpl.render({'plop': 'x'}) == ''
167
    assert tmpl.render({'plop': None}) == ''
168
    assert tmpl.render({'plop': 3}) == ''
169
    assert tmpl.render({'plop': {'foo': 'bar'}}) == ''
170
    assert tmpl.render() == ''
171

  
172
    tmpl = Template('{% if d1|date > d2|date %}d1>d2{% else %}d1<=d2{% endif %}')
173
    assert tmpl.render({'d1': '2017-12-22', 'd2': '2017-12-21'}) == 'd1>d2'
174
    assert tmpl.render({'d1': '2017-12-21', 'd2': '2017-12-21'}) == 'd1<=d2'
175
    assert tmpl.render({'d1': '2017-12-22'}) == 'd1<=d2'
176
    assert tmpl.render({'d2': '2017-12-22'}) == 'd1<=d2'
177

  
178
    tmpl = Template('{{ plop|time }}')
179
    assert tmpl.render({'plop': '10:32'}) == '10:32 a.m.'
180
    assert tmpl.render({'plop': '2017-12-21 10:32'}) == '10:32 a.m.'
181
    assert tmpl.render({'plop': '21/12/2017 10h32'}) == '10:32 a.m.'
182
    assert tmpl.render({'plop': '21/12/2017'}) == 'midnight'
183
    assert tmpl.render({'plop': 'x'}) == ''
184
    assert tmpl.render({'plop': None}) == ''
185
    assert tmpl.render({'plop': 3}) == ''
186
    assert tmpl.render({'plop': {'foo': 'bar'}}) == ''
187
    assert tmpl.render() == ''
188

  
189
    tmpl = Template('{{ plop|time:"H i" }}')
190
    assert tmpl.render({'plop': '10:32'}) == '10 32'
191
    assert tmpl.render({'plop': '2017-12-21 10:32'}) == '10 32'
192
    assert tmpl.render({'plop': '21/12/2017 10h32'}) == '10 32'
193
    assert tmpl.render({'plop': '21/12/2017'}) == '00 00'
194
    assert tmpl.render({'plop': 'x'}) == ''
195
    assert tmpl.render({'plop': None}) == ''
196
    assert tmpl.render({'plop': 3}) == ''
197
    assert tmpl.render({'plop': {'foo': 'bar'}}) == ''
198
    assert tmpl.render() == ''
199

  
200
    # old fashion, with parse_*
113 201
    tmpl = Template('{{ plop|parse_datetime|date:"d i" }}')
114 202
    assert tmpl.render({'plop': '2017-12-21 10:32'}) == '21 32'
115 203
    assert tmpl.render({'plop': '2017-12-21 10:32:42'}) == '21 32'
......
152 240
    assert tmpl.render({'plop': 12345.678}) == '12345.678'
153 241
    assert tmpl.render({'plop': None}) == ''
154 242

  
243
    tmpl = Template('{{ plop|decimal:3 }}')
244
    assert tmpl.render({'plop': '3.14'}) == '3.140'
245
    assert tmpl.render({'plop': None}) == ''
246
    tmpl = Template('{{ plop|decimal:"3" }}')
247
    assert tmpl.render({'plop': '3.14'}) == '3.140'
248
    assert tmpl.render({'plop': None}) == ''
249

  
155 250
    tmpl = Template('{% if plop|decimal > 2 %}hello{% endif %}')
156 251
    assert tmpl.render({'plop': 3}) == 'hello'
252
    assert tmpl.render({'plop': '3'}) == 'hello'
253
    assert tmpl.render({'plop': 2.001}) == 'hello'
254
    assert tmpl.render({'plop': '2.001'}) == 'hello'
157 255
    assert tmpl.render({'plop': 1}) == ''
256
    assert tmpl.render({'plop': 1.99}) == ''
257
    assert tmpl.render({'plop': '1.99'}) == ''
258
    assert tmpl.render({'plop': 'x'}) == 'hello'
158 259
    assert tmpl.render({'plop': None}) == 'hello'  # will be str > int, always True.
wcs/qommon/templatetags/qommon.py
51 51
    except (ValueError, TypeError):
52 52
        return None
53 53

  
54
@register.filter(expects_localtime=True, is_safe=False)
55
def date(value, arg=None):
56
    if arg is None:
57
        return parse_date(value) or ''
58
    if not isinstance(value, (datetime.datetime, datetime.date, datetime.time)):
59
        value = parse_datetime(value) or parse_date(value)
60
    return defaultfilters.date(value, arg=arg)
61

  
54 62
@register.filter
55 63
def parse_datetime(datetime_string):
56 64
    try:
......
63 71
    except (ValueError, TypeError):
64 72
        return None
65 73

  
74
@register.filter(name='datetime', expects_localtime=True, is_safe=False)
75
def datetime_(value, arg=None):
76
    if arg is None:
77
        return parse_datetime(value) or ''
78
    if not isinstance(value, (datetime.datetime, datetime.date, datetime.time)):
79
        value = parse_datetime(value)
80
    return defaultfilters.date(value, arg=arg)
81

  
66 82
@register.filter
67 83
def parse_time(time_string):
84
    # if input is a datetime, extract its time
85
    try:
86
        dt = parse_datetime(time_string)
87
        if dt:
88
            return dt.time()
89
    except (ValueError, TypeError):
90
        pass
91
    # fallback to Django function
68 92
    try:
69 93
        return dateparse.parse_time(time_string)
70 94
    except (ValueError, TypeError):
71 95
        return None
72 96

  
73 97
@register.filter(expects_localtime=True, is_safe=False)
74
def date(value, arg=None):
98
def time(value, arg=None):
99
    if arg is None:
100
        parsed = parse_time(value)
101
        return parsed if parsed is not None else ''  # because bool(midnigth) == False
75 102
    if not isinstance(value, (datetime.datetime, datetime.date, datetime.time)):
76
        value = parse_date(value)
103
        value = parse_time(value)
77 104
    return defaultfilters.date(value, arg=arg)
78 105

  
79
@register.filter(is_safe=True)
80
def decimal(value):
106
def parse_decimal(value):
81 107
    if not value:
82
        return ''
108
        return None
109
    if isinstance(value, basestring):
110
        # replace , by . for French users comfort
111
        value = value.replace(',', '.')
83 112
    try:
84
        if isinstance(value, basestring):
85
            # replace , by . for French users comfort
86
            value = value.replace(',', '.')
87 113
        return Decimal(value).quantize(Decimal('1.0000')).normalize()
88
    except ArithmeticError:
89
        return ''
114
    except (ArithmeticError, TypeError):
115
        return None
116

  
117
@register.filter(is_safe=True)
118
def decimal(value, arg=None):
119
    if arg is None:
120
        return parse_decimal(value) or ''
121
    if not isinstance(value, Decimal):
122
        value = parse_decimal(value)
123
    return defaultfilters.floatformat(value, arg=arg)
90 124

  
91 125
@register.simple_tag
92 126
def standard_text(text_id):
93
-