Welcome, guest! Login / Register - Why register?
Psst.. new poll here.
Psst.. new forums here.
Microsoft is blocking us again (TY IP Reputation!) so just use oauth login instead. :)

Paste

Pasted as Python by 1123 ( 7 years ago )
# =============================================================================
# СНИЛС
# =============================================================================
_snils_re = re.compile(r'^\d{3}-\d{3}-\d{3} \d{2}$')  # СНИЛС


def snils_validator(value):
    u"""Валидатор СНИЛС.

    Проверяет корректность формата и контрольное число (последние две цифры).

    :raises django.core.exceptions.ValidationError: Если аргумент value
        содержит значение, несоответствующее формату СНИЛС, либо контрольное
        число некорректно.
    """
    value = six.text_type(value)

    if not _snils_re.match(value):
        raise ValidationError(u'СНИЛС должен быть в формате ###-###-### ##')

    if value[:11] <= u'001-001-998':
        return

    numbers = (int(ch) for ch in reversed(value[:11]) if ch.isdigit())
    checksum = int(value[12:14])
    summa = sum(i * n for i, n in enumerate(numbers, 1))
    if summa > 101:
        summa %= 101

    if (summa < 100 and summa != checksum or
            summa in (100, 101) and checksum != 0):
        raise ValidationError(u'не пройдена проверка контрольного числа')


is_snils_valid = partial(validate_value, validator=snils_validator)

 

Revise this Paste

Your Name: Code Language: