diff options
author | Arthur de Jong <arthur@arthurdejong.org> | 2019-04-04 19:54:52 +0200 |
---|---|---|
committer | Arthur de Jong <arthur@arthurdejong.org> | 2019-04-04 19:55:41 +0200 |
commit | 3aeec68735d75a4835122990bef232ed415b07d5 (patch) | |
tree | 23671b39a5c783641e16aa2e6e35c57a89f3f260 /stdnum | |
parent | e07a0e249fa112f722ceae6aa197ee9d5a626e9d (diff) |
Add Israeli identity number
Diffstat (limited to 'stdnum')
-rw-r--r-- | stdnum/il/__init__.py | 21 | ||||
-rw-r--r-- | stdnum/il/idnr.py | 83 |
2 files changed, 104 insertions, 0 deletions
diff --git a/stdnum/il/__init__.py b/stdnum/il/__init__.py new file mode 100644 index 0000000..91a474e --- /dev/null +++ b/stdnum/il/__init__.py @@ -0,0 +1,21 @@ +# __init__.py - collection of Israeli numbers +# coding: utf-8 +# +# Copyright (C) 2019 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 Israeli numbers.""" diff --git a/stdnum/il/idnr.py b/stdnum/il/idnr.py new file mode 100644 index 0000000..e638ab7 --- /dev/null +++ b/stdnum/il/idnr.py @@ -0,0 +1,83 @@ +# idnr.py - functions for handling Israeli personal numbers +# coding: utf-8 +# +# Copyright (C) 2019 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 + +"""Identity Number (Mispar Zehut, מספר זהות, Israeli identity number). + +The identity number (Mispar Zehut, מספר זהות) is issued at birth to Israeli +citizens. The number consists of nine digits and includes a check digit. + +More information: + +* https://en.wikipedia.org/wiki/National_identification_number#Israel +* https://en.wikipedia.org/wiki/Israeli_identity_card +* https://he.wikipedia.org/wiki/מספר_זהות_(ישראל) + +>>> validate('3933742-3') +'039337423' +>>> format('39337423') +'03933742-3' +>>> validate('3933742-2') # invalid check digit +Traceback (most recent call last): + ... +InvalidChecksum: ... +>>> validate('490154203237518') # longer than 9 digits +Traceback (most recent call last): + ... +InvalidLength: ... +""" + +from stdnum import luhn +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, ' -').strip() + # pad with leading zeroes + return (9 - len(number)) * '0' + number + + +def validate(number): + """Check if the number provided is a valid ID. This checks the length, + formatting and check digit.""" + number = compact(number) + if len(number) > 9: + raise InvalidLength() + if not number.isdigit() or int(number) <= 0: + raise InvalidFormat() + luhn.validate(number) + return number + + +def is_valid(number): + """Check if the number provided is a valid ID. This checks the length, + formatting and check digit.""" + try: + return bool(validate(number)) + except ValidationError: + return False + + +def format(number): + """Reformat the number to the standard presentation format.""" + number = compact(number) + return number[:-1] + '-' + number[-1:] |