20ad9cba1def78f3e51fe085eb57d92dc1bbaabc
[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         @ptype property4: C{list} of L{PropertySubclass}
32     """
33     def __init__(self, property1, property2=None, property3=None, property4=None):
34         self.property1 = property1
35         self.property2 = property2
36         self.property3 = property3
37         self.property4 = property4
38
39 items = {}
40
41
42 class GenericApiHandler(RequestHandler):
43     """
44     The purpose of this class is to take benefit of inheritance and prepare
45     a set of common functions for
46     the handlers
47     """
48
49     def initialize(self):
50         """ Prepares the database for the entire class """
51         pass
52
53     def prepare(self):
54         if not (self.request.method == "GET" or self.request.method == "DELETE"):
55             if self.request.headers.get("Content-Type") is not None:
56                 if self.request.headers["Content-Type"].startswith(DEFAULT_REPRESENTATION):
57                     try:
58                         self.json_args = json.loads(self.request.body)
59                     except (ValueError, KeyError, TypeError) as error:
60                         raise HTTPError(HTTP_BAD_REQUEST,
61                                         "Bad Json format [{}]".
62                                         format(error))
63                 else:
64                     self.json_args = None
65
66     def finish_request(self, json_object):
67         self.write(json.dumps(json_object))
68         self.set_header("Content-Type", DEFAULT_REPRESENTATION)
69         self.finish()
70
71
72 class ItemNoParamHandler(GenericApiHandler):
73     @swagger.operation(nickname='create')
74     def post(self):
75         """
76             @param body: create a item.
77             @type body: L{Item}
78             @return 200: item is created.
79             @raise 400: invalid input
80         """
81         property1 = self.json_args.get('property1')
82         items[property1] = self.json_args
83         self.finish_request(items[property1])
84
85     @swagger.operation(nickname='list')
86     def get(self):
87         """
88            @rtype: L{Item}
89         """
90         self.finish_request(items)
91
92     def options(self):
93         """
94         I'm not visible in the swagger docs
95         """
96         self.finish_request("I'm invisible in the swagger docs")
97
98
99 class ItemHandler(GenericApiHandler):
100     @swagger.operation(nickname='get')
101     def get(self, arg):
102         """
103             @rtype: L{Item}
104             @description: get information of a item
105             @notes:
106                 get a item,
107
108                 This will be added to the Implementation Notes.It lets you put very long text in your api.
109         """
110         self.finish_request(items[arg])
111
112     @swagger.operation(nickname='delete')
113     def delete(self, arg):
114         """
115             @description: delete a item
116             @notes:
117                 delete a item in items
118
119                 This will be added to the Implementation Notes.It lets you put very long text in your api.
120         """
121         del items[arg]
122         self.finish_request("success")
123
124
125 class ItemOptionParamHandler(GenericApiHandler):
126     @swagger.operation(nickname='create')
127     def post(self, arg1, arg2=''):
128         """
129         @return 200: case is created
130         """
131         print("ProjectHandler.post: %s -- %s -- %s" % (arg1, arg2, self.request.full_url()))
132         fs = open("/home/swagger/tornado-rest-swagger/%s/%s" % (arg1, arg2), "wb")
133         fs.write(self.request.body)
134         self.write("success")
135
136
137 def make_app():
138     return swagger.Application([
139         (r"/items", ItemNoParamHandler),
140         (r"/items/([^/]+)", ItemHandler),
141         (r"/items/([^/]+)/cases/([^/]+)", ItemOptionParamHandler),
142     ])
143
144
145 if __name__ == "__main__":
146     app = make_app()
147     app.listen(711)
148     tornado.ioloop.IOLoop.current().start()