1 from tornado import gen
2 from tornado.web import HTTPError, asynchronous
4 from tornado_swagger_ui.tornado_swagger import swagger
5 from handlers import GenericApiHandler, prepare_put_request, format_data
6 from common.constants import HTTP_BAD_REQUEST, HTTP_FORBIDDEN, HTTP_NOT_FOUND
7 from project_models import Project
10 class GenericProjectHandler(GenericApiHandler):
11 def __init__(self, application, request, **kwargs):
12 super(GenericProjectHandler, self).__init__(application,
15 self.table = 'projects'
16 self.table_cls = Project
19 class ProjectCLHandler(GenericProjectHandler):
20 @swagger.operation(nickname="list-all")
23 @description: list all projects
24 @return 200: return all projects, empty list is no project exist
29 @swagger.operation(nickname="create")
32 @description: create a project
33 @param body: project to be created
34 @type body: L{ProjectCreateRequest}
37 @return 200: project is created.
38 @raise 403: project already exists
39 @raise 400: post without body
41 self._create('{} already exists as a {}')
44 class ProjectGURHandler(GenericProjectHandler):
45 @swagger.operation(nickname='get-one')
46 def get(self, project_name):
48 @description: get a single project by project_name
50 @return 200: project exist
51 @raise 404: project not exist
53 self._get_one({'name': project_name})
57 @swagger.operation(nickname="update")
58 def put(self, project_name):
60 @description: update a single project by project_name
61 @param body: project to be updated
62 @type body: L{ProjectUpdateRequest}
65 @return 200: update success
66 @raise 404: project not exist
67 @raise 403: new project name already exist or nothing to update
69 if self.json_args is None:
70 raise HTTPError(HTTP_BAD_REQUEST)
72 query = {'name': project_name}
73 from_project = yield self.db.projects.find_one(query)
74 if from_project is None:
75 raise HTTPError(HTTP_NOT_FOUND,
76 "{} could not be found".format(project_name))
78 project = Project.from_dict(from_project)
79 new_name = self.json_args.get("name")
80 new_description = self.json_args.get("description")
82 # check for payload name parameter in db
83 # avoid a request if the project name has not changed in the payload
84 if new_name != project.name:
85 to_project = yield self.db.projects.find_one(
87 if to_project is not None:
88 raise HTTPError(HTTP_FORBIDDEN,
89 "{} already exists as a project"
92 # new dict for changes
94 request = prepare_put_request(request,
98 request = prepare_put_request(request,
103 """ raise exception if there isn't a change """
105 raise HTTPError(HTTP_FORBIDDEN, "Nothing to update")
107 """ we merge the whole document """
108 edit_request = project.format()
109 edit_request.update(request)
111 """ Updating the DB """
112 yield self.db.projects.update(query, edit_request)
113 new_project = yield self.db.projects.find_one({"_id": project._id})
115 self.finish_request(format_data(new_project, Project))
117 @swagger.operation(nickname='delete')
118 def delete(self, project_name):
120 @description: delete a project by project_name
121 @return 200: delete success
122 @raise 404: project not exist
124 self._delete({'name': project_name})