ded99d55d620a840bd68cbdea27b1c5f202d13df
[releng.git] / utils / test / result_collection_api / tornado_swagger_ui / example / basic.py
1 import json
2
3 import tornado.ioloop
4 from tornado.web import RequestHandler, HTTPError
5 from tornado_swagger import swagger
6
7 DEFAULT_REPRESENTATION = "application/json"
8 HTTP_BAD_REQUEST = 400
9 HTTP_FORBIDDEN = 403
10 HTTP_NOT_FOUND = 404
11
12 swagger.docs()
13
14
15 @swagger.model
16 class PropertySubclass:
17     def __init__(self, sub_property=None):
18         self.sub_property = sub_property
19
20
21 @swagger.model
22 class Item:
23     """
24         @description:
25             This is an example of a model class that has parameters in its constructor
26             and the fields in the swagger spec are derived from the parameters to __init__.
27         @notes:
28             In this case we would have property1, name as required parameters and property3 as optional parameter.
29         @property property3: Item description
30         @ptype property3: L{PropertySubclass}
31     """
32     def __init__(self, property1, property2=None, property3=None):
33         self.property1 = property1
34         self.property2 = property2
35         self.property3 = property3
36
37 items = {}
38
39
40 class GenericApiHandler(RequestHandler):
41     """
42     The purpose of this class is to take benefit of inheritance and prepare
43     a set of common functions for
44     the handlers
45     """
46
47     def initialize(self):
48         """ Prepares the database for the entire class """
49         pass
50
51     def prepare(self):
52         if not (self.request.method == "GET" or self.request.method == "DELETE"):
53             if self.request.headers.get("Content-Type") is not None:
54                 if self.request.headers["Content-Type"].startswith(DEFAULT_REPRESENTATION):
55                     try:
56                         self.json_args = json.loads(self.request.body)
57                     except (ValueError, KeyError, TypeError) as error:
58                         raise HTTPError(HTTP_BAD_REQUEST,
59                                         "Bad Json format [{}]".
60                                         format(error))
61                 else:
62                     self.json_args = None
63
64     def finish_request(self, json_object):
65         self.write(json.dumps(json_object))
66         self.set_header("Content-Type", DEFAULT_REPRESENTATION)
67         self.finish()
68
69
70 class ItemNoParamHandler(GenericApiHandler):
71     @swagger.operation(nickname='create')
72     def post(self):
73         """
74             @param body: create test results for a pod.
75             @type body: L{Item}
76             @return 200: pod is created.
77             @raise 400: invalid input
78         """
79         property1 = self.json_args.get('property1')
80         items[property1] = self.json_args
81         self.finish_request(items[property1])
82
83     @swagger.operation(nickname='list')
84     def get(self):
85         """
86            @rtype: L{Item}
87         """
88         self.finish_request(items)
89
90     def options(self):
91         """
92         I'm not visible in the swagger docs
93         """
94         self.finish_request("I'm invisible in the swagger docs")
95
96
97 class ItemHandler(GenericApiHandler):
98     @swagger.operation(nickname='get')
99     def get(self, arg):
100         """
101             @rtype: L{Item}
102             @description: get pod's test results
103             @notes:
104                 get a pod test results,
105
106                 This will be added to the Implementation Notes.It lets you put very long text in your api.
107         """
108         self.finish_request(items[arg])
109
110     @swagger.operation(nickname='delete')
111     def delete(self, arg):
112         """
113             @description: delete pod by pod_id
114             @notes:
115                 delete test results of a pod
116
117                 This will be added to the Implementation Notes.It lets you put very long text in your api.
118         """
119         del items[arg]
120         self.finish_request("success")
121
122
123 class ItemOptionParamHandler(GenericApiHandler):
124     @swagger.operation(nickname='create')
125     def post(self, arg1, arg2=''):
126         """
127         @return 200: case is created
128         """
129         print("ProjectHandler.post: %s -- %s -- %s" % (arg1, arg2, self.request.full_url()))
130         fs = open("/home/swagger/tornado-rest-swagger/%s/%s" % (arg1, arg2), "wb")
131         fs.write(self.request.body)
132         self.write("success")
133
134
135 def make_app():
136     return swagger.Application([
137         (r"/items", ItemNoParamHandler),
138         (r"/items/([^/]+)", ItemHandler),
139         (r"/items/([^/]+)/cases/([^/]+)", ItemOptionParamHandler),
140     ])
141
142
143 if __name__ == "__main__":
144     app = make_app()
145     app.listen(711)
146     tornado.ioloop.IOLoop.current().start()