swagger-ize project-apis of testAPI
[releng.git] / utils / test / result_collection_api / resources / project_handlers.py
1 from tornado import gen
2 from tornado.web import HTTPError, asynchronous
3
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
8
9
10 class GenericProjectHandler(GenericApiHandler):
11     def __init__(self, application, request, **kwargs):
12         super(GenericProjectHandler, self).__init__(application,
13                                                     request,
14                                                     **kwargs)
15         self.table = 'projects'
16         self.table_cls = Project
17
18
19 class ProjectCLHandler(GenericProjectHandler):
20     @swagger.operation(nickname="list-all")
21     def get(self):
22         """
23             @description: list all projects
24             @return 200: return all projects, empty list is no project exist
25             @rtype: L{Projects}
26         """
27         self._list()
28
29     @swagger.operation(nickname="create")
30     def post(self):
31         """
32             @description: create a project
33             @param body: project to be created
34             @type body: L{ProjectCreateRequest}
35             @in body: body
36             @rtype: L{Project}
37             @return 200: project is created.
38             @raise 403: project already exists
39             @raise 400: post without body
40         """
41         self._create('{} already exists as a {}')
42
43
44 class ProjectGURHandler(GenericProjectHandler):
45     @swagger.operation(nickname='get-one')
46     def get(self, project_name):
47         """
48             @description: get a single project by project_name
49             @rtype: L{Project}
50             @return 200: project exist
51             @raise 404: project not exist
52         """
53         self._get_one({'name': project_name})
54
55     @asynchronous
56     @gen.coroutine
57     @swagger.operation(nickname="update")
58     def put(self, project_name):
59         """
60             @description: update a single project by project_name
61             @param body: project to be updated
62             @type body: L{ProjectUpdateRequest}
63             @in body: body
64             @rtype: L{Project}
65             @return 200: update success
66             @raise 404: project not exist
67             @raise 403: new project name already exist or nothing to update
68         """
69         if self.json_args is None:
70             raise HTTPError(HTTP_BAD_REQUEST)
71
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))
77
78         project = Project.from_dict(from_project)
79         new_name = self.json_args.get("name")
80         new_description = self.json_args.get("description")
81
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(
86                 {"name": new_name})
87             if to_project is not None:
88                 raise HTTPError(HTTP_FORBIDDEN,
89                                 "{} already exists as a project"
90                                 .format(new_name))
91
92         # new dict for changes
93         request = dict()
94         request = prepare_put_request(request,
95                                       "name",
96                                       new_name,
97                                       project.name)
98         request = prepare_put_request(request,
99                                       "description",
100                                       new_description,
101                                       project.description)
102
103         """ raise exception if there isn't a change """
104         if not request:
105             raise HTTPError(HTTP_FORBIDDEN, "Nothing to update")
106
107         """ we merge the whole document """
108         edit_request = project.format()
109         edit_request.update(request)
110
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})
114
115         self.finish_request(format_data(new_project, Project))
116
117     @swagger.operation(nickname='delete')
118     def delete(self, project_name):
119         """
120             @description: delete a project by project_name
121             @return 200: delete success
122             @raise 404: project not exist
123         """
124         self._delete({'name': project_name})