e56c01c36e828087185f70759548340d46bda4d3
[releng.git] / utils / test / result_collection_api / resources / project_handlers.py
1 from tornado_swagger_ui.tornado_swagger import swagger
2 from handlers import GenericApiHandler
3 from common.constants import HTTP_FORBIDDEN
4 from project_models import Project
5
6
7 class GenericProjectHandler(GenericApiHandler):
8     def __init__(self, application, request, **kwargs):
9         super(GenericProjectHandler, self).__init__(application,
10                                                     request,
11                                                     **kwargs)
12         self.table = 'projects'
13         self.table_cls = Project
14
15
16 class ProjectCLHandler(GenericProjectHandler):
17     @swagger.operation(nickname="list-all")
18     def get(self):
19         """
20             @description: list all projects
21             @return 200: return all projects, empty list is no project exist
22             @rtype: L{Projects}
23         """
24         self._list()
25
26     @swagger.operation(nickname="create")
27     def post(self):
28         """
29             @description: create a project
30             @param body: project to be created
31             @type body: L{ProjectCreateRequest}
32             @in body: body
33             @rtype: L{Project}
34             @return 200: project is created.
35             @raise 403: project already exists
36             @raise 400: post without body
37         """
38         def query(data):
39             return {'name': data.name}
40
41         def error(data):
42             message = '{} already exists as a project'.format(data.name)
43             return HTTP_FORBIDDEN, message
44
45         db_check = [(self.table, False, query, error)]
46         self._create(db_check)
47
48
49 class ProjectGURHandler(GenericProjectHandler):
50     @swagger.operation(nickname='get-one')
51     def get(self, project_name):
52         """
53             @description: get a single project by project_name
54             @rtype: L{Project}
55             @return 200: project exist
56             @raise 404: project not exist
57         """
58         self._get_one({'name': project_name})
59
60     @swagger.operation(nickname="update")
61     def put(self, project_name):
62         """
63             @description: update a single project by project_name
64             @param body: project to be updated
65             @type body: L{ProjectUpdateRequest}
66             @in body: body
67             @rtype: L{Project}
68             @return 200: update success
69             @raise 404: project not exist
70             @raise 403: new project name already exist or nothing to update
71         """
72         query = {'name': project_name}
73         db_keys = ['name']
74         self._update(query, db_keys)
75
76     @swagger.operation(nickname='delete')
77     def delete(self, project_name):
78         """
79             @description: delete a project by project_name
80             @return 200: delete success
81             @raise 404: project not exist
82         """
83         self._delete({'name': project_name})