Projet

Général

Profil

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

Paul Marillonnet, 29 novembre 2022 10:05

Télécharger (3,62 ko)

Voir les différences:

Subject: [PATCH 1/4] 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
......
634 635
        'GET', 'https://new.example.com/', cert=None, data=None, headers={}, proxies=None, timeout=28
635 636
    )
636 637
    mock_request.reset_mock()
638

  
639

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

  
652
    assert all(validate_phone_fr(pn) for pn in valid)
653
    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
-