0bc1a61bdfc3e28bf58a3bf9396f88ef90df1b7a
[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:  body or name not provided
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         miss_checks = ['name']
46         db_checks = [(self.table, False, query, error)]
47         self._create(miss_checks, db_checks)
48
49
50 class ProjectGURHandler(GenericProjectHandler):
51     @swagger.operation(nickname='get-one')
52     def get(self, project_name):
53         """
54             @description: get a single project by project_name
55             @rtype: L{Project}
56             @return 200: project exist
57             @raise 404: project not exist
58         """
59         self._get_one({'name': project_name})
60
61     @swagger.operation(nickname="update")
62     def put(self, project_name):
63         """
64             @description: update a single project by project_name
65             @param body: project to be updated
66             @type body: L{ProjectUpdateRequest}
67             @in body: body
68             @rtype: L{Project}
69             @return 200: update success
70             @raise 404: project not exist
71             @raise 403: new project name already exist or nothing to update
72         """
73         query = {'name': project_name}
74         db_keys = ['name']
75         self._update(query, db_keys)
76
77     @swagger.operation(nickname='delete')
78     def delete(self, project_name):
79         """
80             @description: delete a project by project_name
81             @return 200: delete success
82             @raise 404: project not exist
83         """
84         self._delete({'name': project_name})