leverage token_check only when posting results
[releng.git] / utils / test / testapi / opnfv_testapi / resources / handlers.py
index aa77da2..757c817 100644 (file)
@@ -73,7 +73,9 @@ class GenericApiHandler(web.RequestHandler):
         cls_data = self.table_cls.from_dict(data)
         return cls_data.format_http()
 
-    @check.authenticate
+    @web.asynchronous
+    @gen.coroutine
+    @check.valid_token
     @check.no_body
     @check.miss_fields
     @check.carriers_exist
@@ -106,20 +108,27 @@ class GenericApiHandler(web.RequestHandler):
         per_page = kwargs.get('per_page', 0)
         if query is None:
             query = {}
+        pipelines = list()
+        pipelines.append({'$match': query})
 
         total_pages = 0
-        if page > 0:
-            cursor = dbapi.db_list(self.table, query)
-            records_count = yield cursor.count()
-            total_pages = self._calc_total_pages(records_count,
-                                                 last,
-                                                 page,
-                                                 per_page)
-        pipelines = self._set_pipelines(query, sort, last, page, per_page)
-        cursor = dbapi.db_aggregate(self.table, pipelines)
         data = list()
-        while (yield cursor.fetch_next):
-            data.append(self.format_data(cursor.next_object()))
+        cursor = dbapi.db_list(self.table, query)
+        records_count = yield cursor.count()
+        if records_count > 0:
+            if page > 0:
+                total_pages, return_nr = self._calc_total_pages(records_count,
+                                                                last,
+                                                                page,
+                                                                per_page)
+                pipelines = self._set_pipelines(pipelines,
+                                                sort,
+                                                return_nr,
+                                                page,
+                                                per_page)
+            cursor = dbapi.db_aggregate(self.table, pipelines)
+            while (yield cursor.fetch_next):
+                data.append(self.format_data(cursor.next_object()))
         if res_op is None:
             res = {self.table: data}
         else:
@@ -145,21 +154,17 @@ class GenericApiHandler(web.RequestHandler):
         if page > 1 and page > total_pages:
             raises.BadRequest(
                 'Request page > total_pages [{}]'.format(total_pages))
-        return total_pages
+        return total_pages, records_nr
 
     @staticmethod
-    def _set_pipelines(query, sort, last, page, per_page):
-        pipelines = list()
-        if query:
-            pipelines.append({'$match': query})
+    def _set_pipelines(pipelines, sort, return_nr, page, per_page):
         if sort:
             pipelines.append({'$sort': sort})
 
-        if page > 0:
-            pipelines.append({'$skip': (page - 1) * per_page})
-            pipelines.append({'$limit': per_page})
-        elif last > 0:
-            pipelines.append({'$limit': last})
+        over = (page - 1) * per_page
+        left = return_nr - over
+        pipelines.append({'$skip': over})
+        pipelines.append({'$limit': per_page if per_page < left else left})
 
         return pipelines
 
@@ -169,13 +174,15 @@ class GenericApiHandler(web.RequestHandler):
     def _get_one(self, data, query=None):
         self.finish_request(self.format_data(data))
 
-    @check.authenticate
+    @web.asynchronous
+    @gen.coroutine
     @check.not_exist
     def _delete(self, data, query=None):
         yield dbapi.db_delete(self.table, query)
         self.finish_request()
 
-    @check.authenticate
+    @web.asynchronous
+    @gen.coroutine
     @check.no_body
     @check.not_exist
     @check.updated_one_not_exist
@@ -186,7 +193,8 @@ class GenericApiHandler(web.RequestHandler):
         update_req['_id'] = str(data._id)
         self.finish_request(update_req)
 
-    @check.authenticate
+    @web.asynchronous
+    @gen.coroutine
     @check.no_body
     @check.not_exist
     @check.updated_one_not_exist
@@ -194,6 +202,7 @@ class GenericApiHandler(web.RequestHandler):
         data = self.table_cls.from_dict(data)
         update_req = self._update_requests(data)
         yield dbapi.db_update(self.table, query, update_req)
+        self.finish_request()
 
     def _update_requests(self, data):
         request = dict()