""" Main application module - Creates instance of the flask app named app - registers commands """ import logging as logger import click from flask import Flask from flask.cli import AppGroup, run_command import portal import portal.logging as logging_config from management.data import DataManagement from portal import create_app, db logging_config.load_config() log = logger.getLogger(__name__) data_cli = AppGroup('data', help='Sample data initialization') users_cli = AppGroup('users', help='Users management') courses_cli = AppGroup('courses', help='Courses management') devel_cli = AppGroup('devel', help='Development management') submissions_cli = AppGroup('submissions', help='Submissions management') projects_cli = AppGroup('projects', help='Projects management') app: Flask = create_app() app.cli.add_command(data_cli) app.cli.add_command(users_cli) app.cli.add_command(courses_cli) app.cli.add_command(devel_cli) app.cli.add_command(submissions_cli) app.cli.add_command(projects_cli) manager = DataManagement(app, db) celery = portal.get_celery(app) @devel_cli.command('run', help='Runs the devel server with initializes db') @click.option('-p', '--port', default=8000) @click.pass_context def cli_run_devel(ctx, port): manager.reset_db() manager.create_admin_user('admin', '789789') manager.init_data() ctx.forward(run_command, port) # # Data related commands # @data_cli.command('init', help='Initializes sample data') @click.argument('env') def cli_init_data(env): log.info("[CMD] Initializing data") manager.init_data(env) # # Users related commands # @users_cli.command('create', help='Create admin user') @click.argument('name') @click.option('-p', '--password', help='Users password', prompt=True, hide_input=True, confirmation_prompt=True) def cli_users_create(name, password): log.info(f"[CMD] Create User: {name}") user = manager.create_admin_user(name, password) log.info(f"[CMD] Created User: {user}") @users_cli.command('set-password', help='Sets password for the user') @click.argument('name') @click.option('-p', '--password', help='Users password', prompt=True, hide_input=True, confirmation_prompt=True) def cli_users_set_password(name, password): log.info(f"[CMD] Update password for user: {name}") user = manager.update_users_password(name, password) log.info(f"[CMD] Updated password for user: {user}") @users_cli.command('delete', help="Deletes user") @click.argument('name') def cli_users_delete_user(name): 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 manager.delete_user(name) log.info(f"[CMD] User deleted: {name}") @users_cli.command('list', help='List all users') def cli_users_list(): log.info(f'[CMD] Listing users') manager.list_users() # # Courses related commands # @courses_cli.command('create', help="Creates course with default roles") @click.argument('name', ) def cli_course_creates(name): log.info(f"[CMD] Create Course: {name}") course = manager.create_course(name) log.info(f"[CMD] Created Course: {course}") @courses_cli.command('list', help="List courses") def cli_courses_list(): log.info(f"[CMD] List Courses") course = manager.list_courses() @courses_cli.command( 'create-role', help="Creates role by it's type in the course") @click.argument('course') @click.argument('type') @click.argument('name', required=False) def cli_course_role_creates(course, type, name=None): log.info(f"[CMD] Create Role: \"{type}\" in the \"{course}\"") course = manager.create_role(course, role_type=type, name=name) log.info(f"[CMD] Created Course: {course}") @projects_cli.command('activate', help="activates project") @click.option('-p', '--project') @click.option('-c', '--course') def cli_projects_activate(project, course): log.info(f"[CMD] Activating project: {project} in course {course}") project = manager.activate_project(course, project) log.info(f"[CMD] Project has been activated: {project}") @projects_cli.command('list', help="list projects") @click.option('-c', '--course') def cli_projects_list(course): log.info(f"[CMD] Listing projects in the course {course}") manager.list_projects(course) @submissions_cli.command('cancel-all', help="Cancel all submissions") def cli_submissions_cancel_all(): log.info(f"[CMD] Cancelling all submissions") manager.cancel_all_submissions() @submissions_cli.command('cancel', help="Cancel submission") @click.argument('sid') def cli_submissions_cancel(sid): log.info(f"[CMD] Cancelling all submissions") manager.cancel_submission(sid) @submissions_cli.command('list', help="List all submissions") def cli_submissions_list_all(): log.info(f"[CMD] List all submissions") manager.list_all_submissions() @submissions_cli.command('clean-all', help="Clean all submissions") def cli_submissions_list_all(): log.info(f"[CMD] Clean all submissions") manager.clean_all_submissions() if __name__ == '__main__': cli_run_devel()