tornado_swagger_ui support query operation in "GET" method, and support methods in...
[releng.git] / utils / test / result_collection_api / tornado_swagger_ui / example / basic.py
index ded99d5..1731bfd 100644 (file)
@@ -2,7 +2,7 @@ import json
 
 import tornado.ioloop
 from tornado.web import RequestHandler, HTTPError
-from tornado_swagger import swagger
+from tornado_swagger_ui.tornado_swagger import swagger
 
 DEFAULT_REPRESENTATION = "application/json"
 HTTP_BAD_REQUEST = 400
@@ -12,13 +12,13 @@ HTTP_NOT_FOUND = 404
 swagger.docs()
 
 
-@swagger.model
+@swagger.model()
 class PropertySubclass:
     def __init__(self, sub_property=None):
         self.sub_property = sub_property
 
 
-@swagger.model
+@swagger.model()
 class Item:
     """
         @description:
@@ -28,11 +28,40 @@ class Item:
             In this case we would have property1, name as required parameters and property3 as optional parameter.
         @property property3: Item description
         @ptype property3: L{PropertySubclass}
+        @ptype property4: C{list} of L{PropertySubclass}
     """
-    def __init__(self, property1, property2=None, property3=None):
+    def __init__(self, property1, property2=None, property3=None, property4=None):
         self.property1 = property1
         self.property2 = property2
         self.property3 = property3
+        self.property4 = property4
+
+    def format_http(self):
+        return {
+            "property1": self.property1,
+            "property2": self.property2,
+            "property3": self.property3,
+            "property4": self.property4,
+        }
+
+    @staticmethod
+    def item_from_dict(item_dict):
+
+        if item_dict is None:
+            return None
+
+        t = Item(None)
+        t.property1 = item_dict.get('property1')
+        t.property2 = item_dict.get('property2')
+        t.property3 = item_dict.get('property3')
+        t.property4 = item_dict.get('property4')
+
+        return t
+
+    @classmethod
+    def test_classmethod(cls):
+        pass
+
 
 items = {}
 
@@ -71,21 +100,27 @@ class ItemNoParamHandler(GenericApiHandler):
     @swagger.operation(nickname='create')
     def post(self):
         """
-            @param body: create test results for a pod.
+            @param body: create a item.
             @type body: L{Item}
-            @return 200: pod is created.
+            @in body: body
+            @return 200: item is created.
             @raise 400: invalid input
         """
         property1 = self.json_args.get('property1')
-        items[property1] = self.json_args
-        self.finish_request(items[property1])
+        item = Item.item_from_dict(self.json_args)
+        items[property1] = item
+        Item.test_classmethod()
+        self.finish_request(item.format_http())
 
     @swagger.operation(nickname='list')
     def get(self):
         """
            @rtype: L{Item}
         """
-        self.finish_request(items)
+        res = []
+        for key, value in items.iteritems():
+            res.append(value.format_http())
+        self.finish_request(res)
 
     def options(self):
         """
@@ -99,20 +134,20 @@ class ItemHandler(GenericApiHandler):
     def get(self, arg):
         """
             @rtype: L{Item}
-            @description: get pod's test results
+            @description: get information of a item
             @notes:
-                get a pod test results,
+                get a item,
 
                 This will be added to the Implementation Notes.It lets you put very long text in your api.
         """
-        self.finish_request(items[arg])
+        self.finish_request(items[arg].format_http())
 
     @swagger.operation(nickname='delete')
     def delete(self, arg):
         """
-            @description: delete pod by pod_id
+            @description: delete a item
             @notes:
-                delete test results of a pod
+                delete a item in items
 
                 This will be added to the Implementation Notes.It lets you put very long text in your api.
         """
@@ -132,8 +167,42 @@ class ItemOptionParamHandler(GenericApiHandler):
         self.write("success")
 
 
+class ItemQueryHandler(GenericApiHandler):
+    @swagger.operation(nickname='query')
+    def get(self):
+        """
+           @param property1:
+           @type property1: L{string}
+           @in property1: query
+           @required property1: False
+
+           @param property2:
+           @type property2: L{string}
+           @in property2: query
+           @required property2: True
+           @rtype: L{Item}
+           @notes: GET /item?property1=1&property2=1
+        """
+        property1 = self.get_query_argument("property1", None)
+        property2 = self.get_query_argument("property2", None)
+
+        res = []
+        if property1 is None:
+            for key, value in items.iteritems():
+                if property2 is None:
+                    res.append(value.format_http())
+                elif value.property2 == property2:
+                    res.append(value.format_http())
+        elif items.has_key(property1):
+            if items.get(property1).property2 == property2:
+                res.append(items.get(property1).format_http())
+
+        self.finish_request(res)
+
+
 def make_app():
     return swagger.Application([
+        (r"/item", ItemQueryHandler),
         (r"/items", ItemNoParamHandler),
         (r"/items/([^/]+)", ItemHandler),
         (r"/items/([^/]+)/cases/([^/]+)", ItemOptionParamHandler),