templatetags: add phonenumber_fr filter (#41036)

This commit is contained in:
Thomas NOËL 2020-05-12 14:13:35 +02:00
parent c3e4767425
commit 1a6c51b999
2 changed files with 64 additions and 0 deletions

View File

@ -532,3 +532,38 @@ def json_script(value, element_id):
'<script id="{}" type="application/json">{}</script>',
element_id, mark_safe(json_str)
)
@register.filter(is_safe=False)
def phonenumber_fr(value, separator=' '):
DROMS = ('262', '508', '590', '594', '596')
if not value or not isinstance(value, six.string_types):
return value
number = value.strip()
if not number:
return value
if number[0] == '+':
international = '+'
number = '00' + number[1:]
else:
international = '00' + separator
number = ''.join(c for c in number if c in '0123456789')
def in_pairs(num):
return separator.join(num[i*2:i*2+2] for i in range(len(num)//2))
# local number
if len(number) == 10 and number[0] == '0' and number[1] in '123456789':
return in_pairs(number)
# international
if len(number) == 14 and number[0:5] == '00330':
# +/00 33 (0)x xx xx xx xx : remove (0)
number = number[0:4] + number[5:]
if len(number) == 13 and number[0:4] == '0033':
return international + '33' + separator + number[4] + separator + in_pairs(number[5:])
if len(number) == 11 and number[0:2] == '00' and number[2:5] in DROMS:
return international + number[2:5] + separator + in_pairs(number[5:])
# unknown
return value

View File

@ -697,3 +697,32 @@ def test_abs_templatetag():
def test_json_script():
tmpl = Template('{{ plop|json_script:"toto" }}')
assert tmpl.render(Context({'plop': {'a': 'b'}})) == '<script id="toto" type="application/json">{"a": "b"}</script>'
def test_phonenumber_fr():
t = Template('{{ number|phonenumber_fr }}')
assert t.render(Context({'number': '01 23 45 67 89'})) == '01 23 45 67 89'
assert t.render(Context({'number': '0 1 23 45 67 89'})) == '01 23 45 67 89'
assert t.render(Context({'number': '0123456789'})) == '01 23 45 67 89'
assert t.render(Context({'number': '01.23.45.67.89'})) == '01 23 45 67 89'
assert t.render(Context({'number': '01 23 45 67 89'})) == '01 23 45 67 89'
assert t.render(Context({'number': '00 33 1 23 45 67 89'})) == '00 33 1 23 45 67 89'
assert t.render(Context({'number': '00 33 1 23 45 67 89'})) == '00 33 1 23 45 67 89'
assert t.render(Context({'number': '+33 1 23 45 67 89'})) == '+33 1 23 45 67 89'
assert t.render(Context({'number': '+33 (0)1 23 45 67 89'})) == '+33 1 23 45 67 89'
# drom
assert t.render(Context({'number': '02 62 11 22 33'})) == '02 62 11 22 33'
assert t.render(Context({'number': '00 262 11 22 33'})) == '00 262 11 22 33'
assert t.render(Context({'number': '+262 112233'})) == '+262 11 22 33'
t = Template('{{ number|phonenumber_fr:"." }}')
assert t.render(Context({'number': '01 23 45 67 89'})) == '01.23.45.67.89'
# unknown
assert t.render(Context({'number': '12 3'})) == '12 3'
assert t.render(Context({'number': 'bla bla'})) == 'bla bla'
assert t.render(Context({'number': None})) == 'None'
t = Template('{{ number|decimal|phonenumber_fr }}')
assert t.render(Context({'number': '1,33'})) == '1.33'