Projet

Général

Profil

Development #45422

Type de champ "numéro de tel français"

Ajouté par Frédéric Péters il y a plus de 3 ans. Mis à jour il y a plus de 2 ans.

Statut:
Fermé
Priorité:
Normal
Assigné à:
Catégorie:
-
Version cible:
-
Début:
23 juillet 2020
Echéance:
% réalisé:

0%

Temps estimé:
Patch proposed:
Oui
Planning:
Non

Description

Avec une validation plus stricte que le type de champ "numéro de tel".

(dans wcs,

def validate_phone_fr(string_value):
    if not re.match(r'^0[\d\.\s]+$', string_value):
        # leading zero, then digits, dots, or spaces
        return False
    return len([x for x in string_value if is_ascii_digit(x)]) == 10
)

Fichiers


Demandes liées

Lié à Hobo - Development #56541: profil : définition d’un attribut de type "numéro de téléphone français"Fermé01 septembre 2021

Actions

Révisions associées

Révision 3b5f9e3e (diff)
Ajouté par Paul Marillonnet il y a plus de 2 ans

attribute_kinds: add french phone number type (#45422)

Historique

#1

Mis à jour par Paul Marillonnet il y a plus de 2 ans

#2

Mis à jour par Benjamin Dauvergne il y a plus de 2 ans

\d match plus que les nombres arabes « français » :

>>> re.match('\d', '٧')
<re.Match object; span=(0, 1), match='٧'>
>>> int('٧')
7

Pinaillage mais dans le cas présent c'est mieux de remplacer \d par [0-9] (ou alors utiliser le flag re.ASCII, re.match(..., ..., flags=re.ASCII)).


Aussi pour la validation tu peux faire :

class FrenchPhoneNumberField(forms.CharField)::
    default_validators = [
        RegexValidator('^0', message=_('A french phone number must start with a zero.')),
        MaxLengthValidator(10, message=_('A french phone number must contain 10 digits.')),
    ]

ils sont exécutés en parallèle (donc on a pas uniquement une erreur si il y en a plusieurs, on les a toutes) et c'est plus clair que de surcharger validate() (et c'est exécuté dans super().clean() après clean_number).

#3

Mis à jour par Benjamin Dauvergne il y a plus de 2 ans

  • Statut changé de Solution proposée à En cours
#4

Mis à jour par Paul Marillonnet il y a plus de 2 ans

J’ai patché pour aller dans ce sens, avec un validateur par expression rationnelle qui ne devrait pas laisser passer tout ce qui ne fait pas 10 caractères de long, et pourtant les chaînes vides passent :)
Je creuse.

#5

Mis à jour par Benjamin Dauvergne il y a plus de 2 ans

Paul Marillonnet a écrit :

J’ai patché pour aller dans ce sens, avec un validateur par expression rationnelle qui ne devrait pas laisser passer tout ce qui ne fait pas 10 caractères de long, et pourtant les chaînes vides passent :)
Je creuse.

oui, c'était un test :), il manque MinLengthValidator(10, ... mais c'est peut-être plus simple de mettre juste RegexValidator('^\d{10}$', ...., flag=re.ASCII) dans ce cas.

#6

Mis à jour par Paul Marillonnet il y a plus de 2 ans

Benjamin Dauvergne a écrit :

Paul Marillonnet a écrit :

J’ai patché pour aller dans ce sens, avec un validateur par expression rationnelle qui ne devrait pas laisser passer tout ce qui ne fait pas 10 caractères de long, et pourtant les chaînes vides passent :)
Je creuse.

oui, c'était un test :), il manque MinLengthValidator(10, ... mais c'est peut-être plus simple de mettre juste RegexValidator('^\d{10}$', ...., flag=re.ASCII) dans ce cas.

En fait j’avais aussi fait des changements dans ce sens, sans effet, car c’est ici que ça se joue, les validateurs ne tournent que si la valeur n’est pas considérée comme vide.

#7

Mis à jour par Paul Marillonnet il y a plus de 2 ans

  • Statut changé de En cours à Nouveau

En fait ça ne va que pour les numéros métropolitains.

Dans passerelle on gère mieux l’affaire :

            SMSResource.FR_METRO: [r'^0033[67]\d{8}$'],
            SMSResource.FR_DOMTOM: [
                r'^00262262\d{6}$',  # Réunion, Mayotte, Terres australe/antarctiques
                r'^508508\d{6}$',  # Saint-Pierre-et-Miquelon
                r'^590590\d{6}$',  # Guadeloupe, Saint-Barthélemy, Saint-Martin
                r'^594594\d{6}$',  # Guyane
                r'^596596\d{6}$',  # Martinique
                r'^00687[67]\d{8}$',  # Nouvelle-Calédonie
            ],

mais ça implique bien sûr de garder l’indicatif téléphonique.

Et sinon ce serait un type "numéro de téléphone français métropolitain", pas glop.

Je vais regarder comment c’est fait pour python-phonumbers1, empaqueté debian2.

1. https://github.com/daviddrysdale/python-phonenumbers
2. https://packages.debian.org/buster/python3-phonenumbers

#9

Mis à jour par Paul Marillonnet il y a plus de 2 ans

Paul Marillonnet a écrit :

Je vais regarder comment c’est fait pour python-phonumbers1, empaqueté debian2.

1. https://github.com/daviddrysdale/python-phonenumbers
2. https://packages.debian.org/buster/python3-phonenumbers

Pas de magie, les métadonnées de format des numéros présentent différentes entrées pour la France métropolitaine et pour les territoires et départements d’Outre-mer.
On retrouve la liste établie dans #45422-7, par exemple ici l’entrée correspondant à la métropole et là celle de la Guadeloupe.

Deux options en conséquence :
1. Reproduire ce qui est fait avec les SMSResource de passerelle.
2. Faire ce qui est présenté dans la description du ticket, à savoir un type de champ numéro relatif à dix chiffres dont le premier est zéro, donc sans la gestion du préfixe d’indicatif international.

#10

Mis à jour par Paul Marillonnet il y a plus de 2 ans

Paul Marillonnet a écrit :

Deux options en conséquence :
1. Reproduire ce qui est fait avec les SMSResource de passerelle.
2. Faire ce qui est présenté dans la description du ticket, à savoir un type de champ numéro relatif à dix chiffres dont le premier est zéro, donc sans la gestion du préfixe d’indicatif international.

Évidemment l’option 1 me semble préférable, mais elle introduit un décalage entre ce que serait ce type de champ "numéro de téléphone français" dans a2, et la validation d’un numéro de téléphone français déjà existante dans w.c.s.

À voir si c’est problématique avant de se lancer.

#11

Mis à jour par Frédéric Péters il y a plus de 2 ans

C'est problématique.

#12

Mis à jour par Benjamin Dauvergne il y a plus de 2 ans

Frédéric Péters a écrit :

C'est problématique.

Paul, dans un premier temps assure toi que la chaîne numéro entrée à l'enregistrement, pré-remplissage d'un champ numéro français dans w.c.s. puis envoie d'un SMS via passerelle fonctionne. Si ça demande de prendre le dénominateur commun de w.c.s. i.e. 10 chiffres commençant par un zéro, et bien ce n'est pas grave; si on doit rapprocher a2/wcs du code plus sioux de passerelle, ça se fera dans un autre temps.

#13

Mis à jour par Paul Marillonnet il y a plus de 2 ans

  • Statut changé de Nouveau à En cours
#14

Mis à jour par Paul Marillonnet il y a plus de 2 ans

  • Lié à Development #56541: profil : définition d’un attribut de type "numéro de téléphone français" ajouté
#15

Mis à jour par Paul Marillonnet il y a plus de 2 ans

Benjamin Dauvergne a écrit :

Frédéric Péters a écrit :

C'est problématique.

Paul, dans un premier temps assure toi que la chaîne numéro entrée à l'enregistrement, pré-remplissage d'un champ numéro français dans w.c.s. puis envoie d'un SMS via passerelle fonctionne. Si ça demande de prendre le dénominateur commun de w.c.s. i.e. 10 chiffres commençant par un zéro, et bien ce n'est pas grave; si on doit rapprocher a2/wcs du code plus sioux de passerelle, ça se fera dans un autre temps.

Une option "on ne prend pas le dénominateur commun w.c.s. i.e. 10 chiffres" implique de retirer le préfixe avant pré-remplissage dans w.c.s. et récupération de celui-ci lorsqu’un un envoi de SMS est nécessaire.
Ça me paraît alambiqué, non ?

Le précédent patch, i.e. la solution "dénominateur commun 10 chiffres dont le premier est zéro", permet bien le pré-remplissage d’un champ numéro français dans w.c.s., à condition bien sûr d’avoir #56541.

#16

Mis à jour par Benjamin Dauvergne il y a plus de 2 ans

Paul Marillonnet a écrit :

Une option "on ne prend pas le dénominateur commun w.c.s. i.e. 10 chiffres" implique de retirer le préfixe avant pré-remplissage dans w.c.s. et récupération de celui-ci lorsqu’un un envoi de SMS est nécessaire.
Ça me paraît alambiqué, non ?

Oui, fais la version simple, ce qui est dans la description.

Le précédent patch, i.e. la solution "dénominateur commun 10 chiffres dont le premier est zéro", permet bien le pré-remplissage d’un champ numéro français dans w.c.s., à condition bien sûr d’avoir #56541.

L'ordre pour les types d'attributs c'est d'abord le créer dans a2 puis dans hobo.

#17

Mis à jour par Paul Marillonnet il y a plus de 2 ans

Benjamin Dauvergne a écrit :

Paul Marillonnet a écrit :

Une option "on ne prend pas le dénominateur commun w.c.s. i.e. 10 chiffres" implique de retirer le préfixe avant pré-remplissage dans w.c.s. et récupération de celui-ci lorsqu’un un envoi de SMS est nécessaire.
Ça me paraît alambiqué, non ?

Oui, fais la version simple, ce qui est dans la description.

Oui ok. Un patch avec le RegexValidator mentionné plus haut, pour la saisie en UI et pour l’api.

Le précédent patch, i.e. la solution "dénominateur commun 10 chiffres dont le premier est zéro", permet bien le pré-remplissage d’un champ numéro français dans w.c.s., à condition bien sûr d’avoir #56541.

L'ordre pour les types d'attributs c'est d'abord le créer dans a2 puis dans hobo.

Oui tout à fait, j’ai fait le ticket #56541 et le code qui va avec dans la foulée pour tester de bout en bout, mais il faut avant tout le code dans a2.

#18

Mis à jour par Benjamin Dauvergne il y a plus de 2 ans

  • Statut changé de Solution proposée à Solution validée

Go.

#19

Mis à jour par Paul Marillonnet il y a plus de 2 ans

  • Statut changé de Solution validée à Résolu (à déployer)
commit 3b5f9e3eaaa32bbaf8e221de168f8474936f4af3
Author: Paul Marillonnet <pmarillonnet@entrouvert.com>
Date:   Thu Aug 5 11:58:56 2021 +0200

    attribute_kinds: add french phone number type (#45422)
#20

Mis à jour par Frédéric Péters il y a plus de 2 ans

  • Statut changé de Résolu (à déployer) à Solution déployée

Formats disponibles : Atom PDF