From b9d5aad18d4c63c148cba32516b81b26af7a4a74 Mon Sep 17 00:00:00 2001 From: Mo8it Date: Sat, 7 May 2022 21:05:29 +0200 Subject: [PATCH] Add init_db script --- init_db.py | 125 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 125 insertions(+) create mode 100644 init_db.py diff --git a/init_db.py b/init_db.py new file mode 100644 index 0000000..8e0c875 --- /dev/null +++ b/init_db.py @@ -0,0 +1,125 @@ +import sys +from pathlib import Path + +from flask_security import hash_password + +from advlabdb import app, db, user_datastore +from advlabdb.independent_funs import randomPassword +from advlabdb.models import MAX_YEAR, MIN_YEAR, Admin, Semester + +scripts_dir = Path(__file__).parent.absolute() / "scripts" + +sys.path.insert(0, str(scripts_dir)) + +from shared import box + + +def validating_input(prompt, options): + prompt += " [" + for opt in options[:-1]: + prompt += opt + "/" + + prompt += options[-1] + "]: " + + lowered_options = [opt.lower() for opt in options] + + ans = input(prompt).lower() + while ans not in lowered_options: + print("Invalid input!") + ans = input(prompt).lower() + + return ans + + +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): + if not first_run: + print("Invalid input!") + else: + first_run = False + + try: + ans = format_function(input(prompt)) + except Exception as ex: + pass + + return ans + + +def confirm(prompt): + ans = validating_input(prompt, ("y", "n")) + + if ans == "y": + return True + else: + return False + + +def main(): + print("This script should only be used to initialize the database after setting up a server") + print("The old database will be DELETED and a new database will be created.") + if not confirm("Are you sure that you want to continue?"): + print("Aborted!") + return + + # 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_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 = Semester.customInit(label=semester_label, year=semester_year) + + db.session.add(semester) + + adminRole = user_datastore.create_role(name="admin") + assistantRole = user_datastore.create_role(name="assistant") + + 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_password = randomPassword() + admin_hashed_password = hash_password(admin_password) + + 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 = Admin(user=admin_user) + + db.session.add(admin) + + db.session.commit() + + box("Admin password:", admin_password) + + print("Done! Successfull database initialization.") + + +if __name__ == "__main__": + main()