Last active
January 22, 2021 08:55
-
-
Save linuxgemini/dc2d86af970d7cd2ad3271cb2c790025 to your computer and use it in GitHub Desktop.
A single file Python module for Turkish ID numbers based around the work of github.com/ssg/TurkishId
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
"""tckn | |
A simple Python library for handling Turkish ID Numbers. | |
""" | |
# Copyright 2021 İlteriş Yağıztegin Eroğlu (linuxgemini) | |
# SPDX-License-Identifier: MIT | |
import secrets | |
from typing import List | |
__secure_rng = secrets.SystemRandom() | |
__all__ = [ | |
"verifyTCKN", | |
"generateTCKN" | |
] | |
def __is_int(n) -> bool: | |
try: | |
int(n) | |
return True | |
except ValueError: | |
return False | |
def __sum_digits(n: int) -> int: | |
s = 0 | |
while n: | |
s += n % 10 | |
n //= 10 | |
return s | |
def __generate_tckn_from_seed(seed: int) -> str: | |
d1 = seed // 100_000_000 | |
d2 = (seed // 10_000_000) % 10 | |
d3 = (seed // 1_000_000) % 10 | |
d4 = (seed // 100_000) % 10 | |
d5 = (seed // 10_000) % 10 | |
d6 = (seed // 1000) % 10 | |
d7 = (seed // 100) % 10 | |
d8 = (seed // 10) % 10 | |
d9 = seed % 10 | |
oddSum = d1 + d3 + d5 + d7 + d9 | |
evenSum = d2 + d4 + d6 + d8 | |
n = (oddSum * 7) - evenSum | |
if n < 0: | |
n = n + 10 | |
d10 = n % 10 | |
d11 = (oddSum + evenSum + d10) % 10 | |
return f"{seed}{d10}{d11}" | |
def verifyTCKN(tckn: str) -> bool: | |
if not isinstance(tckn, str): | |
raise ValueError("tckn is not a str") | |
if len(tckn) != 11: | |
raise ValueError("tckn is not 11 digits") | |
if not __is_int(tckn): | |
raise ValueError("tckn contains non-digit chars") | |
d1 = int(tckn[0]) | |
d2 = int(tckn[1]) | |
d3 = int(tckn[2]) | |
d4 = int(tckn[3]) | |
d5 = int(tckn[4]) | |
d6 = int(tckn[5]) | |
d7 = int(tckn[6]) | |
d8 = int(tckn[7]) | |
d9 = int(tckn[8]) | |
d10 = int(tckn[9]) | |
d11 = int(tckn[10]) | |
if d1 <= 0: | |
return False | |
n = ((d1 + d3 + d5 + d7 + d9) * 7) - (d2 + d4 + d6 + d8) | |
if n < 10: | |
n = n + 10 | |
d10calc = n % 10 | |
d11calc = __sum_digits(int(f"{tckn[:9]}{d10calc}")) % 10 | |
return (d10 == d10calc) and (d11 == d11calc) | |
def generateTCKN(amount: int = 1) -> List[str]: | |
if not isinstance(amount, int): | |
raise ValueError("amount is not an int") | |
final = [] | |
for _ in range(amount): | |
rnd = __secure_rng.randrange(100_000_000, 1_000_000_000) | |
final.append(__generate_tckn_from_seed(rnd)) | |
return final |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment