update path, add python unrar

This commit is contained in:
j 2019-01-29 16:10:06 +05:30
commit 00165d302e
862 changed files with 804 additions and 6 deletions

View file

@ -0,0 +1,24 @@
# __init__.py - collection of Czech numbers
# coding: utf-8
#
# Copyright (C) 2012 Arthur de Jong
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
# 02110-1301 USA
"""Collection of Czech numbers."""
# provide vat as an alias
from stdnum.cz import dic as vat

View file

@ -0,0 +1,101 @@
# dic.py - functions for handling Czech VAT numbers
# coding: utf-8
#
# Copyright (C) 2012, 2013 Arthur de Jong
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
# 02110-1301 USA
"""DIČ (Daňové identifikační číslo, Czech VAT number).
The number is an 8, 9 or 10 digit code that includes a check digit and is
used to uniquely identify taxpayers for VAT (DPH in Czech). The number can
refer to legal entities (8 digit numbers), individuals with a (the 9 or
10 digit Czech birth number) or individuals without a (9 digit numbers
that begin with a 6).
>>> compact('CZ 25123891')
'25123891'
>>> validate('25123891') # legal entity
'25123891'
>>> validate('25123890') # incorrect check digit
Traceback (most recent call last):
...
InvalidChecksum: ...
>>> validate('7103192745') # RČ
'7103192745'
>>> validate('640903926') # special case
'640903926'
"""
from stdnum.cz import rc
from stdnum.exceptions import *
from stdnum.util import clean
def compact(number):
"""Convert the number to the minimal representation. This strips the
number of any valid separators and removes surrounding whitespace."""
number = clean(number, ' /').upper().strip()
if number.startswith('CZ'):
number = number[2:]
return number
def calc_check_digit_legal(number):
"""Calculate the check digit for 8 digit legal entities. The number
passed should not have the check digit included."""
check = (11 - sum((8 - i) * int(n) for i, n in enumerate(number))) % 11
return str((check or 1) % 10)
def calc_check_digit_special(number):
"""Calculate the check digit for special cases. The number passed
should not have the first and last digits included."""
check = (11 - sum((8 - i) * int(n) for i, n in enumerate(number))) % 11
return str(9 - check % 10)
def validate(number):
"""Checks to see if the number provided is a valid VAT number. This
checks the length, formatting and check digit."""
number = compact(number)
if not number.isdigit():
raise InvalidFormat()
if len(number) == 8:
# legal entities
if number.startswith('9'):
raise InvalidComponent()
if calc_check_digit_legal(number[:-1]) != number[-1]:
raise InvalidChecksum()
elif len(number) == 9 and number.startswith('6'):
# special cases (skip first digit in calculation)
if calc_check_digit_special(number[1:-1]) != number[-1]:
raise InvalidChecksum()
elif len(number) in (9, 10):
# 9 or 10 digit individual
rc.validate(number)
else:
raise InvalidLength()
return number
def is_valid(number):
"""Checks to see if the number provided is a valid VAT number. This
checks the length, formatting and check digit."""
try:
return bool(validate(number))
except ValidationError:
return False

View file

@ -0,0 +1,117 @@
# rc.py - functions for handling Czech birth numbers
# coding: utf-8
#
# Copyright (C) 2012, 2013 Arthur de Jong
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
# 02110-1301 USA
"""RČ (Rodné číslo, the Czech birth number).
The birth number (, Rodné číslo) is the Czech national identifier. The
number can be 9 or 10 digits long. Numbers given out after January 1st
1954 should have 10 digits. The number includes the birth date of the
person and their gender.
This number is identical to the Slovak counterpart.
>>> validate('710319/2745')
'7103192745'
>>> validate('991231123')
'991231123'
>>> validate('7103192746') # invalid check digit
Traceback (most recent call last):
...
InvalidChecksum: ...
>>> validate('1103492745') # invalid date
Traceback (most recent call last):
...
InvalidComponent: ...
>>> validate('590312/123') # 9 digit number in 1959
Traceback (most recent call last):
...
InvalidLength: ...
>>> format('7103192745')
'710319/2745'
"""
import datetime
from stdnum.exceptions import *
from stdnum.util import clean
def compact(number):
"""Convert the number to the minimal representation. This strips the
number of any valid separators and removes surrounding whitespace."""
return clean(number, ' /').upper().strip()
def get_birth_date(number):
"""Split the date parts from the number and return the birth date."""
year = 1900 + int(number[0:2])
# females have 50 added to the month value, 20 is added when the serial
# overflows (since 2004)
month = int(number[2:4]) % 50 % 20
day = int(number[4:6])
# 9 digit numbers were used until January 1st 1954
if len(number) == 9:
if year >= 1980:
year -= 100
if year > 1953:
raise InvalidLength('No 9 digit birth numbers after 1953.')
elif year < 1954:
year += 100
try:
return datetime.date(year, month, day)
except ValueError:
raise InvalidComponent()
def validate(number):
"""Checks to see if the number provided is a valid birth number. This
checks the length, formatting, embedded date and check digit."""
number = compact(number)
if not number.isdigit():
raise InvalidFormat()
if len(number) not in (9, 10):
raise InvalidLength()
# check if birth date is valid
birth_date = get_birth_date(number)
# TODO: check that the birth date is not in the future
# check the check digit (10 digit numbers only)
if len(number) == 10:
check = int(number[:-1]) % 11
# before 1985 the checksum could be 0 or 10
if birth_date < datetime.date(1985, 1, 1):
check = check % 10
if number[-1] != str(check):
raise InvalidChecksum()
return number
def is_valid(number):
"""Checks to see if the number provided is a valid birth number. This
checks the length, formatting, embedded date and check digit."""
try:
return bool(validate(number))
except ValidationError:
return False
def format(number):
"""Reformat the passed number to the standard format."""
number = compact(number)
return number[:6] + '/' + number[6:]