Kaynağa Gözat

全文检索加入限定过滤条件

James Iter 7 yıl önce
ebeveyn
işleme
2a07813492
4 değiştirilmiş dosya ile 17 ekleme ve 4 silme
  1. 1 1
      docs/todo.md
  2. 2 1
      jimvc/api/base.py
  3. 6 1
      jimvc/api/guest.py
  4. 8 1
      jimvc/models/orm.py

+ 1 - 1
docs/todo.md

@@ -98,7 +98,7 @@
 - [ ] 创建虚拟机时,加入高级功能,选择 IP 池,选择分组
 - [ ] 统计计算节点上所承载、运行的虚拟机实例数量,并通过超级链接能检索出相应虚拟机列表
 - [ ] IP 字段加入 link 功能,且允许用户定制。通过点击链接,直接打开目标页面
-- [ ] 支持 vlan 功能
+- [x] 支持 vlan 功能
 - [ ] 加入虚拟机排序功能
 - [ ] 企业版分叉
 - [ ] 加入邮件、短信报警功能

+ 2 - 1
jimvc/api/base.py

@@ -149,6 +149,7 @@ class Base(object):
         order_by = request.args.get('order_by', 'id')
         order = request.args.get('order', 'asc')
         keyword = request.args.get('keyword', '')
+        filter_str = request.args.get('filter', '')
 
         args_rules = [
             Rules.OFFSET.value,
@@ -169,7 +170,7 @@ class Base(object):
             ret['paging'] = {'total': 0, 'offset': offset, 'limit': limit, 'page': page, 'page_size': page_size}
 
             ret['data'], ret['paging']['total'] = self.the_class.content_search(
-                offset=offset, limit=limit, order_by=order_by, order=order, keyword=keyword)
+                offset=offset, limit=limit, order_by=order_by, order=order, filter_str=filter_str, keyword=keyword)
 
             host_url = request.host_url.rstrip('/')
             other_str = '&keyword=' + keyword + '&order=' + order + '&order_by=' + order_by

+ 6 - 1
jimvc/api/guest.py

@@ -1050,7 +1050,8 @@ def exchange_guest_os_templates_logo(os_templates_image_mapping_by_id=None, os_t
     assert isinstance(os_template_image_id, int)
 
     if os_templates_image_mapping_by_id[os_template_image_id]['logo'] == "":
-        logo = os_templates_profile_mapping_by_id[os_templates_image_mapping_by_id[os_template_image_id]['os_template_profile_id']]['icon']
+        logo = os_templates_profile_mapping_by_id[os_templates_image_mapping_by_id[os_template_image_id][
+            'os_template_profile_id']]['icon']
     else:
         logo = os_templates_image_mapping_by_id[os_template_image_id]['logo']
 
@@ -1740,6 +1741,7 @@ def r_show():
     args = list()
     page = int(request.args.get('page', 1))
     page_size = int(request.args.get('page_size', 20))
+    _filter = request.args.get('filter', None)
     keyword = request.args.get('keyword', None)
 
     if page is not None:
@@ -1748,6 +1750,9 @@ def r_show():
     if page_size is not None:
         args.append('page_size=' + page_size.__str__())
 
+    if _filter is not None:
+        args.append('filter=' + _filter.__str__())
+
     if keyword is not None:
         args.append('keyword=' + keyword.__str__())
 

+ 8 - 1
jimvc/models/orm.py

@@ -285,13 +285,20 @@ class ORM(object):
         raise NotImplementedError()
 
     @classmethod
-    def content_search(cls, offset=0, limit=1000, order_by=None, order='asc', keyword=''):
+    def content_search(cls, offset=0, limit=1000, order_by=None, order='asc', filter_str='', keyword=''):
         if order_by is None:
             order_by = cls._primary_key
 
         _kv = dict()
         _kv = _kv.fromkeys(cls.get_allow_content_search_keywords(), '%{0}%'.format(keyword))
+
         where_str = ' OR '.join([k + ' LIKE %(' + k + ')s' for k in _kv.keys()])
+
+        filter_str = Filter.filter_str_to_sql(allow_keywords=cls.get_filter_keywords(), filter_str=filter_str)
+
+        if filter_str != '':
+            where_str = filter_str + ' AND (' + where_str + ')'
+
         sql_stmt = ("SELECT * FROM " + cls._table_name + " WHERE " + where_str + " ORDER BY " + order_by + " " + order +
                     " LIMIT %(offset)s, %(limit)s")
         sql_stmt_count = ("SELECT count(" + cls._primary_key + ") FROM " + cls._table_name + " WHERE " + where_str)