Projet

Général

Profil

0001-templatetags-add-removeprefix-and-removesuffix-filte.patch

Nicolas Roche, 10 août 2020 12:37

Télécharger (5,24 ko)

Voir les différences:

Subject: [PATCH 1/2] templatetags: add removeprefix and removesuffix filters
 (#45780)

 combo/public/templatetags/combo.py | 27 +++++++++++++++++++++
 tests/test_public_templatetags.py  | 38 +++++++++++++++++++++++++++++-
 2 files changed, 64 insertions(+), 1 deletion(-)
combo/public/templatetags/combo.py
293 293
def strip(string, chars=None):
294 294
    if not string:
295 295
        return ''
296 296
    if chars:
297 297
        return force_text(string).strip(force_text(chars))
298 298
    else:
299 299
        return force_text(string).strip()
300 300

  
301

  
302
@register.filter
303
def removeprefix(string, prefix=None):
304
    if string is None or string == '':
305
        return string
306
    value = force_text(string)
307
    if prefix is None or prefix == '':
308
        return value
309
    prefix = force_text(prefix)
310
    if value.startswith(prefix):
311
        return value[len(prefix):]
312
    return value
313

  
314

  
315
@register.filter
316
def removesuffix(string, suffix=None):
317
    if string is None or string == '':
318
        return string
319
    value = force_text(string)
320
    if suffix is None or suffix == '':
321
        return value
322
    suffix = force_text(suffix)
323
    if value.endswith(suffix):
324
        return value[:-len(suffix)]
325
    return value
326

  
327

  
301 328
@register.filter(name='get_group')
302 329
def get_group(group_list, group_name):
303 330
    ret = []
304 331
    for group in group_list:
305 332
        if getattr(group, 'grouper', Ellipsis) == group_name:
306 333
            # Django >= 1.11, namedtuple
307 334
            ret.extend(group.list)
308 335
        elif not hasattr(group, 'grouper') and group['grouper'] == group_name:
tests/test_public_templatetags.py
128 128
    t = Template('{% for x in plop|split %}{{x}}<br>{% endfor %}')
129 129
    assert t.render(Context({'plop': 'ab cd ef'})) == 'ab<br>cd<br>ef<br>'
130 130
    t = Template('{% for x in plop|split:"|" %}{{x}} {% endfor %}')
131 131
    assert t.render(Context({'plop': 'ab|cd|ef'})) == 'ab cd ef '
132 132

  
133 133
def test_strip_templatetag():
134 134
    tmpl = Template('{{ foo|strip }}')
135 135
    assert tmpl.render(Context()) == ''
136
    assert tmpl.render(Context({'foo': None})) == ''
137 136
    assert tmpl.render(Context({'foo': ' foo bar '})) == 'foo bar'
138 137
    assert tmpl.render(Context({'foo': ' foo bar\t'})) == 'foo bar'
139 138
    assert tmpl.render(Context({'foo': ' félé  '})) == 'félé'
140 139
    tmpl = Template('{{ foo|strip:"XY" }}')
141 140
    assert tmpl.render(Context({'foo': 'XXfoo barXYX'})) == 'foo bar'
142 141
    assert tmpl.render(Context({'foo': ' foo barXX'})) == ' foo bar'
143 142

  
143

  
144
def test_removeprefix_templatetag():
145
    tmpl = Template('{{ foo|removeprefix }}')
146
    assert tmpl.render(Context()) == ''
147
    assert tmpl.render(Context({'foo': None})) == 'None'
148
    assert tmpl.render(Context({'foo': 0})) == '0'
149
    assert tmpl.render(Context({'foo': 'None'})) == 'None'
150
    assert tmpl.render(Context({'foo': 'foo bar'})) == 'foo bar'
151
    tmpl = Template('{{ foo|removeprefix:"" }}')
152
    assert tmpl.render(Context({'foo': 'None'})) == 'None'
153
    assert tmpl.render(Context({'foo': 'foo bar'})) == 'foo bar'
154
    tmpl = Template('{{ foo|removeprefix:"XY" }}')
155
    assert tmpl.render(Context({'foo': 'XYfoo barXY'})) == 'foo barXY'
156
    assert tmpl.render(Context({'foo': 'foo bar'})) == 'foo bar'
157
    assert tmpl.render(Context({'foo': 'xyfoo barXY'})) == 'xyfoo barXY'
158
    assert tmpl.render(Context({'foo': ' XYfoo barXY'})) == ' XYfoo barXY'
159
    assert tmpl.render(Context({'foo': 'XYXYfoo barXY'})) == 'XYfoo barXY'
160

  
161

  
162
def test_removesuffix_templatetag():
163
    tmpl = Template('{{ foo|removesuffix }}')
164
    assert tmpl.render(Context()) == ''
165
    assert tmpl.render(Context({'foo': None})) == 'None'
166
    assert tmpl.render(Context({'foo': 0})) == '0'
167
    assert tmpl.render(Context({'foo': 'None'})) == 'None'
168
    assert tmpl.render(Context({'foo': 'foo bar'})) == 'foo bar'
169
    tmpl = Template('{{ foo|removesuffix:"" }}')
170
    assert tmpl.render(Context({'foo': 'None'})) == 'None'
171
    assert tmpl.render(Context({'foo': 'foo bar'})) == 'foo bar'
172
    tmpl = Template('{{ foo|removesuffix:"XY" }}')
173
    assert tmpl.render(Context({'foo': 'XYfoo barXY'})) == 'XYfoo bar'
174
    assert tmpl.render(Context({'foo': 'foo bar'})) == 'foo bar'
175
    assert tmpl.render(Context({'foo': 'XYfoo barxy'})) == 'XYfoo barxy'
176
    assert tmpl.render(Context({'foo': 'XYfoo barXY '})) == 'XYfoo barXY '
177
    assert tmpl.render(Context({'foo': 'XYfoo barXYXY'})) == 'XYfoo barXY'
178

  
179

  
144 180
def test_get_group():
145 181
    context = Context({'cities': [
146 182
        {'name': 'Mumbai', 'population': '19,000,000', 'country': 'India'},
147 183
        {'name': 'New York', 'population': '20,000,000', 'country': 'USA'},
148 184
        {'name': 'Calcutta', 'population': '15,000,000', 'country': 'India'},
149 185
        {'name': 'Chicago', 'population': '7,000,000', 'country': 'USA'},
150 186
        {'name': 'Tokyo', 'population': '33,000,000', 'country': 'Japan'},
151 187
    ]})
152
-