diff --git a/france/france_rsvp/codes.py b/france/france_rsvp/codes.py new file mode 100644 index 0000000..e3759fb --- /dev/null +++ b/france/france_rsvp/codes.py @@ -0,0 +1,56 @@ +import logging +import random +import sys + +from .database import get_db + + +ALPHABET = '0123456789bcdefghjkmnpqrstuvwxyz' +assert len(ALPHABET) == 32 + +LENGTH = 4 + + +def list_errors(code): + for place in range(LENGTH): + for replacement in ALPHABET: + if replacement == code[place]: + continue + new_code = code[:place] + replacement + code[place + 1:] + yield new_code + + +def main(): + logging.basicConfig(level=logging.INFO) + + if len(sys.argv) <= 1: + number = 1 + elif len(sys.argv) == 2: + number = int(sys.argv[1], 10) + else: + raise ValueError + + # Get the current codes + with get_db() as db: + correct_codes = set(row[0] for row in db.execute( + '''\ + SELECT code FROM families; + ''', + )) + + # Augment them with possible errored codes + errored_codes = set() + for code in correct_codes: + errored_codes.update(list_errors(code)) + assert len(errored_codes) == LENGTH * (len(ALPHABET) - 1) * len(correct_codes) + + # Generate new codes + generated = 0 + while generated < number: + code = ''.join(random.choice(ALPHABET) for _ in range(LENGTH)) + if code in correct_codes or code in errored_codes: + continue + correct_codes.add(code) + errored_codes.update(list_errors(code)) + print(code) + generated += 1 diff --git a/france/pyproject.toml b/france/pyproject.toml index f3e1117..b5169c6 100644 --- a/france/pyproject.toml +++ b/france/pyproject.toml @@ -15,6 +15,9 @@ uwsgi = ["uWSGI"] [tool.poetry.dev-dependencies] +[tool.poetry.scripts] +generate-codes = "france_rsvp.codes:main" + [build-system] requires = ["poetry-core>=1.0.0"] build-backend = "poetry.core.masonry.api" diff --git a/france/test-data.sql b/france/test-data.sql index fc9582f..26e3db9 100644 --- a/france/test-data.sql +++ b/france/test-data.sql @@ -1,9 +1,9 @@ INSERT INTO families(code, name) VALUES - ('aaaa', 'one'), - ('bbbb', 'two'), - ('cccc', 'three'); + ('bbbb', 'one'), + ('cccc', 'two'), + ('dddd', 'three'); INSERT INTO replies(family_code, date, adults, children) VALUES - ('aaaa', '2022-05-10 20:37:39', 2, 0), - ('aaaa', '2022-05-10 23:55:55', 0, 0), - ('bbbb', '2022-05-10 20:22:11', 2, 1); + ('bbbb', '2022-05-10 20:37:39', 2, 0), + ('bbbb', '2022-05-10 23:55:55', 0, 0), + ('cccc', '2022-05-10 20:22:11', 2, 1);