Skip to content
Snippets Groups Projects
app.py 2.42 KiB
Newer Older
import logging
Barbora Kompišová's avatar
Barbora Kompišová committed
import click

from flask import Flask
Barbora Kompišová's avatar
Barbora Kompišová committed
from flask.cli import AppGroup, run_command

from management import data
from management.data import shared
Barbora Kompišová's avatar
Barbora Kompišová committed
from portal import create_app, db
from portal.service import general
from portal.service.general import find_user

log = logging.getLogger(__name__)

Barbora Kompišová's avatar
Barbora Kompišová committed
data_cli = AppGroup('data', help='Sample data initialization')
users_cli = AppGroup('users', help='Users management')
devel_cli = AppGroup('devel', help='Development options')
Barbora Kompišová's avatar
Barbora Kompišová committed
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")
Barbora Kompišová's avatar
Barbora Kompišová committed
    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):
Barbora Kompišová's avatar
Barbora Kompišová committed
    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):
Barbora Kompišová's avatar
Barbora Kompišová committed
    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}")


Barbora Kompišová's avatar
Barbora Kompišová committed
@devel_cli.command('run')
@click.option('-p', '--port', default=8000)
Barbora Kompišová's avatar
Barbora Kompišová committed
@click.pass_context
def cli_run_devel(ctx, port):
Barbora Kompišová's avatar
Barbora Kompišová committed
    db.drop_all(app=app)
    db.create_all(app=app)
    data.init_data(app, db)
    ctx.forward(run_command, port)
Barbora Kompišová's avatar
Barbora Kompišová committed


if __name__ == '__main__':
    cli_run_devel()