from flask.ext.restful import abort from endpoints.api import resource, nickname, ApiResource, log_action, related_user_resource from auth.permissions import AdministerOrganizationPermission, OrganizationMemberPermission from auth.auth_context import get_authenticated_user from data import model from util.names import format_robot_username def robot_view(name, token): return { 'name': name, 'token': token, } @resource('/v1/user/robots') class UserRobotList(ApiResource): """ Resource for listing user robots. """ @nickname('getUserRobots') def get(self): """ List the available robots for the user. """ user = get_authenticated_user() robots = model.list_entity_robots(user.username) return { 'robots': [robot_view(name, password) for name, password in robots] } @resource('/v1/user/robots/') class UserRobot(ApiResource): """ Resource for managing a user's robots. """ @nickname('createUserRobot') def put(self, robot_shortname): """ Create a new user robot with the specified name. """ parent = get_authenticated_user() robot, password = model.create_robot(robot_shortname, parent) log_action('create_robot', parent.username, {'robot': robot_shortname}) return robot_view(robot.username, password), 201 @nickname('deleteUserRobot') def delete(self, robot_shortname): """ Delete an existing robot. """ parent = get_authenticated_user() model.delete_robot(format_robot_username(parent.username, robot_shortname)) log_action('delete_robot', parent.username, {'robot': robot_shortname}) return 'Deleted', 204 @resource('/v1/organization//robots') @related_user_resource(UserRobotList) class OrgRobotList(ApiResource): """ Resource for listing an organization's robots. """ @nickname('getOrgRobots') def get(self, orgname): """ List the organization's robots. """ permission = OrganizationMemberPermission(orgname) if permission.can(): robots = model.list_entity_robots(orgname) return { 'robots': [robot_view(name, password) for name, password in robots] } abort(403) @resource('/v1/organization//robots/') @related_user_resource(UserRobot) class OrgRobot(ApiResource): """ Resource for managing an organization's robots. """ @nickname('createOrgRobot') def put(self, orgname, robot_shortname): """ Create a new robot in the organization. """ permission = AdministerOrganizationPermission(orgname) if permission.can(): parent = model.get_organization(orgname) robot, password = model.create_robot(robot_shortname, parent) resp = robot_view(robot.username, password) log_action('create_robot', orgname, {'robot': robot_shortname}) resp.status_code = 201 return resp abort(403) @nickname('deleteOrgRobot') def delete(self, orgname, robot_shortname): """ Delete an existing organization robot. """ permission = AdministerOrganizationPermission(orgname) if permission.can(): model.delete_robot(format_robot_username(orgname, robot_shortname)) log_action('delete_robot', orgname, {'robot': robot_shortname}) return 'Deleted', 204 abort(403)