- Author:
- tcarranza
- Posted:
- January 14, 2017
- Language:
- Python
- Version:
- Not specified
- Score:
- 0 (after 0 ratings)
The code was placed inside a helper file without using a class. The Django validator was not designed to work with validator classes, it would appear, so retrieving the value from the field proved to be a hassle. Just create a helper file, import it on your model, and use the validator in the standard way, as such:
cnpj = models.CharField(unique=True, max_length=14, validators=[validate_CNPJ])
cpf = models.CharField(unique=True, max_length=14, validators=[validate_CPF])
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 | __author__ = "Théo Carranza [email protected]"
__copyright__ = "Copyright (C) 2017 Théo Carranza"
__license__ = "Public Domain"
__version__ = "1.0"
""" This is a slight modification from the class created by author dudus
(https://djangosnippets.org/users/dudus/) for use on the model layer.
It is optimized for Python 3.5 and PEP8 compliant. """
import re
from django.core.validators import EMPTY_VALUES
from django.forms import ValidationError
from django.utils.translation import ugettext_lazy as _
error_messages = {
'invalid': _("Invalid CPF number."),
'digits_only': _("This field requires only numbers."),
'max_digits': _("This field requires exactly 11 digits."),
}
def DV_maker(v):
if v >= 2:
return 11 - v
return 0
def validate_CPF(value):
"""
Value can be either a string in the format XXX.XXX.XXX-XX or an
11-digit number.
"""
if value in EMPTY_VALUES:
return u''
if not value.isdigit():
value = re.sub("[-\.]", "", value)
orig_value = value[:]
try:
int(value)
except ValueError:
raise ValidationError(error_messages['digits_only'])
if len(value) != 11:
raise ValidationError(error_messages['max_digits'])
orig_dv = value[-2:]
new_1dv = sum([i * int(value[idx]) for idx, i in enumerate(range(10, 1, -1))])
new_1dv = DV_maker(new_1dv % 11)
value = value[:-2] + str(new_1dv) + value[-1]
new_2dv = sum([i * int(value[idx]) for idx, i in enumerate(range(11, 1, -1))])
new_2dv = DV_maker(new_2dv % 11)
value = value[:-1] + str(new_2dv)
if value[-2:] != orig_dv:
raise ValidationError(error_messages['invalid'])
return orig_value
def validate_CNPJ(value):
"""
Value can be either a string in the format XX.XXX.XXX/XXXX-XX or a
group of 14 characters.
:type value: object
"""
value = str(value)
if value in EMPTY_VALUES:
return u''
if not value.isdigit():
value = re.sub("[-/\.]", "", value)
orig_value = value[:]
try:
int(value)
except ValueError:
raise ValidationError(error_messages['digits_only'])
if len(value) > 14:
raise ValidationError(error_messages['max_digits'])
orig_dv = value[-2:]
new_1dv = sum([i * int(value[idx]) for idx, i in enumerate(list(range(5, 1, -1)) + list(range(9, 1, -1)))])
new_1dv = DV_maker(new_1dv % 11)
value = value[:-2] + str(new_1dv) + value[-1]
new_2dv = sum([i * int(value[idx]) for idx, i in enumerate(list(range(6, 1, -1)) + list(range(9, 1, -1)))])
new_2dv = DV_maker(new_2dv % 11)
value = value[:-1] + str(new_2dv)
if value[-2:] != orig_dv:
raise ValidationError(error_messages['invalid'])
return orig_value
|
More like this
- Template tag - list punctuation for a list of items by shapiromatron 9 months ago
- JSONRequestMiddleware adds a .json() method to your HttpRequests by cdcarter 9 months, 1 week ago
- Serializer factory with Django Rest Framework by julio 1 year, 4 months ago
- Image compression before saving the new model / work with JPG, PNG by Schleidens 1 year, 4 months ago
- Help text hyperlinks by sa2812 1 year, 5 months ago
Comments
Please login first before commenting.