templatetags: add phonenumber_fr filter (#41723)

This commit is contained in:
Thomas NOËL 2020-05-15 11:36:37 +02:00
parent 2f6e7a3597
commit 053827b19b
2 changed files with 64 additions and 0 deletions

View File

@ -575,3 +575,32 @@ def test_reproj():
coords = tmpl.render(CompatibilityNamesDict({'form': lazy_formdata})).split('/')
assert int(float(coords[0])) == 1625337
assert int(float(coords[1])) == 5422836
def test_phonenumber_fr():
t = Template('{{ number|phonenumber_fr }}')
assert t.render({'number': '01 23 45 67 89'}) == '01 23 45 67 89'
assert t.render({'number': '0 1 23 45 67 89'}) == '01 23 45 67 89'
assert t.render({'number': '0123456789'}) == '01 23 45 67 89'
assert t.render({'number': '01.23.45.67.89'}) == '01 23 45 67 89'
assert t.render({'number': '01 23 45 67 89'}) == '01 23 45 67 89'
assert t.render({'number': '00 33 1 23 45 67 89'}) == '00 33 1 23 45 67 89'
assert t.render({'number': '00 33 1 23 45 67 89'}) == '00 33 1 23 45 67 89'
assert t.render({'number': '+33 1 23 45 67 89'}) == '+33 1 23 45 67 89'
assert t.render({'number': '+33 (0)1 23 45 67 89'}) == '+33 1 23 45 67 89'
# drom
assert t.render({'number': '02 62 11 22 33'}) == '02 62 11 22 33'
assert t.render({'number': '00 262 11 22 33'}) == '00 262 11 22 33'
assert t.render({'number': '+262 112233'}) == '+262 11 22 33'
t = Template('{{ number|phonenumber_fr:"." }}')
assert t.render({'number': '01 23 45 67 89'}) == '01.23.45.67.89'
# unknown
assert t.render({'number': '12 3'}) == '12 3'
assert t.render({'number': 'bla bla'}) == 'bla bla'
assert t.render({'number': None}) == 'None'
t = Template('{{ number|decimal|phonenumber_fr }}')
assert t.render({'number': '1,33'}) == '1.33'

View File

@ -438,3 +438,38 @@ def has_role(user, role_name):
except KeyError: # role has been deleted
pass
return False
@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