Projet

Général

Profil

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

Nicolas Roche, 10 août 2020 16:27

Télécharger (4,83 ko)

Voir les différences:

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

 combo/public/templatetags/combo.py | 23 +++++++++++++++++++++++
 tests/test_public_templatetags.py  | 28 ++++++++++++++++++++++++++++
 2 files changed, 51 insertions(+)
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):
304
    if not string:
305
        return ''
306
    value = force_text(string)
307
    prefix = force_text(prefix)
308
    if prefix and value.startswith(prefix):
309
        return value[len(prefix):]
310
    return value
311

  
312

  
313
@register.filter
314
def removesuffix(string, suffix):
315
    if not string:
316
        return ''
317
    value = force_text(string)
318
    suffix = force_text(suffix)
319
    if suffix and value.endswith(suffix):
320
        return value[:-len(suffix)]
321
    return value
322

  
323

  
301 324
@register.filter(name='get_group')
302 325
def get_group(group_list, group_name):
303 326
    ret = []
304 327
    for group in group_list:
305 328
        if getattr(group, 'grouper', Ellipsis) == group_name:
306 329
            # Django >= 1.11, namedtuple
307 330
            ret.extend(group.list)
308 331
        elif not hasattr(group, 'grouper') and group['grouper'] == group_name:
tests/test_public_templatetags.py
3 3
import shutil
4 4
import time
5 5

  
6 6
import pytest
7 7

  
8 8
from django.core.files import File
9 9
from django.core.files.storage import default_storage
10 10
from django.template import Context, Template
11
from django.template.exceptions import TemplateSyntaxError
11 12
from django.test import override_settings
12 13
from django.test.client import RequestFactory
13 14
from django.contrib.auth.models import User, Group, AnonymousUser
14 15
from django.utils.six import StringIO
15 16
from django.utils.timezone import now
16 17

  
17 18
from combo.data.models import Page, TextCell
18 19
from combo.apps.assets.models import Asset
......
136 137
    assert tmpl.render(Context({'foo': None})) == ''
137 138
    assert tmpl.render(Context({'foo': ' foo bar '})) == 'foo bar'
138 139
    assert tmpl.render(Context({'foo': ' foo bar\t'})) == 'foo bar'
139 140
    assert tmpl.render(Context({'foo': ' félé  '})) == 'félé'
140 141
    tmpl = Template('{{ foo|strip:"XY" }}')
141 142
    assert tmpl.render(Context({'foo': 'XXfoo barXYX'})) == 'foo bar'
142 143
    assert tmpl.render(Context({'foo': ' foo barXX'})) == ' foo bar'
143 144

  
145

  
146
def test_removeprefix_templatetag():
147
    with pytest.raises(TemplateSyntaxError, match='removeprefix requires 2 arguments, 1 provided'):
148
        tmpl = Template('{{ foo|removeprefix }}')
149
    tmpl = Template('{{ foo|removeprefix:"" }}')
150
    assert tmpl.render(Context({'foo': 'foo bar'})) == 'foo bar'
151
    tmpl = Template('{{ foo|removeprefix:"XY" }}')
152
    assert tmpl.render(Context({'foo': 'XYfoo barXY'})) == 'foo barXY'
153
    assert tmpl.render(Context({'foo': 'foo bar'})) == 'foo bar'
154
    assert tmpl.render(Context({'foo': 'xyfoo barXY'})) == 'xyfoo barXY'
155
    assert tmpl.render(Context({'foo': ' XYfoo barXY'})) == ' XYfoo barXY'
156
    assert tmpl.render(Context({'foo': 'XYXYfoo barXY'})) == 'XYfoo barXY'
157

  
158

  
159
def test_removesuffix_templatetag():
160
    with pytest.raises(TemplateSyntaxError, match='removesuffix requires 2 arguments, 1 provided'):
161
        tmpl = Template('{{ foo|removesuffix }}')
162
    tmpl = Template('{{ foo|removesuffix:"" }}')
163
    assert tmpl.render(Context({'foo': 'foo bar'})) == 'foo bar'
164
    tmpl = Template('{{ foo|removesuffix:"XY" }}')
165
    assert tmpl.render(Context({'foo': 'XYfoo barXY'})) == 'XYfoo bar'
166
    assert tmpl.render(Context({'foo': 'foo bar'})) == 'foo bar'
167
    assert tmpl.render(Context({'foo': 'XYfoo barxy'})) == 'XYfoo barxy'
168
    assert tmpl.render(Context({'foo': 'XYfoo barXY '})) == 'XYfoo barXY '
169
    assert tmpl.render(Context({'foo': 'XYfoo barXYXY'})) == 'XYfoo barXY'
170

  
171

  
144 172
def test_get_group():
145 173
    context = Context({'cities': [
146 174
        {'name': 'Mumbai', 'population': '19,000,000', 'country': 'India'},
147 175
        {'name': 'New York', 'population': '20,000,000', 'country': 'USA'},
148 176
        {'name': 'Calcutta', 'population': '15,000,000', 'country': 'India'},
149 177
        {'name': 'Chicago', 'population': '7,000,000', 'country': 'USA'},
150 178
        {'name': 'Tokyo', 'population': '33,000,000', 'country': 'Japan'},
151 179
    ]})
152
-