diff --git a/apps/common/validators.py b/apps/common/validators.py index 4be90d855..c77a03581 100644 --- a/apps/common/validators.py +++ b/apps/common/validators.py @@ -2,6 +2,8 @@ # import re +import phonenumbers + from django.core.validators import RegexValidator from django.utils.translation import ugettext_lazy as _ from rest_framework.validators import ( @@ -42,9 +44,9 @@ class NoSpecialChars: class PhoneValidator: - pattern = re.compile(r"^1[3456789]\d{9}$") message = _('The mobile phone number format is incorrect') def __call__(self, value): - if not self.pattern.match(value): + phone = phonenumbers.parse(value) + if not phonenumbers.is_valid_number(phone): raise serializers.ValidationError(self.message) diff --git a/apps/users/serializers/user.py b/apps/users/serializers/user.py index 962fbcd24..5d239820c 100644 --- a/apps/users/serializers/user.py +++ b/apps/users/serializers/user.py @@ -1,5 +1,7 @@ # -*- coding: utf-8 -*- # +import phonenumbers + from functools import partial from django.utils.translation import ugettext_lazy as _ @@ -222,6 +224,14 @@ class UserSerializer(RolesSerializerMixin, CommonBulkSerializerMixin, serializer attrs.pop("password_strategy", None) return attrs + def to_representation(self, instance): + data = super().to_representation(instance) + phone = phonenumbers.parse(data['phone'], 'CN') + data['phone'] = { + 'code': '+%s' % phone.country_code, 'phone': phone.national_number + } + return data + def save_and_set_custom_m2m_fields(self, validated_data, save_handler, created): m2m_values = {} for f, default_roles in self.custom_m2m_fields.items(): diff --git a/requirements/requirements.txt b/requirements/requirements.txt index 6457f2104..e01baa999 100644 --- a/requirements/requirements.txt +++ b/requirements/requirements.txt @@ -29,6 +29,7 @@ pycparser==2.21 cryptography==38.0.4 pycryptodome==3.15.0 pycryptodomex==3.15.0 +phonenumbers==8.13.8 gmssl==3.2.1 itsdangerous==1.1.0 pyotp==2.6.0