Development #45422
Type de champ "numéro de tel français"
0%
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
Révisions associées
Historique
Mis à jour par Paul Marillonnet il y a plus de 2 ans
- Fichier 0001-attribute_kinds-add-french-phone-number-type-45422.patch 0001-attribute_kinds-add-french-phone-number-type-45422.patch ajouté
- Statut changé de Nouveau à Solution proposée
- Assigné à mis à Paul Marillonnet
- Patch proposed changé de Non à Oui
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).
Mis à jour par Benjamin Dauvergne il y a plus de 2 ans
- Statut changé de Solution proposée à En cours
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.
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.
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 justeRegexValidator('^\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.
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
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.
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.
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.
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é
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.
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.
Mis à jour par Paul Marillonnet il y a plus de 2 ans
- Fichier 0001-attribute_kinds-add-french-phone-number-type-45422.patch 0001-attribute_kinds-add-french-phone-number-type-45422.patch ajouté
- Statut changé de En cours à Solution proposée
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.
Mis à jour par Benjamin Dauvergne il y a plus de 2 ans
- Statut changé de Solution proposée à Solution validée
Go.
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)
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
attribute_kinds: add french phone number type (#45422)