modular_api_cli/modular_cli_group/user.py (175 lines of code) (raw):

import click from modular_api.helpers.constants import ( MODULAR_USER_META_TYPES, ALLOWED_VALUES, ) from modular_api.services import SERVICE_PROVIDER from modular_api_cli.modular_handler.user_handler import UserHandler from modular_api.helpers.decorators import ( BaseCommand, ResponseDecorator, produce_audit, ) @click.group() def user(): """ Manages users that can submit request to server """ def user_handler_instance(): return UserHandler( user_service=SERVICE_PROVIDER.user_service, group_service=SERVICE_PROVIDER.group_service, policy_service=SERVICE_PROVIDER.policy_service ) @user.command(cls=BaseCommand) @click.option('--username', '-u', type=str, required=True, help='Username that will be added to trusted users') @click.option('--group', '-g', type=str, required=True, multiple=True, help='Group name(s) that will be attached to user') @click.option('--password', '-p', type=str, required=False, help='Password that will be attached to user. In case password ' 'is not provided, it will be generated automatically.') @ResponseDecorator(click.echo, 'Can not add user') @produce_audit(secured_params=['password']) def add(username, group, password): """ Add user to white list """ return user_handler_instance().add_user_handler( username=username, groups=group, password=password) @user.command(cls=BaseCommand) @click.option('--username', '-u', type=str, required=True, help='Username that will be deleted from white list') @ResponseDecorator(click.echo, 'Can not delete user') @produce_audit() def delete(username): """ Deletes user from white list """ return user_handler_instance().delete_user_handler(username=username) @user.command(cls=BaseCommand) @click.option('--username', '-u', type=str, help='Username', required=True) @click.option('--reason', '-rsn', required=True, help='The textual reason of user blocking') @ResponseDecorator(click.echo, 'Can not block user') @produce_audit() def block(username, reason): """ Sets user`s state to "blocked" """ return user_handler_instance().block_user_handler(username=username, reason=reason) @user.command(cls=BaseCommand) @click.option('--username', '-u', type=str, help='Username', required=True) @click.option('--reason', '-rsn', required=True, help='The textual reason of user unblocking') @ResponseDecorator(click.echo, 'Can not block user') @produce_audit() def unblock(username, reason): """ Resets user`s state from blocked """ return user_handler_instance().unblock_user_handler(username=username, reason=reason) @user.command(cls=BaseCommand, name='change_password') @click.option('--username', '-u', type=str, help='Username', required=True) @click.option('--password', '-pwd', type=str, help='New user password', required=True) @ResponseDecorator(click.echo, 'Can not change user password') @produce_audit(secured_params=['password']) def change_password(username, password): """ Changes user`s password """ return user_handler_instance().change_user_password_handler( username=username, password=password ) @user.command(cls=BaseCommand, name='change_username') @click.option('--old_username', '-ou', type=str, help='Current Username', required=True) @click.option('--new_username', '-nu', type=str, help='Username to set', required=True) @ResponseDecorator(click.echo, 'Can not change user name') @produce_audit(secured_params=['password']) def change_username(old_username, new_username): """ Changes user's name """ return user_handler_instance().change_user_name_handler( old_username=old_username, new_username=new_username ) @user.command(cls=BaseCommand, name='add_to_group') @click.option('--username', '-u', type=str, help='Username', required=True) @click.option('--group', '-g', type=str, multiple=True, help='Group name(s) that will be attached to user') @ResponseDecorator(click.echo, 'Can not update user') @produce_audit() def add_to_group(username, group): """ Adds group(s) to the user """ return user_handler_instance().manage_user_groups_handler( username=username, groups=group, action='add' ) @user.command(cls=BaseCommand, name='remove_from_group') @click.option('--username', '-u', type=str, help='Username', required=True) @click.option('--group', '-g', type=str, multiple=True, help='Group name(s) that will be detached from user') @ResponseDecorator(click.echo, 'Can not update user') @produce_audit() def remove_from_group(username, group): """ Removes group(s) from the user """ return user_handler_instance().manage_user_groups_handler( username=username, groups=group, action='remove' ) @user.command(cls=BaseCommand, name='describe') @click.option('--username', '-u', type=str, help='Username. If not specified - all existing users will ' 'be listed') @ResponseDecorator(click.echo, 'Can not describe user') def describe(username): """ Describes user(s) information """ return user_handler_instance().describe_user_handler(username=username) @user.command(cls=BaseCommand, name='set_meta_attribute') @click.option('--username', '-u', type=str, required=True, help='Username') @click.option('--meta_type', '-mt', default=ALLOWED_VALUES, type=click.Choice(MODULAR_USER_META_TYPES, False), help='Type of meta. Supports two types: "allowed_values": ' 'restricts the parameters allowed for the user (Default). ' '"aux_data": stores additional private user data for ' 'customized usage.') @click.option('--key', '-k', type=str, required=True, help='Parameter name') @click.option('--value', '-v', type=str, required=False, multiple=True, help='Parameter value. Multiple values allowed (e.g. ' '--value value1 --value value2).') @click.option('--value_as_json', '-vj', type=str, required=False, help='Parameter value as json (e.g. {"k": "v"} or ["v1", "v2"]).') @ResponseDecorator(click.echo, 'Can not set user meta') def set_meta_attribute(username, meta_type, key, value, value_as_json): """ Add or replace Modular user meta information. """ return user_handler_instance().set_user_meta_handler( username=username, meta_type=meta_type, key=key, values=value, value_as_json=value_as_json, ) @user.command(cls=BaseCommand, name='update_meta_attribute') @click.option('--username', '-u', type=str, required=True, help='User name') @click.option('--meta_type', '-mt', default=ALLOWED_VALUES, type=click.Choice(MODULAR_USER_META_TYPES, False), help='Type of meta. Supports two types: "allowed_values": ' 'restricts the parameters allowed for the user (Default). ' '"aux_data": stores additional private user data for ' 'customized usage.') @click.option('--key', '-k', type=str, required=True, help='Parameter name') @click.option('--value', '-v', type=str, multiple=True, help='Parameter value. Multiple values allowed (e.g. ' '--value value1 --value value2).') @click.option('--value_as_json', '-vj', type=str, required=False, help='Parameter value as json (e.g. {"k": "v"} or ["v1", "v2"]).') @ResponseDecorator(click.echo, 'Can not update user meta') def update_meta_attribute(username, meta_type, key, value, value_as_json): """ Update Modular user meta information. """ return user_handler_instance().update_user_meta_handler( username=username, meta_type=meta_type, key=key, values=value, value_as_json=value_as_json, ) @user.command(cls=BaseCommand, name='delete_meta_attribute') @click.option('--username', '-u', type=str, required=True, help='User name') @click.option('--meta_type', '-mt', default=ALLOWED_VALUES, type=click.Choice(MODULAR_USER_META_TYPES, False), help='Type of meta. Supports two types: "allowed_values": ' 'restricts the parameters allowed for the user (Default). ' '"aux_data": stores additional private user data for ' 'customized usage.') @click.option('--key', '-k', type=str, required=True, multiple=True, help='Parameter name. Multiple values allowed (e.g. ' '--key value1 --key value2).') @ResponseDecorator(click.echo, 'Can not delete user meta') def delete_meta_attribute(username, meta_type, key): """ Delete parameter/s name from the user meta information """ return user_handler_instance().delete_user_meta_handler( username=username, meta_type=meta_type, keys=key, ) @user.command(cls=BaseCommand, name='reset_meta') @click.option('--username', '-u', type=str, required=True, help='User name') @ResponseDecorator(click.echo, 'Can not reset user meta') def reset_meta(username): """ Erase all meta information from the user item """ return user_handler_instance().reset_user_meta_handler( username=username) @user.command(cls=BaseCommand, name='get_meta') @click.option('--username', '-u', type=str, required=True, help='User name') @ResponseDecorator(click.echo, 'Can not describe user meta') def get_meta(username): """ Describe meta information for the specified user """ return user_handler_instance().describe_user_meta_handler(username=username)