import click from zope import component from ..utils import http_get, http_post from .utils import handle_sync_response, handle_stream_response, print_colon_kv from ceo_common.interfaces import IConfig from ceod.transactions.members import UpdateMemberPositionsTransaction @click.group(short_help='List or change exec positions') def positions(): update_commands() @positions.command(short_help='Get current positions') def get(): resp = http_get('/api/positions') result = handle_sync_response(resp) print_colon_kv(result.items()) @positions.command(short_help='Update positions') def set(**kwargs): body = {k.replace('_', '-'): v for k, v in kwargs.items()} print_body = {k: v or '' for k, v in body.items()} click.echo('The positions will be updated:') print_colon_kv(print_body.items()) click.confirm('Do you want to continue?', abort=True) resp = http_post('/api/positions', json=body) handle_stream_response(resp, UpdateMemberPositionsTransaction.operations) # Provides dynamic parameters for `set' command using config file def update_commands(): global set cfg = component.getUtility(IConfig) avail = cfg.get('positions_available') required = cfg.get('positions_required') for pos in avail: r = pos in required set = click.option(f'--{pos}', metavar='USERNAME', required=r, prompt=r)(set)