Projet

Général

Profil

0002-fields-extend-validate_phone_fr-validation-scope-698.patch

Paul Marillonnet, 22 novembre 2022 14:55

Télécharger (3,62 ko)

Voir les différences:

Subject: [PATCH 2/5] fields: extend validate_phone_fr validation scope
 (#69838)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

A valid phone number must either be:
· a local phone number dialable within the French numbering system;
. an international (E.164) number whose country code belongs to
French territory (metropolitan or overseas).
 setup.py                |  1 +
 tests/test_misc.py      | 17 +++++++++++++++++
 tests/test_templates.py |  3 ++-
 wcs/qommon/misc.py      | 10 +++++++---
 4 files changed, 27 insertions(+), 4 deletions(-)
setup.py
196 196
        'workalendar',
197 197
        'requests',
198 198
        'setproctitle',
199
        'phonenumbers',
199 200
    ],
200 201
    package_dir={'wcs': 'wcs'},
201 202
    packages=find_packages(),
tests/test_misc.py
30 30
    normalize_geolocation,
31 31
    parse_isotime,
32 32
    simplify,
33
    validate_phone_fr,
33 34
)
34 35
from wcs.scripts import Script
35 36
from wcs.workflows import Workflow
......
632 633
        'GET', 'https://new.example.com/', cert=None, data=None, headers={}, proxies=None, timeout=28
633 634
    )
634 635
    mock_request.reset_mock()
636

  
637

  
638
def test_validate_phone_fr():
639
    valid = [
640
        '0123456789',
641
        '+33123456789',
642
        '+590690000102',
643
    ]
644
    invalid = [
645
        '1234559',
646
        '+32123456789',
647
        '01+23+45+67+89',
648
    ]
649

  
650
    assert all(validate_phone_fr(pn) for pn in valid)
651
    assert all(not validate_phone_fr(pn) for pn in invalid)
tests/test_templates.py
810 810
    assert t.render({'number': '06 23 45 67 89 89'}) == 'False'
811 811
    assert t.render({'number': '06 23 45 89'}) == 'False'
812 812
    assert t.render({'number': '0 6 2 3 45 89'}) == 'False'
813
    assert t.render({'number': '07 23 45 67 89'}) == 'False'  # invalid number
813 814

  
814 815
    assert t.render({'number': '06 23 45 67 89'}) == 'True'
815
    assert t.render({'number': '07 23 45 67 89'}) == 'True'
816
    assert t.render({'number': '07 00 55 53 25'}) == 'True'
816 817
    assert t.render({'number': '06.23.45.67.89'}) == 'True'
817 818
    assert t.render({'number': '0 6 2 3 45 67 89'}) == 'True'
818 819

  
wcs/qommon/misc.py
32 32
import xml.etree.ElementTree as ET
33 33
from contextlib import contextmanager
34 34

  
35
import phonenumbers
35 36
import requests
36 37
from requests.adapters import HTTPAdapter
37 38

  
......
831 832

  
832 833

  
833 834
def validate_phone_fr(string_value):
834
    if not re.match(r'^0[\d\.\s]+$', string_value):
835
        # leading zero, then digits, dots, or spaces
835
    french_country_codes = [33, 262, 508, 590, 594, 596]
836
    pn = None
837
    try:
838
        pn = phonenumbers.parse(string_value, 'FR')
839
    except phonenumbers.NumberParseException:
836 840
        return False
837
    return len([x for x in string_value if is_ascii_digit(x)]) == 10
841
    return bool(phonenumbers.is_valid_number(pn) and pn.country_code in french_country_codes)
838 842

  
839 843

  
840 844
def validate_siren(string_value):
841
-