ScoDoc/scodoc.py

169 lines
4.2 KiB
Python
Executable File

# -*- coding: UTF-8 -*
"""Application Flask: ScoDoc
"""
from __future__ import print_function
import os
from pprint import pprint as pp
import sys
import click
import flask
from flask.cli import with_appcontext
from app import create_app, cli, db
from app.auth.models import User, Role, UserRole
from app.views import notes, scolar, absences
from config import Config
app = create_app()
cli.register(app)
@app.shell_context_processor
def make_shell_context():
return {
"db": db,
"User": User,
"Role": Role,
"UserRole": UserRole,
"notes": notes,
"scolar": scolar,
"pp": pp,
"flask": flask,
"current_app": flask.current_app,
}
@app.cli.command()
def user_db_init():
"""Initialize the users database."""
click.echo("Init the db")
# Create roles:
Role.insert_roles()
click.echo("created initial roles")
# Ensure that admin exists
if Config.SCODOC_ADMIN_MAIL:
admin_username = Config.SCODOC_ADMIN_LOGIN
user = User.query.filter_by(username=admin_username).first()
if not user:
user = User(username=admin_username, email=Config.SCODOC_ADMIN_MAIL)
db.session.add(user)
db.session.commit()
click.echo(
"created initial admin user, login: {u.username}, email: {u.email}".format(
u=user
)
)
@app.cli.command()
def user_db_clear():
"""Erase (drop) all tables of users database !"""
click.echo("Erasing the users database !")
_clear_users_db()
def _clear_users_db():
"""Erase (drop) all tables of users database !"""
click.confirm("This will erase all users.\nDo you want to continue?", abort=True)
db.reflect()
db.drop_all()
db.session.commit()
@app.cli.command()
@click.argument("username")
@click.argument("role")
@click.argument("dept")
def user_create(username, role, dept):
"Create a new user"
r = Role.get_named_role(role)
if not r:
sys.stderr.write("user_create: role {r} does not exists".format(r=r))
return 1
u = User.query.filter_by(username=username).first()
if u:
sys.stderr.write("user_create: user {u} already exists".format(u=u))
return 2
u = User(username=username)
u.add_role(r, dept)
db.session.add(u)
db.session.commit()
click.echo(
"created user, login: {u.username}, with role {r} in dept. {dept}".format(
u=u, r=r, dept=dept
)
)
@app.cli.command()
@click.argument("username")
@click.password_option()
def user_password(username, password=None):
"Set (or change) user's password"
if not password:
sys.stderr.write("user_password: missing password")
return 1
u = User.query.filter_by(username=username).first()
if not u:
sys.stderr.write("user_password: user {} does not exists".format(username))
return 1
u.set_password(password)
db.session.add(u)
db.session.commit()
click.echo("changed password for user {}".format(u))
@app.cli.command()
@click.argument("dept")
def sco_delete_dept(dept):
"Delete existing departement"
if os.getuid() != 0:
sys.stderr.write("sco_delete_dept: must be run by root\n")
return 1
if os.system('cd config; ./delete_dept.sh -n "{}"'.format(dept)):
sys.stderr.write("error deleting dept " + dept)
return 1
return 0
@app.cli.command()
@click.argument("dept")
def sco_create_dept(dept):
"Create new departement"
if os.getuid() != 0:
sys.stderr.write("sco_create_dept: must be run by root\n")
return 1
if os.system('cd config; ./create_dept.sh -n "{}"'.format(dept)):
sys.stderr.write("error deleting dept " + dept)
return 1
return 0
@app.cli.command()
@click.argument("filename")
@with_appcontext
def test_interactive(filename=None):
"Run interactive test"
import flask_login
from app import decorators
click.echo("Executing {}".format(filename))
with app.test_request_context(""):
u = User.query.first()
flask_login.login_user(u)
REQUEST = decorators.ZRequest()
exec(open(filename).read())
click.echo("Done.")