import click from flask_security.changeable import admin_change_password from sqlalchemy import select from advlabdb import create_app from advlabdb.model_independent_funs import randomPassword from advlabdb.models import Admin, User, db def _reset_admin_password(manage): click.echo("This script will generate a new random password for a chosen admin.\n") app = create_app(create_for_server=False) with app.app_context(), db.session.begin(): admins = db.session.scalars(select(Admin).join(User).where(User.active is True)).all() activate_user = False if len(admins) == 0: click.echo("There is no admin with an active user. The user of the chosen admin will be activated.") admins = db.session.scalars(select(Admin)).all() activate_user = True num_admins = len(admins) prompt = "Admins:\n" for ind, admin in enumerate(admins): user = admin.user prompt += f"[{ind}] {user.first_name} {user.last_name}: {user.email}\n" prompt += f"Enter number [0-{num_admins - 1}]" admin_index = click.prompt( prompt, type=click.IntRange(0, num_admins - 1), ) chosen_admin_user = admins[admin_index].user new_password = randomPassword() admin_change_password( chosen_admin_user, new_password, notify=False ) # Password is automatically hashed with this function if activate_user: chosen_admin_user.active = True manage.box(f"New password: {new_password}") click.echo(click.style("Done!", fg="green"))