92 lines
3.4 KiB
Python
92 lines
3.4 KiB
Python
import click
|
|
import sqlalchemy.exc
|
|
from flask.cli import with_appcontext
|
|
from werkzeug.exceptions import NotFound
|
|
|
|
from flaschengeist import logger
|
|
from flaschengeist.database import db
|
|
from flaschengeist.controller import roleController, userController
|
|
|
|
|
|
USER_KEY = f"{__name__}.user"
|
|
|
|
|
|
def user(ctx, param, value):
|
|
if not value or ctx.resilient_parsing:
|
|
return
|
|
|
|
click.echo("Adding new user")
|
|
ctx.meta[USER_KEY] = {}
|
|
try:
|
|
ctx.meta[USER_KEY]["userid"] = click.prompt("userid", type=str)
|
|
ctx.meta[USER_KEY]["firstname"] = click.prompt("firstname", type=str)
|
|
ctx.meta[USER_KEY]["lastname"] = click.prompt("lastname", type=str)
|
|
ctx.meta[USER_KEY]["display_name"] = click.prompt("displayed name", type=str, default="")
|
|
ctx.meta[USER_KEY]["mail"] = click.prompt("mail", type=str, default="")
|
|
ctx.meta[USER_KEY]["password"] = click.prompt("password", type=str, confirmation_prompt=True, hide_input=True)
|
|
ctx.meta[USER_KEY] = {k: v for k, v in ctx.meta[USER_KEY].items() if v != ""}
|
|
|
|
except click.Abort:
|
|
click.echo("\n!!! User was not added, aborted.")
|
|
del ctx.meta[USER_KEY]
|
|
|
|
|
|
@click.command()
|
|
@click.option("--create", help="Add new role", is_flag=True)
|
|
@click.option("--delete", help="Delete role", is_flag=True)
|
|
@click.option("--set-admin", is_flag=True, help="Make a role an admin role, adding all permissions", type=str)
|
|
@click.argument("role", nargs=-1, required=True, type=str)
|
|
def role(create, delete, set_admin, role):
|
|
"""Manage roles"""
|
|
ctx = click.get_current_context()
|
|
|
|
if (create and delete) or (set_admin and delete):
|
|
ctx.fail("Do not mix --delete with --create or --set-admin")
|
|
|
|
for role_name in role:
|
|
if create:
|
|
r = roleController.create_role(role_name)
|
|
else:
|
|
r = roleController.get(role_name)
|
|
if delete:
|
|
roleController.delete(r)
|
|
if set_admin:
|
|
r.permissions = roleController.get_permissions()
|
|
db.session.commit()
|
|
|
|
|
|
@click.command()
|
|
@click.option("--add-role", help="Add a role to an user", type=str)
|
|
@click.option("--create", help="Create new user interactivly", callback=user, is_flag=True, expose_value=False)
|
|
@click.option("--delete", help="Delete a user", is_flag=True)
|
|
@click.argument("user", nargs=-1, type=str)
|
|
@with_appcontext
|
|
def user(add_role, delete, user):
|
|
"""Manage users"""
|
|
from flaschengeist.database import db
|
|
|
|
ctx = click.get_current_context()
|
|
|
|
try:
|
|
if USER_KEY in ctx.meta:
|
|
userController.register(ctx.meta[USER_KEY], ctx.meta[USER_KEY]["password"])
|
|
else:
|
|
if not isinstance(user, list) or not isinstance(user, tuple):
|
|
user = [user]
|
|
for uid in user:
|
|
logger.debug(f"Userid: {uid}")
|
|
user = userController.get_user(uid)
|
|
logger.debug(f"User: {user}")
|
|
if delete:
|
|
logger.debug(f"Deleting user {user}")
|
|
userController.delete_user(user)
|
|
elif add_role:
|
|
logger.debug(f"Adding role {add_role} to user {user}")
|
|
role = roleController.get(add_role)
|
|
logger.debug(f"Role: {role}")
|
|
user.roles_.append(role)
|
|
userController.modify_user(user, None)
|
|
db.session.commit()
|
|
except NotFound:
|
|
ctx.fail(f"User not found {uid}")
|