Sfoglia il codice sorgente

抽象出API的父类,已实现get、get by filter、get by search

James Iter 9 anni fa
parent
commit
bfa2e2916a
13 ha cambiato i file con 102 aggiunte e 543 eliminazioni
  1. 27 1
      api/base.py
  2. 2 17
      api/disk.py
  3. 8 164
      api/guest.py
  4. 11 150
      api/log.py
  5. 12 69
      api/os_init.py
  6. 12 70
      api/os_init_write.py
  7. 12 69
      api/os_template.py
  8. 9 2
      api_route_table.py
  9. 3 0
      models/guest.py
  10. 2 1
      models/log.py
  11. 2 0
      models/os_init.py
  12. 1 0
      models/os_template.py
  13. 1 0
      models/rules.py

+ 27 - 1
api/base.py

@@ -22,6 +22,32 @@ class Base(object):
         self.the_blueprint = the_blueprint
         self.the_blueprints = the_blueprints
 
+    def get(self, ids=None, ids_rule=None, by_field=None):
+        the_instance = self.the_class()
+
+        args_rules = [
+            ids_rule
+        ]
+
+        try:
+            ji.Check.previewing(args_rules, {ids_rule[1]: ids})
+
+            ret = dict()
+            ret['state'] = ji.Common.exchange_state(20000)
+
+            if -1 == ids.find(','):
+                setattr(the_instance, by_field, ids)
+                the_instance.get_by(by_field)
+                ret['data'] = the_instance.__dict__
+
+            else:
+                ret['data'], ret['total'] = self.the_class.get_by_filter(
+                    limit=100, order_by=by_field, filter_str=':'.join([by_field, 'in', ids]))
+
+            return ret
+        except ji.PreviewingError, e:
+            return json.loads(e.message)
+
     def get_by_filter(self):
         page = str(request.args.get('page', 1))
         page_size = str(request.args.get('page_size', 50))
@@ -67,7 +93,7 @@ class Base(object):
                              'next': '', 'prev': '', 'first': '', 'last': ''}
 
             ret['data'], ret['paging']['total'] = self.the_class.get_by_filter(
-                offset=offset, limit=limit,order_by=order_by, order=order, filter_str=filter_str)
+                offset=offset, limit=limit, order_by=order_by, order=order, filter_str=filter_str)
 
             host_url = request.host_url.rstrip('/')
             other_str = '&filter=' + filter_str + '&order=' + order + '&order_by=' + order_by

+ 2 - 17
api/disk.py

@@ -179,23 +179,8 @@ def r_delete(uuids):
 
 
 @Utils.dumps2response
-def r_get(uuid):
-    disk = Disk()
-
-    args_rules = [
-        Rules.UUID.value
-    ]
-    disk.uuid = uuid
-
-    try:
-        ji.Check.previewing(args_rules, disk.__dict__)
-        disk.get_by('uuid')
-        ret = dict()
-        ret['state'] = ji.Common.exchange_state(20000)
-        ret['data'] = disk.__dict__
-        return ret
-    except ji.PreviewingError, e:
-        return json.loads(e.message)
+def r_get(uuids):
+    return disk_base.get(ids=uuids, ids_rule=Rules.UUIDS.value, by_field='uuid')
 
 
 @Utils.dumps2response

+ 8 - 164
api/guest.py

@@ -9,6 +9,7 @@ import json
 from uuid import uuid4
 import jimit as ji
 
+from api.base import Base
 from models import DiskState
 from models import OSInitWrite
 from models.initialize import app, dev_table
@@ -42,6 +43,9 @@ blueprints = Blueprint(
 )
 
 
+guest_base = Base(the_class=Guest, the_blueprint=blueprint, the_blueprints=blueprints)
+
+
 @Utils.dumps2response
 def r_create():
 
@@ -524,178 +528,18 @@ def r_migrate(uuids, destination_host):
 
 
 @Utils.dumps2response
-def r_get(uuid):
-    guest = Guest()
-
-    args_rules = [
-        Rules.UUID.value
-    ]
-    guest.uuid = uuid
-
-    try:
-        ji.Check.previewing(args_rules, guest.__dict__)
-        guest.get_by('uuid')
-        ret = dict()
-        ret['state'] = ji.Common.exchange_state(20000)
-        ret['data'] = guest.__dict__
-        return ret
-    except ji.PreviewingError, e:
-        return json.loads(e.message)
+def r_get(uuids):
+    return guest_base.get(ids=uuids, ids_rule=Rules.UUIDS.value, by_field='uuid')
 
 
 @Utils.dumps2response
 def r_get_by_filter():
-    page = str(request.args.get('page', 1))
-    page_size = str(request.args.get('page_size', 50))
-
-    args_rules = [
-        Rules.PAGE.value,
-        Rules.PAGE_SIZE.value
-    ]
-
-    try:
-        ji.Check.previewing(args_rules, {'page': page, 'page_size': page_size})
-    except ji.PreviewingError, e:
-        return json.loads(e.message)
-
-    page = int(page)
-    page_size = int(page_size)
-
-    # 把page和page_size换算成offset和limit
-    offset = (page - 1) * page_size
-    # offset, limit将覆盖page及page_size的影响
-    offset = str(request.args.get('offset', offset))
-    limit = str(request.args.get('limit', page_size))
-
-    order_by = request.args.get('order_by', 'id')
-    order = request.args.get('order', 'asc')
-    filter_str = request.args.get('filter', '')
-
-    args_rules = [
-        Rules.OFFSET.value,
-        Rules.LIMIT.value,
-        Rules.ORDER_BY.value,
-        Rules.ORDER.value
-    ]
-
-    try:
-        ji.Check.previewing(args_rules, {'offset': offset, 'limit': limit, 'order_by': order_by, 'order': order})
-        offset = int(offset)
-        limit = int(limit)
-        ret = dict()
-        ret['state'] = ji.Common.exchange_state(20000)
-        ret['data'] = list()
-        ret['paging'] = {'total': 0, 'offset': offset, 'limit': limit, 'page': page, 'page_size': page_size,
-                         'next': '', 'prev': '', 'first': '', 'last': ''}
-
-        ret['data'], ret['paging']['total'] = Guest.get_by_filter(offset=offset, limit=limit, order_by=order_by,
-                                                                  order=order, filter_str=filter_str)
-
-        host_url = request.host_url.rstrip('/')
-        other_str = '&filter=' + filter_str + '&order=' + order + '&order_by=' + order_by
-        last_pagination = (ret['paging']['total'] + page_size - 1) / page_size
-
-        if page <= 1:
-            ret['paging']['prev'] = host_url + blueprints.url_prefix + '?page=1&page_size=' + page_size.__str__() + \
-                                    other_str
-        else:
-            ret['paging']['prev'] = host_url + blueprints.url_prefix + '?page=' + str(page-1) + '&page_size=' + \
-                                    page_size.__str__() + other_str
-
-        if page >= last_pagination:
-            ret['paging']['next'] = host_url + blueprints.url_prefix + '?page=' + last_pagination.__str__() + \
-                                    '&page_size=' + page_size.__str__() + other_str
-        else:
-            ret['paging']['next'] = host_url + blueprints.url_prefix + '?page=' + str(page+1) + '&page_size=' + \
-                                    page_size.__str__() + other_str
-
-        ret['paging']['first'] = host_url + blueprints.url_prefix + '?page=1&page_size=' + \
-            page_size.__str__() + other_str
-        ret['paging']['last'] = \
-            host_url + blueprints.url_prefix + '?page=' + last_pagination.__str__() + '&page_size=' + \
-            page_size.__str__() + other_str
-
-        return ret
-    except ji.PreviewingError, e:
-        return json.loads(e.message)
+    return guest_base.get_by_filter()
 
 
 @Utils.dumps2response
 def r_content_search():
-    page = str(request.args.get('page', 1))
-    page_size = str(request.args.get('page_size', 50))
-
-    args_rules = [
-        Rules.PAGE.value,
-        Rules.PAGE_SIZE.value
-    ]
-
-    try:
-        ji.Check.previewing(args_rules, {'page': page, 'page_size': page_size})
-    except ji.PreviewingError, e:
-        return json.loads(e.message)
-
-    page = int(page)
-    page_size = int(page_size)
-
-    # 把page和page_size换算成offset和limit
-    offset = (page - 1) * page_size
-    # offset, limit将覆盖page及page_size的影响
-    offset = str(request.args.get('offset', offset))
-    limit = str(request.args.get('limit', page_size))
-
-    order_by = request.args.get('order_by', 'id')
-    order = request.args.get('order', 'asc')
-    keyword = request.args.get('keyword', '')
-
-    args_rules = [
-        Rules.OFFSET.value,
-        Rules.LIMIT.value,
-        Rules.ORDER_BY.value,
-        Rules.ORDER.value,
-        Rules.KEYWORD.value
-    ]
-
-    try:
-        ji.Check.previewing(args_rules, {'offset': offset, 'limit': limit, 'order_by': order_by, 'order': order,
-                                         'keyword': keyword})
-        offset = int(offset)
-        limit = int(limit)
-        ret = dict()
-        ret['state'] = ji.Common.exchange_state(20000)
-        ret['data'] = list()
-        ret['paging'] = {'total': 0, 'offset': offset, 'limit': limit, 'page': page, 'page_size': page_size}
-
-        ret['data'], ret['paging']['total'] = Guest.content_search(offset=offset, limit=limit, order_by=order_by,
-                                                                   order=order, keyword=keyword)
-
-        host_url = request.host_url.rstrip('/')
-        other_str = '&keyword=' + keyword + '&order=' + order + '&order_by=' + order_by
-        last_pagination = (ret['paging']['total'] + page_size - 1) / page_size
-
-        if page <= 1:
-            ret['paging']['prev'] = host_url + blueprints.url_prefix + '/_search?page=1&page_size=' + \
-                                    page_size.__str__() + other_str
-        else:
-            ret['paging']['prev'] = host_url + blueprints.url_prefix + '/_search?page=' + str(page-1) + \
-                                    '&page_size=' + page_size.__str__() + other_str
-
-        if page >= last_pagination:
-            ret['paging']['next'] = host_url + blueprints.url_prefix + '/_search?page=' + last_pagination.__str__() + \
-                                    '&page_size=' + page_size.__str__() + other_str
-        else:
-            ret['paging']['next'] = host_url + blueprints.url_prefix + '/_search?page=' + str(page+1) + \
-                                    '&page_size=' + page_size.__str__() + other_str
-
-        ret['paging']['first'] = host_url + blueprints.url_prefix + '/_search?page=1&page_size=' + \
-            page_size.__str__() + other_str
-        ret['paging']['last'] = \
-            host_url + blueprints.url_prefix + '/_search?page=' + last_pagination.__str__() + '&page_size=' + \
-            page_size.__str__() + other_str
-
-        return ret
-    except ji.PreviewingError, e:
-        return json.loads(e.message)
+    return guest_base.content_search()
 
 
 @Utils.dumps2response

+ 11 - 150
api/log.py

@@ -3,10 +3,8 @@
 
 
 from flask import Blueprint
-from flask import request
-import jimit as ji
-import json
 
+from api.base import Base
 from models import Log
 from models import Rules
 from models import Utils
@@ -31,157 +29,20 @@ blueprints = Blueprint(
 )
 
 
+log_base = Base(the_class=Log, the_blueprint=blueprint, the_blueprints=blueprints)
+
+
+@Utils.dumps2response
+def r_get(ids):
+    return log_base.get(ids=ids, ids_rule=Rules.IDS.value, by_field='id')
+
+
 @Utils.dumps2response
 def r_get_by_filter():
-    page = str(request.args.get('page', 1))
-    page_size = str(request.args.get('page_size', 50))
-
-    args_rules = [
-        Rules.PAGE.value,
-        Rules.PAGE_SIZE.value
-    ]
-
-    try:
-        ji.Check.previewing(args_rules, {'page': page, 'page_size': page_size})
-    except ji.PreviewingError, e:
-        return json.loads(e.message)
-
-    page = int(page)
-    page_size = int(page_size)
-
-    # 把page和page_size换算成offset和limit
-    offset = (page - 1) * page_size
-    # offset, limit将覆盖page及page_size的影响
-    offset = str(request.args.get('offset', offset))
-    limit = str(request.args.get('limit', page_size))
-
-    order_by = request.args.get('order_by', 'id')
-    order = request.args.get('order', 'asc')
-    filter_str = request.args.get('filter', '')
-
-    args_rules = [
-        Rules.OFFSET.value,
-        Rules.LIMIT.value,
-        Rules.ORDER_BY.value,
-        Rules.ORDER.value
-    ]
-
-    try:
-        ji.Check.previewing(args_rules, {'offset': offset, 'limit': limit, 'order_by': order_by, 'order': order})
-        offset = int(offset)
-        limit = int(limit)
-        ret = dict()
-        ret['state'] = ji.Common.exchange_state(20000)
-        ret['data'] = list()
-        ret['paging'] = {'total': 0, 'offset': offset, 'limit': limit, 'page': page, 'page_size': page_size,
-                         'next': '', 'prev': '', 'first': '', 'last': ''}
-
-        ret['data'], ret['paging']['total'] = Log.get_by_filter(offset=offset, limit=limit, order_by=order_by,
-                                                                order=order, filter_str=filter_str)
-
-        host_url = request.host_url.rstrip('/')
-        other_str = '&filter=' + filter_str + '&order=' + order + '&order_by=' + order_by
-        last_pagination = (ret['paging']['total'] + page_size - 1) / page_size
-
-        if page <= 1:
-            ret['paging']['prev'] = host_url + blueprints.url_prefix + '?page=1&page_size=' + page_size.__str__() + \
-                                    other_str
-        else:
-            ret['paging']['prev'] = host_url + blueprints.url_prefix + '?page=' + str(page-1) + '&page_size=' + \
-                                    page_size.__str__() + other_str
-
-        if page >= last_pagination:
-            ret['paging']['next'] = host_url + blueprints.url_prefix + '?page=' + last_pagination.__str__() + \
-                                    '&page_size=' + page_size.__str__() + other_str
-        else:
-            ret['paging']['next'] = host_url + blueprints.url_prefix + '?page=' + str(page+1) + '&page_size=' + \
-                                    page_size.__str__() + other_str
-
-        ret['paging']['first'] = host_url + blueprints.url_prefix + '?page=1&page_size=' + \
-            page_size.__str__() + other_str
-        ret['paging']['last'] = \
-            host_url + blueprints.url_prefix + '?page=' + last_pagination.__str__() + '&page_size=' + \
-            page_size.__str__() + other_str
-
-        return ret
-    except ji.PreviewingError, e:
-        return json.loads(e.message)
+    return log_base.get_by_filter()
 
 
 @Utils.dumps2response
 def r_content_search():
-    page = str(request.args.get('page', 1))
-    page_size = str(request.args.get('page_size', 50))
-
-    args_rules = [
-        Rules.PAGE.value,
-        Rules.PAGE_SIZE.value
-    ]
-
-    try:
-        ji.Check.previewing(args_rules, {'page': page, 'page_size': page_size})
-    except ji.PreviewingError, e:
-        return json.loads(e.message)
-
-    page = int(page)
-    page_size = int(page_size)
-
-    # 把page和page_size换算成offset和limit
-    offset = (page - 1) * page_size
-    # offset, limit将覆盖page及page_size的影响
-    offset = str(request.args.get('offset', offset))
-    limit = str(request.args.get('limit', page_size))
-
-    order_by = request.args.get('order_by', 'id')
-    order = request.args.get('order', 'asc')
-    keyword = request.args.get('keyword', '')
-
-    args_rules = [
-        Rules.OFFSET.value,
-        Rules.LIMIT.value,
-        Rules.ORDER_BY.value,
-        Rules.ORDER.value,
-        Rules.KEYWORD.value
-    ]
-
-    try:
-        ji.Check.previewing(args_rules, {'offset': offset, 'limit': limit, 'order_by': order_by, 'order': order,
-                                         'keyword': keyword})
-        offset = int(offset)
-        limit = int(limit)
-        ret = dict()
-        ret['state'] = ji.Common.exchange_state(20000)
-        ret['data'] = list()
-        ret['paging'] = {'total': 0, 'offset': offset, 'limit': limit, 'page': page, 'page_size': page_size}
-
-        ret['data'], ret['paging']['total'] = Log.content_search(offset=offset, limit=limit, order_by=order_by,
-                                                                 order=order, keyword=keyword)
-
-        host_url = request.host_url.rstrip('/')
-        other_str = '&keyword=' + keyword + '&order=' + order + '&order_by=' + order_by
-        last_pagination = (ret['paging']['total'] + page_size - 1) / page_size
-
-        if page <= 1:
-            ret['paging']['prev'] = host_url + blueprints.url_prefix + '/_search?page=1&page_size=' + \
-                                    page_size.__str__() + other_str
-        else:
-            ret['paging']['prev'] = host_url + blueprints.url_prefix + '/_search?page=' + str(page-1) + \
-                                    '&page_size=' + page_size.__str__() + other_str
-
-        if page >= last_pagination:
-            ret['paging']['next'] = host_url + blueprints.url_prefix + '/_search?page=' + last_pagination.__str__() + \
-                                    '&page_size=' + page_size.__str__() + other_str
-        else:
-            ret['paging']['next'] = host_url + blueprints.url_prefix + '/_search?page=' + str(page+1) + \
-                                    '&page_size=' + page_size.__str__() + other_str
-
-        ret['paging']['first'] = host_url + blueprints.url_prefix + '/_search?page=1&page_size=' + \
-            page_size.__str__() + other_str
-        ret['paging']['last'] = \
-            host_url + blueprints.url_prefix + '/_search?page=' + last_pagination.__str__() + '&page_size=' + \
-            page_size.__str__() + other_str
-
-        return ret
-    except ji.PreviewingError, e:
-        return json.loads(e.message)
+    return log_base.content_search()
 

+ 12 - 69
api/os_init.py

@@ -7,6 +7,7 @@ from flask import request, g
 import jimit as ji
 import json
 
+from api.base import Base
 from models import OSInit
 from models import OSInitWrite
 from models import Rules
@@ -32,6 +33,9 @@ blueprints = Blueprint(
 )
 
 
+os_init_base = Base(the_class=OSInit, the_blueprint=blueprint, the_blueprints=blueprints)
+
+
 @Utils.dumps2response
 def r_create():
 
@@ -135,77 +139,16 @@ def r_delete(_id):
 
 
 @Utils.dumps2response
-def r_get_by_filter():
-    page = str(request.args.get('page', 1))
-    page_size = str(request.args.get('page_size', 50))
-
-    args_rules = [
-        Rules.PAGE.value,
-        Rules.PAGE_SIZE.value
-    ]
+def r_get(ids):
+    return os_init_base.get(ids=ids, ids_rule=Rules.IDS.value, by_field='id')
 
-    try:
-        ji.Check.previewing(args_rules, {'page': page, 'page_size': page_size})
-    except ji.PreviewingError, e:
-        return json.loads(e.message)
-
-    page = int(page)
-    page_size = int(page_size)
-
-    # 把page和page_size换算成offset和limit
-    offset = (page - 1) * page_size
-    # offset, limit将覆盖page及page_size的影响
-    offset = str(request.args.get('offset', offset))
-    limit = str(request.args.get('limit', page_size))
-
-    order_by = request.args.get('order_by', 'id')
-    order = request.args.get('order', 'asc')
-    filter_str = request.args.get('filter', '')
-
-    args_rules = [
-        Rules.OFFSET.value,
-        Rules.LIMIT.value,
-        Rules.ORDER_BY.value,
-        Rules.ORDER.value
-    ]
 
-    try:
-        ji.Check.previewing(args_rules, {'offset': offset, 'limit': limit, 'order_by': order_by, 'order': order})
-        offset = int(offset)
-        limit = int(limit)
-        ret = dict()
-        ret['state'] = ji.Common.exchange_state(20000)
-        ret['data'] = list()
-        ret['paging'] = {'total': 0, 'offset': offset, 'limit': limit, 'page': page, 'page_size': page_size,
-                         'next': '', 'prev': '', 'first': '', 'last': ''}
-
-        ret['data'], ret['paging']['total'] = OSInit.get_by_filter(offset=offset, limit=limit, order_by=order_by,
-                                                                   order=order, filter_str=filter_str)
-
-        host_url = request.host_url.rstrip('/')
-        other_str = '&filter=' + filter_str + '&order=' + order + '&order_by=' + order_by
-        last_pagination = (ret['paging']['total'] + page_size - 1) / page_size
-
-        if page <= 1:
-            ret['paging']['prev'] = host_url + blueprints.url_prefix + '?page=1&page_size=' + page_size.__str__() + \
-                                    other_str
-        else:
-            ret['paging']['prev'] = host_url + blueprints.url_prefix + '?page=' + str(page-1) + '&page_size=' + \
-                                    page_size.__str__() + other_str
+@Utils.dumps2response
+def r_get_by_filter():
+    return os_init_base.get_by_filter()
 
-        if page >= last_pagination:
-            ret['paging']['next'] = host_url + blueprints.url_prefix + '?page=' + last_pagination.__str__() + \
-                                    '&page_size=' + page_size.__str__() + other_str
-        else:
-            ret['paging']['next'] = host_url + blueprints.url_prefix + '?page=' + str(page+1) + '&page_size=' + \
-                                    page_size.__str__() + other_str
 
-        ret['paging']['first'] = host_url + blueprints.url_prefix + '?page=1&page_size=' + \
-            page_size.__str__() + other_str
-        ret['paging']['last'] = \
-            host_url + blueprints.url_prefix + '?page=' + last_pagination.__str__() + '&page_size=' + \
-            page_size.__str__() + other_str
+@Utils.dumps2response
+def r_content_search():
+    return os_init_base.content_search()
 
-        return ret
-    except ji.PreviewingError, e:
-        return json.loads(e.message)

+ 12 - 70
api/os_init_write.py

@@ -7,6 +7,7 @@ from flask import request
 import jimit as ji
 import json
 
+from api.base import Base
 from models import OSInit
 from models import OSInitWrite
 from models import Rules
@@ -32,6 +33,9 @@ blueprints = Blueprint(
 )
 
 
+os_init_write_base = Base(the_class=OSInitWrite, the_blueprint=blueprint, the_blueprints=blueprints)
+
+
 @Utils.dumps2response
 def r_create():
 
@@ -141,78 +145,16 @@ def r_delete(_id):
 
 
 @Utils.dumps2response
-def r_get_by_filter():
-    page = str(request.args.get('page', 1))
-    page_size = str(request.args.get('page_size', 50))
-
-    args_rules = [
-        Rules.PAGE.value,
-        Rules.PAGE_SIZE.value
-    ]
-
-    try:
-        ji.Check.previewing(args_rules, {'page': page, 'page_size': page_size})
-    except ji.PreviewingError, e:
-        return json.loads(e.message)
-
-    page = int(page)
-    page_size = int(page_size)
-
-    # 把page和page_size换算成offset和limit
-    offset = (page - 1) * page_size
-    # offset, limit将覆盖page及page_size的影响
-    offset = str(request.args.get('offset', offset))
-    limit = str(request.args.get('limit', page_size))
-
-    order_by = request.args.get('order_by', 'id')
-    order = request.args.get('order', 'asc')
-    filter_str = request.args.get('filter', '')
-
-    args_rules = [
-        Rules.OFFSET.value,
-        Rules.LIMIT.value,
-        Rules.ORDER_BY.value,
-        Rules.ORDER.value
-    ]
-
-    try:
-        ji.Check.previewing(args_rules, {'offset': offset, 'limit': limit, 'order_by': order_by, 'order': order})
-        offset = int(offset)
-        limit = int(limit)
-        ret = dict()
-        ret['state'] = ji.Common.exchange_state(20000)
-        ret['data'] = list()
-        ret['paging'] = {'total': 0, 'offset': offset, 'limit': limit, 'page': page, 'page_size': page_size,
-                         'next': '', 'prev': '', 'first': '', 'last': ''}
-
-        ret['data'], ret['paging']['total'] = OSInitWrite.get_by_filter(offset=offset, limit=limit, order_by=order_by,
-                                                                        order=order, filter_str=filter_str)
+def r_get(ids):
+    return os_init_write_base.get(ids=ids, ids_rule=Rules.IDS.value, by_field='id')
 
-        host_url = request.host_url.rstrip('/')
-        other_str = '&filter=' + filter_str + '&order=' + order + '&order_by=' + order_by
-        last_pagination = (ret['paging']['total'] + page_size - 1) / page_size
-
-        if page <= 1:
-            ret['paging']['prev'] = host_url + blueprints.url_prefix + '?page=1&page_size=' + page_size.__str__() + \
-                                    other_str
-        else:
-            ret['paging']['prev'] = host_url + blueprints.url_prefix + '?page=' + str(page-1) + '&page_size=' + \
-                                    page_size.__str__() + other_str
 
-        if page >= last_pagination:
-            ret['paging']['next'] = host_url + blueprints.url_prefix + '?page=' + last_pagination.__str__() + \
-                                    '&page_size=' + page_size.__str__() + other_str
-        else:
-            ret['paging']['next'] = host_url + blueprints.url_prefix + '?page=' + str(page+1) + '&page_size=' + \
-                                    page_size.__str__() + other_str
+@Utils.dumps2response
+def r_get_by_filter():
+    return os_init_write_base.get_by_filter()
 
-        ret['paging']['first'] = host_url + blueprints.url_prefix + '?page=1&page_size=' + \
-            page_size.__str__() + other_str
-        ret['paging']['last'] = \
-            host_url + blueprints.url_prefix + '?page=' + last_pagination.__str__() + '&page_size=' + \
-            page_size.__str__() + other_str
 
-        return ret
-    except ji.PreviewingError, e:
-        return json.loads(e.message)
+@Utils.dumps2response
+def r_content_search():
+    return os_init_write_base.content_search()
 

+ 12 - 69
api/os_template.py

@@ -7,6 +7,7 @@ from flask import request
 import jimit as ji
 import json
 
+from api.base import Base
 from models import OSTemplate
 from models import Rules
 from models import Utils
@@ -31,6 +32,9 @@ blueprints = Blueprint(
 )
 
 
+os_template_base = Base(the_class=OSTemplate, the_blueprint=blueprint, the_blueprints=blueprints)
+
+
 @Utils.dumps2response
 def r_create():
 
@@ -148,77 +152,16 @@ def r_delete(_id):
 
 
 @Utils.dumps2response
-def r_get_by_filter():
-    page = str(request.args.get('page', 1))
-    page_size = str(request.args.get('page_size', 50))
-
-    args_rules = [
-        Rules.PAGE.value,
-        Rules.PAGE_SIZE.value
-    ]
+def r_get(ids):
+    return os_template_base.get(ids=ids, ids_rule=Rules.IDS.value, by_field='id')
 
-    try:
-        ji.Check.previewing(args_rules, {'page': page, 'page_size': page_size})
-    except ji.PreviewingError, e:
-        return json.loads(e.message)
-
-    page = int(page)
-    page_size = int(page_size)
-
-    # 把page和page_size换算成offset和limit
-    offset = (page - 1) * page_size
-    # offset, limit将覆盖page及page_size的影响
-    offset = str(request.args.get('offset', offset))
-    limit = str(request.args.get('limit', page_size))
-
-    order_by = request.args.get('order_by', 'id')
-    order = request.args.get('order', 'asc')
-    filter_str = request.args.get('filter', '')
-
-    args_rules = [
-        Rules.OFFSET.value,
-        Rules.LIMIT.value,
-        Rules.ORDER_BY.value,
-        Rules.ORDER.value
-    ]
 
-    try:
-        ji.Check.previewing(args_rules, {'offset': offset, 'limit': limit, 'order_by': order_by, 'order': order})
-        offset = int(offset)
-        limit = int(limit)
-        ret = dict()
-        ret['state'] = ji.Common.exchange_state(20000)
-        ret['data'] = list()
-        ret['paging'] = {'total': 0, 'offset': offset, 'limit': limit, 'page': page, 'page_size': page_size,
-                         'next': '', 'prev': '', 'first': '', 'last': ''}
-
-        ret['data'], ret['paging']['total'] = OSTemplate.get_by_filter(offset=offset, limit=limit, order_by=order_by,
-                                                                       order=order, filter_str=filter_str)
-
-        host_url = request.host_url.rstrip('/')
-        other_str = '&filter=' + filter_str + '&order=' + order + '&order_by=' + order_by
-        last_pagination = (ret['paging']['total'] + page_size - 1) / page_size
-
-        if page <= 1:
-            ret['paging']['prev'] = host_url + blueprints.url_prefix + '?page=1&page_size=' + page_size.__str__() + \
-                                    other_str
-        else:
-            ret['paging']['prev'] = host_url + blueprints.url_prefix + '?page=' + str(page-1) + '&page_size=' + \
-                                    page_size.__str__() + other_str
+@Utils.dumps2response
+def r_get_by_filter():
+    return os_template_base.get_by_filter()
 
-        if page >= last_pagination:
-            ret['paging']['next'] = host_url + blueprints.url_prefix + '?page=' + last_pagination.__str__() + \
-                                    '&page_size=' + page_size.__str__() + other_str
-        else:
-            ret['paging']['next'] = host_url + blueprints.url_prefix + '?page=' + str(page+1) + '&page_size=' + \
-                                    page_size.__str__() + other_str
 
-        ret['paging']['first'] = host_url + blueprints.url_prefix + '?page=1&page_size=' + \
-            page_size.__str__() + other_str
-        ret['paging']['last'] = \
-            host_url + blueprints.url_prefix + '?page=' + last_pagination.__str__() + '&page_size=' + \
-            page_size.__str__() + other_str
+@Utils.dumps2response
+def r_content_search():
+    return os_template_base.content_search()
 
-        return ret
-    except ji.PreviewingError, e:
-        return json.loads(e.message)

+ 9 - 2
api_route_table.py

@@ -28,18 +28,24 @@ add_rule_api(config.blueprint, '', api_func='config.r_get', methods=['GET'])
 add_rule_api(os_init.blueprint, '', api_func='os_init.r_create', methods=['POST'])
 add_rule_api(os_init.blueprint, '/<_id>', api_func='os_init.r_update', methods=['PATCH'])
 add_rule_api(os_init.blueprint, '/<_id>', api_func='os_init.r_delete', methods=['DELETE'])
+add_rule_api(os_init.blueprints, '/<ids>', api_func='os_init.r_get', methods=['GET'])
 add_rule_api(os_init.blueprints, '', api_func='os_init.r_get_by_filter', methods=['GET'])
+add_rule_api(os_init.blueprints, '/_search', api_func='os_init.r_content_search', methods=['GET'])
 
 add_rule_api(os_init_write.blueprint, '', api_func='os_init_write.r_create', methods=['POST'])
 add_rule_api(os_init_write.blueprint, '/<_id>', api_func='os_init_write.r_update', methods=['PATCH'])
 add_rule_api(os_init_write.blueprint, '/<_id>', api_func='os_init_write.r_delete', methods=['DELETE'])
+add_rule_api(os_init_write.blueprints, '/<ids>', api_func='os_init_write.r_get', methods=['GET'])
 add_rule_api(os_init_write.blueprints, '', api_func='os_init_write.r_get_by_filter', methods=['GET'])
+add_rule_api(os_init_write.blueprints, '/_search', api_func='os_init_write.r_content_search', methods=['GET'])
 
 # 系统模板操作
 add_rule_api(os_template.blueprint, '', api_func='os_template.r_create', methods=['POST'])
 add_rule_api(os_template.blueprint, '/<_id>', api_func='os_template.r_update', methods=['PATCH'])
 add_rule_api(os_template.blueprint, '/<_id>', api_func='os_template.r_delete', methods=['DELETE'])
+add_rule_api(os_template.blueprints, '/<ids>', api_func='os_template.r_get', methods=['GET'])
 add_rule_api(os_template.blueprints, '', api_func='os_template.r_get_by_filter', methods=['GET'])
+add_rule_api(os_template.blueprints, '/_search', api_func='os_template.r_content_search', methods=['GET'])
 
 # Guest操作
 # 创建虚拟机
@@ -54,7 +60,7 @@ add_rule_api(guest.blueprints, '/_resume/<uuids>', api_func='guest.r_resume', me
 add_rule_api(guest.blueprint, '/_attach_disk/<uuid>/<disk_uuid>', api_func='guest.r_attach_disk', methods=['PUT'])
 add_rule_api(guest.blueprint, '/_detach_disk/<disk_uuid>', api_func='guest.r_detach_disk', methods=['PUT'])
 add_rule_api(guest.blueprints, '/_migrate/<uuids>/<destination_host>', api_func='guest.r_migrate', methods=['PUT'])
-add_rule_api(guest.blueprint, '/<uuid>', api_func='guest.r_get', methods=['GET'])
+add_rule_api(guest.blueprints, '/<uuids>', api_func='guest.r_get', methods=['GET'])
 add_rule_api(guest.blueprints, '', api_func='guest.r_get_by_filter', methods=['GET'])
 add_rule_api(guest.blueprints, '/_search', api_func='guest.r_content_search', methods=['GET'])
 add_rule_api(guest.blueprint, '/<uuid>', api_func='guest.r_update', methods=['PATCH'])
@@ -65,12 +71,13 @@ add_rule_api(disk.blueprint, '', api_func='disk.r_create', methods=['POST'])
 add_rule_api(disk.blueprint, '/_disk_resize/<uuid>/<size>', api_func='disk.r_resize', methods=['PUT'])
 add_rule_api(disk.blueprints, '/<uuids>', api_func='disk.r_delete', methods=['DELETE'])
 add_rule_api(disk.blueprint, '/<uuid>', api_func='disk.r_update', methods=['PATCH'])
-add_rule_api(disk.blueprint, '/<uuid>', api_func='disk.r_get', methods=['GET'])
+add_rule_api(disk.blueprints, '/<uuids>', api_func='disk.r_get', methods=['GET'])
 add_rule_api(disk.blueprints, '', api_func='disk.r_get_by_filter', methods=['GET'])
 add_rule_api(disk.blueprints, '/_search', api_func='disk.r_content_search', methods=['GET'])
 
 # 日志查询
 # 系统模板操作
+add_rule_api(log.blueprints, '/<ids>', api_func='log.r_get', methods=['GET'])
 add_rule_api(log.blueprints, '', api_func='log.r_get_by_filter', methods=['GET'])
 add_rule_api(log.blueprints, '/_search', api_func='log.r_content_search', methods=['GET'])
 

+ 3 - 0
models/guest.py

@@ -45,6 +45,8 @@ class Guest(ORM):
     @staticmethod
     def get_filter_keywords():
         return {
+            'id': FilterFieldType.INT.value,
+            'uuid': FilterFieldType.STR.value,
             'name': FilterFieldType.STR.value,
             'remark': FilterFieldType.STR.value,
             'on_host': FilterFieldType.STR.value,
@@ -84,6 +86,7 @@ class Disk(ORM):
     @staticmethod
     def get_filter_keywords():
         return {
+            'id': FilterFieldType.INT.value,
             'uuid': FilterFieldType.STR.value,
             'label': FilterFieldType.STR.value,
             'size': FilterFieldType.INT.value,

+ 2 - 1
models/log.py

@@ -34,6 +34,7 @@ class Log(ORM):
     @staticmethod
     def get_filter_keywords():
         return {
+            'id': FilterFieldType.INT.value,
             'type': FilterFieldType.INT.value,
             'timestamp': FilterFieldType.INT.value,
             'host': FilterFieldType.STR.value
@@ -45,5 +46,5 @@ class Log(ORM):
 
     @staticmethod
     def get_allow_content_search_keywords():
-        return ['host']
+        return ['host', 'message']
 

+ 2 - 0
models/os_init.py

@@ -26,6 +26,7 @@ class OSInit(ORM):
     @staticmethod
     def get_filter_keywords():
         return {
+            'id': FilterFieldType.INT.value,
             'name': FilterFieldType.STR.value,
             'remark': FilterFieldType.STR.value
         }
@@ -54,6 +55,7 @@ class OSInitWrite(ORM):
     @staticmethod
     def get_filter_keywords():
         return {
+            'id': FilterFieldType.INT.value,
             'os_init_id': FilterFieldType.STR.value,
             'path': FilterFieldType.STR.value
         }

+ 1 - 0
models/os_template.py

@@ -28,6 +28,7 @@ class OSTemplate(ORM):
     @staticmethod
     def get_filter_keywords():
         return {
+            'id': FilterFieldType.INT.value,
             'label': FilterFieldType.STR.value,
             'path': FilterFieldType.STR.value,
             'active': FilterFieldType.BOOL.value,

+ 1 - 0
models/rules.py

@@ -21,6 +21,7 @@ class Rules(Enum):
     KEYWORD = (basestring, 'keyword')
 
     ID = ('regex:^\d{1,17}$', 'id')
+    IDS = ('regex:^(\d{1,17})(,\d{1,17})*$', 'ids')
 
     # 正则表达式方便校验其来自URL的参数
     IP = 'regex:^((?:(?:25[0-5]|2[0-4]\d|((1\d{2})|([1-9]?\d)))\.){3}(?:25[0-5]|2[0-4]\d|((1\d{2})|([1-9]?\d))))$'