示例#1
0
    def clean(self, value):
        super(DEIdentityCardNumberField, self).clean(value)
        error_msg = gettext(
            u'Enter a valid German identity card number in XXXXXXXXXXX-XXXXXXX-XXXXXXX-X format.'
        )
        if value in EMPTY_VALUES:
            return u''
        match = re.match(id_re, value)
        if not match:
            raise ValidationError(error_msg)

        gd = match.groupdict()
        residence, origin = gd['residence'], gd['origin']
        birthday, validity, checksum = gd['birthday'], gd['validity'], gd[
            'checksum']

        if residence == '0000000000' or birthday == '0000000' or validity == '0000000':
            raise ValidationError(error_msg)

        all_digits = "%s%s%s%s" % (residence, birthday, validity, checksum)
        if not self.has_valid_checksum(residence) or not self.has_valid_checksum(birthday) or \
            not self.has_valid_checksum(validity) or not self.has_valid_checksum(all_digits):
            raise ValidationError(error_msg)

        return u'%s%s-%s-%s-%s' % (residence, origin, birthday, validity,
                                   checksum)
示例#2
0
    def clean(self, value):
        # strip spaces and dashes
        value = value.strip().replace(' ', '').replace('-', '')

        super(ZAIDField, self).clean(value)

        if value in EMPTY_VALUES:
            return u''

        match = re.match(id_re, value)

        if not match:
            raise ValidationError(self.error_messages['invalid'])

        g = match.groupdict()

        try:
            # The year 2000 is conveniently a leapyear.
            # This algorithm will break in xx00 years which aren't leap years
            # There is no way to guess the century of a ZA ID number
            d = date(int(g['yy']) + 2000, int(g['mm']), int(g['dd']))
        except ValueError:
            raise ValidationError(self.error_messages['invalid'])

        if not luhn(value):
            raise ValidationError(self.error_messages['invalid'])

        return value
示例#3
0
    def clean(self, value):
        """
        Value can be either a string in the format XX.XXX.XXX/XXXX-XX or a
        group of 14 characters.
        """
        value = super(BRCNPJField, self).clean(value)
        if value in EMPTY_VALUES:
            return u''
        orig_value = value[:]
        if not value.isdigit():
            value = re.sub("[-/\.]", "", value)
        try:
            int(value)
        except ValueError:
            raise ValidationError("This field requires only numbers.")
        if len(value) != 14:
            raise ValidationError(
                gettext("This field requires at least 14 digits"))
        orig_dv = value[-2:]

        new_1dv = sum([i * int(value[idx]) for idx, i in enumerate(range(5, 1, -1) + 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(range(6, 1, -1) + range(9, 1, -1))])
        new_2dv = DV_maker(new_2dv % 11)
        value = value[:-1] + str(new_2dv)
        if value[-2:] != orig_dv:
            raise ValidationError(gettext("Invalid CNPJ number."))

        return orig_value
示例#4
0
    def clean(self, value):
        """
        Value can be either a string in the format XX.XXX.XXX/XXXX-XX or a
        group of 14 characters.
        """
        value = super(BRCNPJField, self).clean(value)
        if value in EMPTY_VALUES:
            return u''
        orig_value = value[:]
        if not value.isdigit():
            value = re.sub("[-/\.]", "", value)
        try:
            int(value)
        except ValueError:
            raise ValidationError(self.error_messages['digits_only'])
        if len(value) != 14:
            raise ValidationError(self.error_messages['max_digits'])
        orig_dv = value[-2:]

        new_1dv = sum([
            i * int(value[idx])
            for idx, i in enumerate(range(5, 1, -1) + 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(range(6, 1, -1) + range(9, 1, -1))
        ])
        new_2dv = DV_maker(new_2dv % 11)
        value = value[:-1] + str(new_2dv)
        if value[-2:] != orig_dv:
            raise ValidationError(self.error_messages['invalid'])

        return orig_value
示例#5
0
 def clean(self, value):
     """
     Value must be an 11-digit number.
     """
     value = super(PERUCField, self).clean(value)
     if value in EMPTY_VALUES:
         return u''
     if not value.isdigit():
         raise ValidationError(self.error_messages['invalid'])
     if len(value) != 11:
         raise ValidationError(self.error_messages['max_digits'])
     return value
示例#6
0
文件: forms.py 项目: hfeeki/geodjango
 def clean(self, value):
     value = super(ITSocialSecurityNumberField, self).clean(value)
     if value == u'':
         return value
     value = re.sub('\s', u'', value).upper()
     try:
         check_digit = ssn_check_digit(value)
     except ValueError:
         raise ValidationError(self.error_messages['invalid'])
     if not value[15] == check_digit:
         raise ValidationError(self.error_messages['invalid'])
     return value
示例#7
0
    def clean(self, value):
        """
        Value must be a string in the XXXXXXXX formats.
        """
        value = super(PEDNIField, self).clean(value)
        if value in EMPTY_VALUES:
            return u''
        if not value.isdigit():
            raise ValidationError(self.error_messages['invalid'])
        if len(value) != 8:
            raise ValidationError(self.error_messages['max_digits'])

        return value
示例#8
0
文件: forms.py 项目: hfeeki/geodjango
    def clean(self, value):
        super(NLZipCodeField, self).clean(value)
        if value in EMPTY_VALUES:
            return u''

        value = value.strip().upper().replace(' ', '')
        if not pc_re.search(value):
            raise ValidationError(self.error_messages['invalid'])

        if int(value[:4]) < 1000:
            raise ValidationError(self.error_messages['invalid'])

        return u'%s %s' % (value[:4], value[4:])
示例#9
0
文件: forms.py 项目: hfeeki/geodjango
 def clean(self, value):
     value = super(ITVatNumberField, self).clean(value)
     if value == u'':
         return value
     try:
         vat_number = int(value)
     except ValueError:
         raise ValidationError(self.error_messages['invalid'])
     vat_number = str(vat_number).zfill(11)
     check_digit = vat_number_check_digit(vat_number[0:10])
     if not vat_number[10] == check_digit:
         raise ValidationError(self.error_messages['invalid'])
     return smart_unicode(vat_number)
示例#10
0
 def clean(self, value):
     value = super(ITVatNumberField, self).clean(value)
     if value == u'':
         return value
     err_msg = gettext(u'Enter a valid VAT number.')
     try:
         vat_number = int(value)
     except ValueError:
         raise ValidationError(err_msg)
     vat_number = str(vat_number).zfill(11)
     check_digit = vat_number_check_digit(vat_number[0:10])
     if not vat_number[10] == check_digit:
         raise ValidationError(err_msg)
     return smart_unicode(vat_number)
示例#11
0
    def clean(self, value):
        super(CASocialInsuranceNumberField, self).clean(value)
        if value in EMPTY_VALUES:
            return u''

        match = re.match(sin_re, value)
        if not match:
            raise ValidationError(self.error_messages['invalid'])

        number = u'%s-%s-%s' % (match.group(1), match.group(2), match.group(3))
        check_number = u'%s%s%s' % (match.group(1), match.group(2), match.group(3))
        if not self.luhn_checksum_is_valid(check_number):
            raise ValidationError(self.error_messages['invalid'])
        return number
示例#12
0
文件: forms.py 项目: hfeeki/geodjango
    def clean(self, value):
        """
        Value can be a string either in the [X]X.XXX.XXX or [X]XXXXXXX formats.
        """
        value = super(ARDNIField, self).clean(value)
        if value in EMPTY_VALUES:
            return u''
        if not value.isdigit():
            value = value.replace('.', '')
        if not value.isdigit():
            raise ValidationError(self.error_messages['invalid'])
        if len(value) not in (7, 8):
            raise ValidationError(self.error_messages['max_digits'])

        return value
示例#13
0
    def clean(self, value):
        super(NOSocialSecurityNumber, self).clean(value)
        if value in EMPTY_VALUES:
            return u''

        msg = gettext(u'Enter a valid Norwegian social security number.')
        if not re.match(r'^\d{11}$', value):
            raise ValidationError(msg)

        day = int(value[:2])
        month = int(value[2:4])
        year2 = int(value[4:6])

        inum = int(value[6:9])
        self.birthday = None
        try:
            if 000 <= inum < 500:
                self.birthday = datetime.date(1900 + year2, month, day)
            if 500 <= inum < 750 and year2 > 54:
                self.birthday = datetime.date(1800 + year2, month, day)
            if 500 <= inum < 1000 and year2 < 40:
                self.birthday = datetime.date(2000 + year2, month, day)
            if 900 <= inum < 1000 and year2 > 39:
                self.birthday = datetime.date(1900 + year2, month, day)
        except ValueError:
            raise ValidationError(msg)

        sexnum = int(value[8])
        if sexnum % 2 == 0:
            self.gender = 'F'
        else:
            self.gender = 'M'

        digits = map(int, list(value))
        weight_1 = [3, 7, 6, 1, 8, 9, 4, 5, 2, 1, 0]
        weight_2 = [5, 4, 3, 2, 7, 6, 5, 4, 3, 2, 1]

        def multiply_reduce(aval, bval):
            return sum((a * b) for (a, b) in zip(aval, bval))

        if multiply_reduce(digits, weight_1) % 11 != 0:
            raise ValidationError(msg)
        if multiply_reduce(digits, weight_2) % 11 != 0:
            raise ValidationError(msg)

        return value
示例#14
0
 def clean(self, value):
     super(CHPhoneNumberField, self).clean(value)
     if value in EMPTY_VALUES:
         return u''
     value = re.sub('(\.|\s|/|-)', '', smart_unicode(value))
     m = phone_digits_re.search(value)
     if m:
         return u'%s %s %s %s' % (value[0:3], value[3:6], value[6:8], value[8:10])
     raise ValidationError('Phone numbers must be in 0XX XXX XX XX format.')
示例#15
0
 def clean(self, value):
     super(USPhoneNumberField, self).clean(value)
     if value in EMPTY_VALUES:
         return u''
     value = re.sub('(\(|\)|\s+)', '', smart_unicode(value))
     m = phone_digits_re.search(value)
     if m:
         return u'%s-%s-%s' % (m.group(1), m.group(2), m.group(3))
     raise ValidationError(u'Phone numbers must be in XXX-XXX-XXXX format.')
示例#16
0
 def clean(self, value):
     super(BRPhoneNumberField, self).clean(value)
     if value in EMPTY_VALUES:
         return u''
     value = re.sub('(\(|\)|\s+)', '', smart_unicode(value))
     m = phone_digits_re.search(value)
     if m:
         return u'%s-%s-%s' % (m.group(1), m.group(2), m.group(3))
     raise ValidationError(self.error_messages['invalid'])
示例#17
0
文件: forms.py 项目: hfeeki/geodjango
 def clean(self, value):
     value = super(ARPostalCodeField, self).clean(value)
     if value in EMPTY_VALUES:
         return u''
     if len(value) not in (4, 8):
         raise ValidationError(self.error_messages['invalid'])
     if len(value) == 8:
         return u'%s%s%s' % (value[0].upper(), value[1:5],
                             value[5:].upper())
     return value
示例#18
0
 def clean(self, value):
     value = super(UKPostcodeField, self).clean(value)
     if value == u'':
         return value
     postcode = value.upper().strip()
     # Put a single space before the incode (second part).
     postcode = self.space_regex.sub(r' \1', postcode)
     if not self.postcode_regex.search(postcode):
         raise ValidationError(self.default_error_messages['invalid'])
     return postcode
示例#19
0
 def clean(self, value):
     super(FRPhoneNumberField, self).clean(value)
     if value in EMPTY_VALUES:
         return u''
     value = re.sub('(\.|\s)', '', smart_unicode(value))
     m = phone_digits_re.search(value)
     if m:
         return u'%s %s %s %s %s' % (value[0:2], value[2:4], value[4:6],
                                     value[6:8], value[8:10])
     raise ValidationError(self.error_messages['invalid'])
示例#20
0
 def clean(self, value):
     value = super(BRStateChoiceField, self).clean(value)
     if value in EMPTY_VALUES:
         value = u''
     value = smart_unicode(value)
     if value == u'':
         return value
     valid_values = set([smart_unicode(k) for k, v in self.widget.choices])
     if value not in valid_values:
         raise ValidationError(self.error_messages['invalid'])
     return value
示例#21
0
    def clean(self, value):
        super(FISocialSecurityNumber, self).clean(value)
        if value in EMPTY_VALUES:
            return u''

        checkmarks = "0123456789ABCDEFHJKLMNPRSTUVWXY"
        result = re.match(r"""^
            (?P<date>([0-2]\d|3[01])
            (0\d|1[012])
            (\d{2}))
            [A+-]
            (?P<serial>(\d{3}))
            (?P<checksum>[%s])$""" % checkmarks, value, re.VERBOSE | re.IGNORECASE)
        if not result:
            raise ValidationError(self.error_messages['invalid'])
        gd = result.groupdict()
        checksum = int(gd['date'] + gd['serial'])
        if checkmarks[checksum % len(checkmarks)] == gd['checksum'].upper():
            return u'%s' % value.upper()
        raise ValidationError(self.error_messages['invalid'])
示例#22
0
文件: forms.py 项目: hfeeki/geodjango
    def clean(self, value):
        value = super(ISIdNumberField, self).clean(value)

        if value in EMPTY_VALUES:
            return u''

        value = self._canonify(value)
        if self._validate(value):
            return self._format(value)
        else:
            raise ValidationError(self.error_messages['checksum'])
示例#23
0
文件: forms.py 项目: hfeeki/geodjango
    def clean(self, value):
        super(NLSoFiNumberField, self).clean(value)
        if value in EMPTY_VALUES:
            return u''

        if not sofi_re.search(value):
            raise ValidationError(self.error_messages['invalid'])

        if int(value) == 0:
            raise ValidationError(self.error_messages['invalid'])

        checksum = 0
        for i in range(9, 1, -1):
            checksum += int(value[9-i]) * i
        checksum -= int(value[-1])

        if checksum % 11 != 0:
            raise ValidationError(self.error_messages['invalid'])

        return value
示例#24
0
    def clean(self, value):
        super(DEIdentityCardNumberField, self).clean(value)
        if value in EMPTY_VALUES:
            return u''
        match = re.match(id_re, value)
        if not match:
            raise ValidationError(self.error_messages['invalid'])

        gd = match.groupdict()
        residence, origin = gd['residence'], gd['origin']
        birthday, validity, checksum = gd['birthday'], gd['validity'], gd['checksum']

        if residence == '0000000000' or birthday == '0000000' or validity == '0000000':
            raise ValidationError(self.error_messages['invalid'])

        all_digits = u"%s%s%s%s" % (residence, birthday, validity, checksum)
        if not self.has_valid_checksum(residence) or not self.has_valid_checksum(birthday) or \
            not self.has_valid_checksum(validity) or not self.has_valid_checksum(all_digits):
                raise ValidationError(self.error_messages['invalid'])

        return u'%s%s-%s-%s-%s' % (residence, origin, birthday, validity, checksum)
示例#25
0
文件: forms.py 项目: hfeeki/geodjango
 def clean(self, value):
     """
     Value can be either a string in the format XX-XXXXXXXX-X or an
     11-digit number.
     """
     value = super(ARCUITField, self).clean(value)
     if value in EMPTY_VALUES:
         return u''
     value, cd = self._canon(value)
     if self._calc_cd(value) != cd:
         raise ValidationError(self.error_messages['checksum'])
     return self._format(value, cd)
示例#26
0
    def clean(self, value):
        super(CHIdentityCardNumberField, self).clean(value)
        error_msg = gettext('Enter a valid Swiss identity or passport card number in X1234567<0 or 1234567890 format.')
        if value in EMPTY_VALUES:
            return u''

        match = re.match(id_re, value)
        if not match:
            raise ValidationError(error_msg)

        idnumber, pos9, checksum = match.groupdict()['idnumber'], match.groupdict()['pos9'], match.groupdict()['checksum']

        if idnumber == '00000000' or \
           idnumber == 'A0000000':
            raise ValidationError(error_msg)

        all_digits = "%s%s%s" % (idnumber, pos9, checksum)
        if not self.has_valid_checksum(all_digits):
            raise ValidationError(error_msg)

        return u'%s%s%s' % (idnumber, pos9, checksum)
示例#27
0
 def clean(self, value):
     """
     Check and clean the Chilean RUT.
     """
     super(CLRutField, self).clean(value)
     if value in EMPTY_VALUES:
         return u''
     rut, verificador = self._canonify(value)
     if self._algorithm(rut) == verificador:
         return self._format(rut, verificador)
     else:
         raise ValidationError(u'The Chilean RUT is not valid.')
示例#28
0
文件: forms.py 项目: hfeeki/geodjango
 def clean(self, value):
     """
     Validate a phone number. Strips parentheses, whitespace and hyphens.
     """
     super(AUPhoneNumberField, self).clean(value)
     if value in EMPTY_VALUES:
         return u''
     value = re.sub('(\(|\)|\s+|-)', '', smart_unicode(value))
     phone_match = PHONE_DIGITS_RE.search(value)
     if phone_match:
         return u'%s' % phone_match.group(1)
     raise ValidationError(self.error_messages['invalid'])
示例#29
0
    def clean(self, value):
        super(CHIdentityCardNumberField, self).clean(value)
        if value in EMPTY_VALUES:
            return u''

        match = re.match(id_re, value)
        if not match:
            raise ValidationError(self.error_messages['invalid'])

        idnumber, pos9, checksum = match.groupdict(
        )['idnumber'], match.groupdict()['pos9'], match.groupdict()['checksum']

        if idnumber == '00000000' or \
           idnumber == 'A0000000':
            raise ValidationError(self.error_messages['invalid'])

        all_digits = "%s%s%s" % (idnumber, pos9, checksum)
        if not self.has_valid_checksum(all_digits):
            raise ValidationError(self.error_messages['invalid'])

        return u'%s%s%s' % (idnumber, pos9, checksum)
示例#30
0
    def clean(self, value):
        super(USSocialSecurityNumberField, self).clean(value)
        if value in EMPTY_VALUES:
            return u''
        msg = gettext(u'Enter a valid U.S. Social Security number in XXX-XX-XXXX format.')
        match = re.match(ssn_re, value)
        if not match:
            raise ValidationError(msg)
        area, group, serial = match.groupdict()['area'], match.groupdict()['group'], match.groupdict()['serial']

        # First pass: no blocks of all zeroes.
        if area == '000' or \
           group == '00' or \
           serial == '0000':
            raise ValidationError(msg)

        # Second pass: promotional and otherwise permanently invalid numbers.
        if area == '666' or \
           (area == '987' and group == '65' and 4320 <= int(serial) <= 4329) or \
           value == '078-05-1120' or \
           value == '219-09-9999':
            raise ValidationError(msg)
        return u'%s-%s-%s' % (area, group, serial)