Source code for localflavor.md.validators

import re

from django.core.exceptions import ValidationError
from django.core.validators import RegexValidator
from django.utils.translation import gettext_lazy as _

from .choices import (LICENSE_PLATE_DIPLOMATIC, LICENSE_PLATE_GOVERNMENT_TYPE, LICENSE_PLATE_POLICE,
                      REGION_CHOICES_2002_2015)


[docs]class MDIDNOFieldValidator(RegexValidator): """ Validation for Moldavian IDNO. .. versionadded:: 2.1 """ error_message = _('Enter a valid IDNO number.') regex = r'^\d{13}$' message = error_message
[docs]class MDLicensePlateValidator(RegexValidator): """ Validation for `Moldavian License Plates`_. .. _Moldavian License Plates: https://en.wikipedia.org/wiki/Vehicle_registration_plates_of_Moldova .. versionadded:: 2.1 """ error_message = _('Enter a valid license plate.') regex = r'^\d{13}$' message = error_message def __call__(self, value): value = value.upper() if not self._is_valid(value): raise ValidationError(self.error_message, code='invalid') def _is_valid(self, value): return any([ self._is_old_format(value), self._is_new_format(value), self._is_president_format(value), self._is_diplomatic_format(value), self._is_police_format(value), self._is_foreign_format(value), self._is_state_security_format(value), self._is_gov_format(value) ]) @staticmethod def _is_old_format(value): regions = "|".join([code for code, desc in REGION_CHOICES_2002_2015]) pattern = r'({regions}) [A-Z]{{2}} \d{{1,3}}'.format(regions=regions) return re.match(pattern, value) is not None @staticmethod def _is_new_format(value): if not any(x in value for x, y in LICENSE_PLATE_POLICE): pattern = r'^[A-Z]{3} \d{1,3}$' return re.match(pattern, value) is not None return False @staticmethod def _is_gov_format(value): types = "|".join([code for code, desc in LICENSE_PLATE_GOVERNMENT_TYPE]) pattern = r'^RM ({types}) \d{{3}}$'.format(types=types) return re.match(pattern, value) is not None @staticmethod def _is_diplomatic_format(value): types = "|".join([code for code, desc in LICENSE_PLATE_DIPLOMATIC]) pattern = r'^({types}) \d{{3}} A{{1,2}}$'.format(types=types) return re.match(pattern, value) is not None @staticmethod def _is_police_format(value): types = "|".join([code for code, desc in LICENSE_PLATE_POLICE]) gov_format = r'^({types}) \d{{4}}$'.format(types=types) return re.match(gov_format, value) is not None @staticmethod def _is_president_format(value): pattern = r'^RM \d{4}$' return re.match(pattern, value) is not None @staticmethod def _is_state_security_format(value): pattern = r'^SP \d{3}$' return re.match(pattern, value) is not None @staticmethod def _is_foreign_format(value): pattern = r'^H \d{4}$' return re.match(pattern, value) is not None