def get_typed_account(account): if type(account) in (int, str): account = Account.get(account) acct_type = AccountType.get(account.account_type_id).account_type account_class = get_plugin_by_name(PLUGIN_NAMESPACES['accounts'], acct_type) return account_class.get(account['account_id'])
def post(self): """Create a new account""" self.reqparse.add_argument('accountName', type=str, required=True) self.reqparse.add_argument('accountType', type=str, required=True) self.reqparse.add_argument('contacts', type=dict, required=True, action='append') self.reqparse.add_argument('enabled', type=int, required=True, choices=(0, 1)) self.reqparse.add_argument('requiredGroups', type=str, action='append', default=()) self.reqparse.add_argument('properties', type=dict, required=True) args = self.reqparse.parse_args() account_class = get_plugin_by_name(PLUGIN_NAMESPACES['accounts'], args['accountType']) if not account_class: raise InquisitorError('Invalid account type: {}'.format(args['accountType'])) validate_contacts(args['contacts']) for key in ('accountName', 'accountType', 'contacts', 'enabled'): value = args[key] if type(value) == str: value = value.strip() if type(value) in (int, tuple, list, str): if not value: raise Exception('{} cannot be empty'.format(key.replace('_', ' ').title())) else: raise ValueError('Invalid type: {} for value {} for argument {}'.format(type(value), value, key)) class_properties = {from_camelcase(key): value for key, value in args['properties'].items()} for prop in account_class.class_properties: if prop['key'] not in class_properties: raise InquisitorError('Missing required property {}'.format(prop)) acct = account_class.create( account_name=args['accountName'], contacts=args['contacts'], enabled=args['enabled'], required_roles=args['requiredGroups'], properties=class_properties, auto_commit=False ) db.session.commit() # Add the newly created account to the session so we can see it right away session['accounts'].append(acct.account_id) auditlog(event='account.create', actor=session['user'].username, data=args) return self.make_response({'message': 'Account created', 'accountId': acct.account_id}, HTTP.CREATED)
def get(account): """Returns the class object identified by `account_id` Args: account (`int`, `str`): Unique ID of the account to load from database Returns: `Account` object if found, else None """ account = Account.get(account) if not account: return None acct_type = AccountType.get(account.account_type_id).account_type account_class = get_plugin_by_name(PLUGIN_NAMESPACES['accounts'], acct_type) return account_class(account)
def put(self, accountId): """Update an account""" self.reqparse.add_argument('accountName', type=str, required=True) self.reqparse.add_argument('accountType', type=str, required=True) self.reqparse.add_argument('contacts', type=dict, required=True, action='append') self.reqparse.add_argument('enabled', type=int, required=True, choices=(0, 1)) self.reqparse.add_argument('requiredRoles', type=str, action='append', default=()) self.reqparse.add_argument('properties', type=dict, required=True) args = self.reqparse.parse_args() account_class = get_plugin_by_name(PLUGIN_NAMESPACES['accounts'], args['accountType']) if not account_class: raise InquisitorError('Invalid account type: {}'.format(args['accountType'])) validate_contacts(args['contacts']) if not args['accountName'].strip(): raise Exception('You must provide an account name') if not args['contacts']: raise Exception('You must provide at least one contact') class_properties = {from_camelcase(key): value for key, value in args['properties'].items()} for prop in account_class.class_properties: if prop['key'] not in class_properties: raise InquisitorError('Missing required property {}'.format(prop)) account = account_class.get(accountId) if account.account_type != args['accountType']: raise InquisitorError('You cannot change the type of an account') account.account_name = args['accountName'] account.contacts = args['contacts'] account.enabled = args['enabled'] account.required_roles = args['requiredRoles'] account.update(**args['properties']) account.save() auditlog(event='account.update', actor=session['user'].username, data=args) return self.make_response({'message': 'Object updated', 'account': account.to_dict(is_admin=True)})
def add_test_account( self, account_type, account_name, contacts=None, enabled=True, required_groups=None, properties=None ): if not contacts: contacts = [] if not required_groups: required_groups = [] if not properties: properties = {} account_class = get_plugin_by_name(PLUGIN_NAMESPACES['accounts'], account_type) return account_class( account_class.create( account_name=account_name, contacts=contacts, enabled=enabled, required_roles=required_groups, properties=properties, auto_commit=True ) )