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 |
|
-
|