Projet

Général

Profil

0004-fields-add-a-PhoneField-70486.patch

Paul Marillonnet, 19 octobre 2022 17:10

Télécharger (2,46 ko)

Voir les différences:

Subject: [PATCH 4/4] fields: add a PhoneField (#70486)

 src/authentic2/forms/fields.py | 31 ++++++++++++++++++++++++++++++-
 1 file changed, 30 insertions(+), 1 deletion(-)
src/authentic2/forms/fields.py
17 17
import io
18 18
import warnings
19 19

  
20
import phonenumbers
20 21
import PIL.Image
21 22
from django import forms
23
from django.conf import settings
22 24
from django.core import validators
23 25
from django.core.files import File
24
from django.forms import CharField, EmailField, FileField, ModelChoiceField, ValidationError
26
from django.forms import CharField, EmailField, FileField, ModelChoiceField, MultiValueField, ValidationError
25 27
from django.forms.fields import FILE_INPUT_CONTRADICTION
26 28
from django.utils.translation import gettext_lazy as _
27 29

  
......
32 34
    EmailInput,
33 35
    NewPasswordInput,
34 36
    PasswordInput,
37
    PhoneWidget,
35 38
    ProfileImageInput,
36 39
)
37 40
from authentic2.manager.utils import label_from_role
......
209 212
        self.validate(value)
210 213
        self.run_validators(value)
211 214
        return value
215

  
216

  
217
class PhoneField(MultiValueField):
218
    widget = PhoneWidget
219

  
220
    def __init__(self, **kwargs):
221
        fields = (
222
            CharField(max_length=8, initial=settings.DEFAULT_COUNTRY_CODE),
223
            CharField(max_length=16, required=False),
224
        )
225
        super().__init__(error_messages=None, fields=fields, require_all_fields=False, **kwargs)
226

  
227
    def compress(self, data_list):
228
        from authentic2.attribute_kinds import clean_number
229

  
230
        if data_list and data_list[1]:
231
            country_code = data_list[0]
232
            data_list[0] = '+%s' % data_list[0]
233
            data_list[1] = clean_number(data_list[1])
234
            dial = settings.PHONE_COUNTRY_CODES.get(country_code, settings.DEFAULT_COUNTRY_CODE).get('lang')
235
            try:
236
                pn = phonenumbers.parse(''.join(data_list), dial)
237
            except phonenumbers.NumberParseException:
238
                raise ValidationError(_('Invalid phone number.'))
239
            return phonenumbers.format_number(pn, phonenumbers.PhoneNumberFormat.E164)
240
        return ''
212
-