class AddUserBuilder(Builder): def __init__(self, config: Config): self.client = TenantClient(api_host=config.credentials.api_host, auth_token=config.credentials.auth_token, target_org=config.org.id) self.email = None def from_user(self) -> 'AddUserBuilder': try: self.email = self._from_user() except KeyboardInterrupt: pass return self def _from_user(self) -> str: return self.get_input("Email", required=True) def build(self) -> Optional[str]: if self.email: email = self.client.add_user(self.email) print("User added to org") return email return None
class OrgBuilder(Builder): def __init__(self, credentials: ApiCredentials): self.client = TenantClient(api_host=credentials.api_host, auth_token=credentials.auth_token) self.org_name = None def from_user(self) -> 'OrgBuilder': try: self.org_name = self._from_user() except KeyboardInterrupt: print() return self def _from_user(self) -> str: org_name = self.get_input("Org Name") return org_name def build(self) -> Optional[CreateOrganizationResponse]: if self.org_name: org = self.client.org_create(self.org_name) print(f"Created org {org.org_name} (id: {org.org_id})") return org return None
class _RolesCmd(CommandWithList): '''Roles - manage and interact with roles''' def __init__(self, config: Config, user: User): super().__init__() self.config = config self.user = user self.client = TenantClient( config.credentials.api_host, config.credentials.auth_token, target_org=config.org.id) def get_things(self): return sorted(self.client.roles(), key=lambda x: x.name) def things_header(self): return [("Name", 20), ("Description", 40), ("Active", 6)] def format_thing(self, role: Role) -> str: enabled = "●" if role.name in self.user.roles else '' return f"{role.name.rjust(20)} {role.description.rjust(40)} {colorama.Fore.RED}{enabled.center(6)}{colorama.Style.RESET_ALL}" @builder.empty_cmd() def _do_list(self): '''list org roles''' return self._list() @builder.cmd(permissions=['admin:roles:read', 'tenant:roles:read', 'roles:read']) def do_info(self, idx): '''show role details''' selected: Role = self.get_thing_by_index(self.arg_as_idx(idx)) pprint(selected.as_dict()) @builder.cmd(permissions=['org:user:write']) def do_add(self, idx): '''add role to user''' selected: Role = self.get_thing_by_index(self.arg_as_idx(idx)) self.client.user_add_role(self.user.email, selected.name) print(f"Added {selected.name}") self.user = self.client.get_user(self.user.email) @builder.cmd(permissions=['org:user:write']) def do_del(self, idx): '''remove role from user''' selected: Role = self.get_thing_by_index(self.arg_as_idx(idx)) self.client.user_delete_role(self.user.email, selected.name) print(f"Removed {selected.name}") self.user = self.client.get_user(self.user.email)
def __init__(self, config: Config): super().__init__() self.config = config self.client = TenantClient(config.credentials.api_host, config.credentials.auth_token, target_org=config.org.id)
class _UsersCmd(CommandWithList): '''Users - manage and interact with users''' def __init__(self, config: Config): super().__init__() self.config = config self.client = TenantClient(config.credentials.api_host, config.credentials.auth_token, target_org=config.org.id) def default(self, line: str) -> Union[bool, CmdResponse]: try: idx = int(line) return self._do_select(idx) except IndexError as e: print(str(e)) return False except ValueError: pass return super().default(line) @builder.empty_cmd() def _do_select(self, idx: int) -> CmdResponse: '''change scope into user [idx]''' selected = self.get_thing_by_index(idx) return NewScopeResponse(UserScope(self.config, selected)) def get_things(self): return sorted(self.client.list_users(), key=lambda x: x.name) def things_header(self): return [("Name", 20), ("Email", 30)] def format_thing(self, user: User) -> str: return f"{user.nickname.rjust(20)} {user.email.rjust(30)}" @builder.empty_cmd() def _do_list(self): '''list org users''' return self._list() @builder.cmd(permissions=['org:user:read']) def do_info(self, idx): '''show user details''' selected: User = self.get_thing_by_index(self.arg_as_idx(idx)) pprint(selected.as_dict()) @builder.cmd(permissions=['org:user:write']) def do_add(self, _arg): '''add user to org''' AddUserBuilder(self.config).from_user().build() @builder.cmd(permissions=['org:user:delete']) def do_del(self, idx): '''remove user from org''' selected: User = self.get_thing_by_index(self.arg_as_idx(idx)) if Builder.get_yes_no( f"Really remove user from {self.config.org.org_name}?", default_yes=False): self.client.delete_user(selected.email)
def __init__(self, credentials: ApiCredentials): super().__init__() self.credentials = credentials self.client = TenantClient(credentials.api_host, credentials.auth_token)
class _OrgsCmd(CommandWithList): '''Orgs - manage and interact with organizations and their configurations''' def __init__(self, credentials: ApiCredentials): super().__init__() self.credentials = credentials self.client = TenantClient(credentials.api_host, credentials.auth_token) def default(self, line: str) -> Union[bool, CmdResponse]: try: idx = int(line) return self._do_select(idx) except IndexError as e: print(str(e)) return False except ValueError: pass return super().default(line) def things_header(self): return [("Org", 32), ("Id", 40)] def get_things(self): return sorted(self.client.org_list(), key=lambda x: x.org_name) def format_thing(self, org: Organization) -> str: return f"{org.org_name.rjust(32)} {org.id.rjust(40)}" @builder.empty_cmd() def _do_list(self): '''list available orgs''' return self._list() @builder.empty_cmd() def _do_select(self, idx: int) -> Union[bool, CmdResponse]: '''change scope into org [idx]''' selected = self.get_thing_by_index(idx) return NewScopeResponse( OrgScope(Config(credentials=self.credentials, org=selected))) @builder.cmd(permissions=['admin:orgs:write', 'tenant:orgs:write']) def do_add(self, _arg): '''add new org''' org = OrgBuilder(credentials=self.credentials).from_user().build() @builder.cmd(permissions=['admin:orgs:delete', 'tenant:orgs:delete']) def do_del(self, idx): '''delete org [idx]''' selected: Organization = self.get_thing_by_index( self.arg_as_idx(idx)) assert selected.id if Builder.get_yes_no(f"Really delete {selected.org_name}?", default_yes=False): self.client.org_delete(selected.id) print(f"Deleted {selected.org_name}") @builder.cmd(permissions=['admin:orgs:account', 'orgs:account']) def do_token(self, idx): '''get service account token for [idx]''' selected: Organization = self.get_thing_by_index( self.arg_as_idx(idx)) assert selected.id print(self.client.svc_token(selected.id)) @builder.cmd(permissions=['admin:orgs:read', 'orgs:my:read']) def do_info(self, idx: int): '''retrieve organization details''' selected = self.get_thing_by_index(self.arg_as_idx(idx)) pprint(selected.as_dict())
def __init__(self, config: Config): self.client = TenantClient(api_host=config.credentials.api_host, auth_token=config.credentials.auth_token, target_org=config.org.id) self.email = None
def __init__(self, credentials: ApiCredentials): self.client = TenantClient(api_host=credentials.api_host, auth_token=credentials.auth_token) self.org_name = None