From 7c9493facc52c8837bf9addbc83e8adb2cbae135 Mon Sep 17 00:00:00 2001 From: Mo8it Date: Sat, 7 May 2022 23:54:12 +0200 Subject: [PATCH] Done init_db script --- init_db.py | 129 ++++++++++++++++++++++++++++++----------------------- 1 file changed, 74 insertions(+), 55 deletions(-) diff --git a/init_db.py b/init_db.py index 8e0c875..462cffc 100644 --- a/init_db.py +++ b/init_db.py @@ -1,6 +1,7 @@ import sys from pathlib import Path +from email_validator import validate_email from flask_security import hash_password from advlabdb import app, db, user_datastore @@ -14,43 +15,53 @@ sys.path.insert(0, str(scripts_dir)) from shared import box -def validating_input(prompt, options): - prompt += " [" - for opt in options[:-1]: - prompt += opt + "/" +def validating_input( + prompt, + options=None, + format_function=lambda ans: ans, + check_constraints_function=lambda ans: True, +): + if options is not None: + prompt += " [" - prompt += options[-1] + "]: " + for opt in options[:-1]: + prompt += opt + "/" - lowered_options = [opt.lower() for opt in options] + prompt += options[-1] + "]: " - ans = input(prompt).lower() - while ans not in lowered_options: - print("Invalid input!") - ans = input(prompt).lower() + lowered_options = [opt.lower() for opt in options] - return ans + def adj_check_constraints_function(ans): + return ans.lower() in lowered_options and check_constraints_function(ans) + else: + prompt += ": " + adj_check_constraints_function = check_constraints_function -def validating_formatting_input(prompt, format_function, check_constraints_function): ans = None first_run = True - while ans is None or not check_constraints_function(ans): + while ans is None or not adj_check_constraints_function(ans): if not first_run: print("Invalid input!") else: first_run = False + ans = input(prompt) try: - ans = format_function(input(prompt)) + ans = format_function(ans) except Exception as ex: - pass + ans = None return ans def confirm(prompt): - ans = validating_input(prompt, ("y", "n")) + ans = validating_input( + prompt, + options=("y", "n"), + format_function=lambda ans: ans.lower(), + ) if ans == "y": return True @@ -65,58 +76,66 @@ def main(): print("Aborted!") return - # Delete old database - db.drop_all() - # Create new database - db.create_all() + with app.app_context(): + with db.session.begin(): + # Delete old database + db.drop_all() + # Create new database + db.create_all() - semester_label = validating_input("Enter the label of the current semester", ("SS", "WS")) + semester_label = validating_input( + "Enter the label of the current semester", + options=("SS", "WS"), + format_function=lambda ans: ans.upper(), + ) - semester_year = validating_formatting_input( - "Enter the year of the current semester:", - lambda n_str: int(n_str), - lambda n: MIN_YEAR <= n <= MAX_YEAR, - ) + semester_year = validating_input( + f"Enter the year of the current semester (between {MIN_YEAR} and {MAX_YEAR})", + format_function=lambda n_str: int(n_str), + check_constraints_function=lambda n: MIN_YEAR <= n <= MAX_YEAR, + ) - semester = Semester.customInit(label=semester_label, year=semester_year) + semester = Semester.customInit(label=semester_label, year=semester_year) - db.session.add(semester) + db.session.add(semester) - adminRole = user_datastore.create_role(name="admin") - assistantRole = user_datastore.create_role(name="assistant") + adminRole = user_datastore.create_role(name="admin") + assistantRole = user_datastore.create_role(name="assistant") - box("The first admin account will now be created") + box("The first admin account will now be created") - admin_email = input("Enter the admin's email address: ") - admin_first_name = input("Enter the admin's first name: ") - admin_last_name = input("Enter the admin's last name: ") - admin_phone_number = input("Enter the admin's phone number (optional): ") - admin_mobile_phone_number = input("Enter the admin's mobile phone number (optional): ") - admin_building = input("Enter the admin's building (optional): ") - admin_room = input("Enter the admin's room (optional): ") + admin_email = validating_input( + "Enter the admin's email address", + format_function=lambda ans: validate_email(ans).email, + ) - admin_password = randomPassword() - admin_hashed_password = hash_password(admin_password) + admin_first_name = input("Enter the admin's first name: ") + admin_last_name = input("Enter the admin's last name: ") + admin_phone_number = input("Enter the admin's phone number (optional): ") + admin_mobile_phone_number = input("Enter the admin's mobile phone number (optional): ") + admin_building = input("Enter the admin's building (optional): ") + admin_room = input("Enter the admin's room (optional): ") - admin_user = user_datastore.create_user( - email=admin_email.strip(), - password=admin_hashed_password, - roles=[adminRole], - first_name=admin_first_name.strip(), - last_name=admin_last_name.strip(), - phone_number=admin_phone_number.strip() or None, - mobile_phone_number=admin_mobile_phone_number.strip() or None, - building=admin_building.strip() or None, - room=admin_room.strip() or None, - ) + admin_password = randomPassword() + admin_hashed_password = hash_password(admin_password) - admin = Admin(user=admin_user) + admin_user = user_datastore.create_user( + email=admin_email.strip(), + password=admin_hashed_password, + roles=[adminRole], + first_name=admin_first_name.strip(), + last_name=admin_last_name.strip(), + phone_number=admin_phone_number.strip() or None, + mobile_phone_number=admin_mobile_phone_number.strip() or None, + building=admin_building.strip() or None, + room=admin_room.strip() or None, + ) - db.session.add(admin) + admin = Admin(user=admin_user) - db.session.commit() + db.session.add(admin) - box("Admin password:", admin_password) + box(admin_password, "Admin password") print("Done! Successfull database initialization.")