from email_validator import validate_email from flask_security import hash_password from ... import app, db, user_datastore from ...model_independent_funs import randomPassword from ...models import MAX_YEAR, MIN_YEAR, Admin, Semester from ..terminal_utils import box, confirm, validating_input def main(): print("\n") 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 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", options=("SS", "WS"), format_function=lambda ans: ans.upper(), ) 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(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 = validating_input( "Enter the admin's email address", format_function=lambda ans: validate_email(ans).email, ) 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, active_semester=semester, ) admin = Admin(user=admin_user) db.session.add(admin) box(admin_password, "Admin password") print("Done database initialization!") if __name__ == "__main__": main()