Source code for localflavor.bg.validators

from django.core.exceptions import ValidationError
from django.utils.translation import ugettext_lazy as _

from .utils import get_egn_birth_date


[docs]def egn_validator(egn): """ Check Bulgarian unique citizenship number (EGN) for validity More details https://en.wikipedia.org/wiki/Unique_citizenship_number Full information in Bulgarian about algorithm is available here http://www.grao.bg/esgraon.html#section2 """ def check_checksum(egn): weights = (2, 4, 8, 5, 10, 9, 7, 3, 6) try: checksum = sum(weight * int(digit) for weight, digit in zip(weights, egn)) return int(egn[-1]) == checksum % 11 % 10 except ValueError: return False def check_valid_date(egn): try: return get_egn_birth_date(egn) except ValueError: return None if not (len(egn) == 10 and check_checksum(egn) and check_valid_date(egn)): raise ValidationError(_("The EGN is not valid"))
[docs]def eik_validator(eik): """ Check Bulgarian EIK/BULSTAT codes for validity full information in Bulgarian about algorithm is available here http://bulstat.registryagency.bg/About.html """ error_message = _('EIK/BULSTAT is not valid') def get_checksum(weights, digits): checksum = sum(weight * digit for weight, digit in zip(weights, digits)) return checksum % 11 def check_eik_base(eik): checksum = get_checksum(range(1, 9), eik) if checksum == 10: checksum = get_checksum(range(3, 11), eik) return eik[8] == checksum % 10 def check_eik_extra(eik): digits = eik[8:12] checksum = get_checksum((2, 7, 3, 5), digits) if checksum == 10: checksum = get_checksum((4, 9, 5, 7), digits) return eik[-1] == checksum % 10 try: eik = list(map(int, eik)) except ValueError: raise ValidationError(error_message) if not (len(eik) in [9, 13] and check_eik_base(eik)): raise ValidationError(error_message) if len(eik) == 13 and not check_eik_extra(eik): raise ValidationError(error_message)