# -*- coding: utf-8 -*- # import re import phonenumbers from django.core.validators import RegexValidator from django.utils.translation import gettext_lazy as _ from phonenumbers.phonenumberutil import NumberParseException from rest_framework import serializers from rest_framework.validators import ( UniqueTogetherValidator, ValidationError ) from common.utils.strings import no_special_chars alphanumeric = RegexValidator(r'^[0-9a-zA-Z_@\-\.]*$', _('Special char not allowed')) alphanumeric_re = re.compile(r'^[0-9a-zA-Z_@\-\.]*$') alphanumeric_cn_re = re.compile(r'^[0-9a-zA-Z_@\-\.\u4E00-\u9FA5]*$') alphanumeric_win_re = re.compile(r'^[0-9a-zA-Z_@#%&~\^\$\-\.\u4E00-\u9FA5]*$') class ProjectUniqueValidator(UniqueTogetherValidator): def __call__(self, attrs, serializer): try: super().__call__(attrs, serializer) except ValidationError as e: errors = {} for field in self.fields: if field == "org_id": continue errors[field] = _('This field must be unique.') raise ValidationError(errors) class NoSpecialChars: def __call__(self, value): if not no_special_chars(value): raise serializers.ValidationError( _("Should not contains special characters") ) class PhoneValidator: message = _('The mobile phone number format is incorrect') def __call__(self, value): if not value: return try: phone = phonenumbers.parse(value, 'CN') valid = phonenumbers.is_valid_number(phone) except NumberParseException: valid = False if not valid: raise serializers.ValidationError(self.message)