import logging import click from flask import Flask from flask.cli import AppGroup, run_command from management import data from management.data import shared from portal import create_app, db from portal.service import general from portal.service.general import find_user log = logging.getLogger(__name__) data_cli = AppGroup('data', help='Sample data initialization') users_cli = AppGroup('users', help='Users management') devel_cli = AppGroup('devel', help='Development options') app: Flask = create_app() app.cli.add_command(data_cli) app.cli.add_command(users_cli) app.cli.add_command(devel_cli) @data_cli.command('init') def cli_init_data(): log.info("[CMD] Initializing data") log.debug(f"[CONFIG] DB: {app.config['SQLALCHEMY_DATABASE_URI']}") data.init_data(db=db, app=app) @users_cli.command('create') @click.argument('name') def cli_users_create(name): with app.app_context(): log.info(f"[CMD] Create user: {name}") password = click.prompt('Password', hide_input=True, confirmation_prompt=True) creator = shared.DataCreator(db) user = creator.create_user( username=name, name=name, admin=True, password=password ) db.session.commit() log.info(f"[CMD] Created user: {user}") @users_cli.command('set-password') @click.argument('name') def cli_users_set_password(name): with app.app_context(): log.info(f"[CMD] Update password for user: {name}") password = click.prompt('Password', hide_input=True, confirmation_prompt=True) user = find_user(name) user.set_password(password=password) db.session.add(user) db.session.commit() log.info(f"[CMD] Updated password for user: {user}") @users_cli.command('delete') @click.argument('name') def cli_users_set_password(name): with app.app_context(): log.info(f"[CMD] Delete user: {name}") ask: str = click.prompt('Type Y/y for confirmation', hide_input=True) if ask.lower()[0] != 'y': return user = find_user(name) general.delete_entity(user) log.info(f"[CMD] User deleted: {name}") @devel_cli.command('run') @click.option('-p', '--port', default=8000) @click.pass_context def cli_run_devel(ctx, port): db.drop_all(app=app) db.create_all(app=app) data.init_data(app, db) ctx.forward(run_command, port) if __name__ == '__main__': cli_run_devel()