def api_get_user(username): """API enpoint to return user info""" users = self.manager.get_users() if username not in users: self._raise_error(404, 'No such user') user = users[username] # assemble space usage total = self.manager.get_size_allotment(username) used = self.manager.get_size_usage(username) user['space_utilization'] = { 'total': total, 'used': used, 'available': total - used, } user_data, err = UserSchema(exclude=('username', )).load(user) colls = self.manager.get_collections(username, include_recs=True, api=True) for coll in colls: for rec in coll['recordings']: rec['pages'] = self.manager.list_pages( username, coll['id'], rec['id']) # colls is a list so will always be `many` even if one collection collections, err = CollectionSchema().load(colls, many=True) user_data['collections'] = collections return {'user': user_data}
def api_update_user(username): """API enpoint to update user info See `UserUpdateSchema` for available fields. ** bottle 0.12.9 doesn't support `PATCH` methods.. update to patch once availabile. """ users = self.manager.get_users() available_roles = [x for x in self.manager.cork._store.roles] if username not in users: self._raise_error(404, 'No such user') # if not admin, check ownership if not self.manager.is_anon( username) and not self.manager.is_superuser(): self.manager.assert_user_is_owner(username) user = users[username] try: json_data = json.loads(request.forms.json) except Exception as e: print(e) return {'errors': 'bad json data'} if len(json_data.keys()) == 0: return {'errors': 'empty payload'} data, err = UserUpdateSchema(only=json_data.keys()).load(json_data) if 'role' in data and data['role'] not in available_roles: err.update({'role': 'Not a valid choice.'}) if len(err): return {'errors': err} if 'name' in data: user['desc'] = '{{"name":"{name}"}}'.format( name=data.get('name', '')) # # restricted resources # if 'max_size' in data and self.manager.is_superuser(): key = self.manager.user_key.format(user=username) max_size = float(data['max_size']) # convert GB to bytes max_size = int(max_size * 1000000000) with redis.utils.pipeline(self.manager.redis) as pi: pi.hset(key, 'max_size', max_size) if 'role' in data and self.manager.is_superuser(): # set new role or default to base role user['role'] = data['role'] # # return updated user data # total = self.manager.get_size_allotment(username) used = self.manager.get_size_usage(username) user['space_utilization'] = { 'total': total, 'used': used, 'available': total - used, } user_data, err = UserSchema(exclude=('username', )).load(user) colls = self.manager.get_collections(username, include_recs=True, api=True) for coll in colls: for rec in coll['recordings']: rec['pages'] = self.manager.list_pages( username, coll['id'], rec['id']) # colls is a list so will always be `many` even if one collection collections, err = CollectionSchema().load(colls, many=True) user_data['collections'] = collections return {'user': user_data}