Просмотр исходного кода

实现guest 列表页面,前后端相对分离

James Iter 8 лет назад
Родитель
Сommit
8832751eba
5 измененных файлов с 120 добавлено и 81 удалено
  1. 3 3
      api/dashboard.py
  2. 93 2
      api/guest.py
  3. 2 0
      api_route_table.py
  4. 4 4
      templates/guests_show.html
  5. 18 72
      views/guest.py

+ 3 - 3
api/dashboard.py

@@ -32,9 +32,6 @@ blueprints = Blueprint(
 
 @Utils.dumps2response
 def r_show():
-    ret = dict()
-    ret['state'] = ji.Common.exchange_state(20000)
-
     # alive 的布尔值 True,在 url 中传输前,会自动转换为字符串 'True'
     hosts_url = url_for('api_hosts.r_get_by_filter', _external=True, alive=True)
     guests_distribute_count_url = url_for('api_guests.r_distribute_count', _external=True)
@@ -116,6 +113,9 @@ def r_show():
         hosts_sum['cpu'] += host['cpu']
         hosts_sum['memory'] += host['memory']
 
+    ret = dict()
+    ret['state'] = ji.Common.exchange_state(20000)
+
     ret['data'] = {
         'hosts_sum': hosts_sum,
         'guests_distribute_count_ret': guests_distribute_count_ret,

+ 93 - 2
api/guest.py

@@ -3,11 +3,13 @@
 
 
 import copy
-from flask import Blueprint, url_for
-from flask import request
+from math import ceil
+
+import requests
 import json
 from uuid import uuid4
 import jimit as ji
+from flask import Blueprint, url_for, request
 
 from api.base import Base
 from models import DiskState, Host
@@ -1286,3 +1288,92 @@ def r_refresh_guest_state():
 
     except ji.PreviewingError, e:
         return json.loads(e.message)
+
+
+@Utils.dumps2response
+def r_show():
+    args = list()
+    page = int(request.args.get('page', 1))
+    page_size = int(request.args.get('page_size', 10))
+    keyword = request.args.get('keyword', None)
+
+    if page is not None:
+        args.append('page=' + page.__str__())
+
+    if page_size is not None:
+        args.append('page_size=' + page_size.__str__())
+
+    if keyword is not None:
+        args.append('keyword=' + keyword.__str__())
+
+    hosts_url = url_for('api_hosts.r_get_by_filter', _external=True)
+    guests_url = url_for('api_guests.r_get_by_filter', _external=True)
+    if keyword is not None:
+        guests_url = url_for('api_guests.r_content_search', _external=True)
+
+    os_templates_image_url = url_for('api_os_templates_image.r_get_by_filter', _external=True)
+    os_templates_profile_url = url_for('api_os_templates_profile.r_get_by_filter', _external=True)
+
+    if args.__len__() > 0:
+        guests_url = guests_url + '?' + '&'.join(args)
+
+    hosts_ret = requests.get(url=hosts_url, cookies=request.cookies)
+    hosts_ret = json.loads(hosts_ret.content)
+
+    hosts_mapping_by_node_id = dict()
+    for host in hosts_ret['data']:
+        hosts_mapping_by_node_id[int(host['node_id'])] = host
+
+    guests_ret = requests.get(url=guests_url, cookies=request.cookies)
+    guests_ret = json.loads(guests_ret.content)
+
+    os_templates_image_ret = requests.get(url=os_templates_image_url, cookies=request.cookies)
+    os_templates_image_ret = json.loads(os_templates_image_ret.content)
+    os_templates_image_mapping_by_id = dict()
+    for os_template_image in os_templates_image_ret['data']:
+        os_templates_image_mapping_by_id[os_template_image['id']] = os_template_image
+
+    os_templates_profile_ret = requests.get(url=os_templates_profile_url, cookies=request.cookies)
+    os_templates_profile_ret = json.loads(os_templates_profile_ret.content)
+    os_templates_profile_mapping_by_id = dict()
+    for os_template_profile in os_templates_profile_ret['data']:
+        os_templates_profile_mapping_by_id[os_template_profile['id']] = os_template_profile
+
+    last_page = int(ceil(guests_ret['paging']['total'] / float(page_size)))
+    page_length = 5
+    pages = list()
+    if page < int(ceil(page_length / 2.0)):
+        for i in range(1, page_length + 1):
+            pages.append(i)
+            if i == last_page or last_page == 0:
+                break
+
+    elif last_page - page < page_length / 2:
+        for i in range(last_page - page_length + 1, last_page + 1):
+            if i < 1:
+                continue
+            pages.append(i)
+
+    else:
+        for i in range(page - page_length / 2, page + int(ceil(page_length / 2.0))):
+            pages.append(i)
+            if i == last_page or last_page == 0:
+                break
+
+    ret = dict()
+    ret['state'] = ji.Common.exchange_state(20000)
+
+    ret['data'] = {
+        'guests_ret': guests_ret,
+        'os_templates_image_mapping_by_id': os_templates_image_mapping_by_id,
+        'os_templates_profile_mapping_by_id': os_templates_profile_mapping_by_id,
+        'hosts_mapping_by_node_id': hosts_mapping_by_node_id,
+        'page': page,
+        'page_size': page_size,
+        'keyword': keyword,
+        'pages': pages,
+        'last_page': last_page
+    }
+
+    return ret
+

+ 2 - 0
api_route_table.py

@@ -119,6 +119,8 @@ add_rule_api(guest.blueprints, '/_adjust_ability/<uuids>/<cpu>/<memory>', api_fu
 add_rule_api(guest.blueprints, '/_distribute_count', api_func='guest.r_distribute_count', methods=['GET'])
 add_rule_api(guest.blueprints, '/_refresh_guest_state', api_func='guest.r_refresh_guest_state', methods=['PATCH'])
 
+add_rule_api(guest.blueprints, '/_show', api_func='guest.r_show', methods=['GET'])
+
 # Disk操作
 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'])

+ 4 - 4
templates/guests_show.html

@@ -855,14 +855,14 @@
                         </div>
                     </td>
                     <td>
-                        {% if os_templates_image_mapping_by_id[item.os_template_image_id].logo == "" %}
-                            <span class="{{ os_templates_profile_mapping_by_id[os_templates_image_mapping_by_id[item.os_template_image_id].os_template_profile_id].icon }}" title="{{ os_templates_image_mapping_by_id[item.os_template_image_id].label }}"></span>
+                        {% if os_templates_image_mapping_by_id[item.os_template_image_id | string].logo == "" %}
+                            <span class="{{ os_templates_profile_mapping_by_id[os_templates_image_mapping_by_id[item.os_template_image_id | string].os_template_profile_id].icon }}" title="{{ os_templates_image_mapping_by_id[item.os_template_image_id | string].label }}"></span>
                         {% else %}
-                            <span class="{{ os_templates_image_mapping_by_id[item.os_template_image_id].logo }}" title="{{ os_templates_image_mapping_by_id[item.os_template_image_id].label }}"></span>
+                            <span class="{{ os_templates_image_mapping_by_id[item.os_template_image_id | string].logo }}" title="{{ os_templates_image_mapping_by_id[item.os_template_image_id | string].label }}"></span>
                         {% endif %}
                     </td>
                     <td>{{ format_guest_status(item.status, item.progress)|safe }}</td>
-                    <td>{{ hosts_mapping_by_node_id[item.node_id].hostname }}</td>
+                    <td>{{ hosts_mapping_by_node_id[item.node_id | string].hostname }}</td>
                     <td>
                         CPU :&nbsp;&nbsp;{{ item.cpu }}&nbsp;核<br />
                         内存 :&nbsp;&nbsp;{{ item.memory }}&nbsp;GB<br />

+ 18 - 72
views/guest.py

@@ -10,6 +10,9 @@ from math import ceil
 import re
 import socket
 import time
+
+from werkzeug.datastructures import ImmutableMultiDict
+
 from models import Database as db
 from models.initialize import config
 
@@ -34,82 +37,25 @@ blueprints = Blueprint(
 
 
 def show():
-    args = list()
-    page = int(request.args.get('page', 1))
-    page_size = int(request.args.get('page_size', 10))
-    keyword = request.args.get('keyword', None)
-    resource_path = request.path
-
-    if page is not None:
-        args.append('page=' + page.__str__())
-
-    if page_size is not None:
-        args.append('page_size=' + page_size.__str__())
-
-    if keyword is not None:
-        args.append('keyword=' + keyword.__str__())
-
-    host_url = request.host_url.rstrip('/')
-
-    hosts_url = host_url + url_for('api_hosts.r_get_by_filter')
-    guests_url = host_url + url_for('api_guests.r_get_by_filter')
-    if keyword is not None:
-        guests_url = host_url + url_for('api_guests.r_content_search')
-
-    os_templates_image_url = host_url + url_for('api_os_templates_image.r_get_by_filter')
-    os_templates_profile_url = host_url + url_for('api_os_templates_profile.r_get_by_filter')
-
-    if args.__len__() > 0:
-        guests_url = guests_url + '?' + '&'.join(args)
-
-    hosts_ret = requests.get(url=hosts_url, cookies=request.cookies)
-    hosts_ret = json.loads(hosts_ret.content)
-
-    hosts_mapping_by_node_id = dict()
-    for host in hosts_ret['data']:
-        hosts_mapping_by_node_id[int(host['node_id'])] = host
-
-    guests_ret = requests.get(url=guests_url, cookies=request.cookies)
-    guests_ret = json.loads(guests_ret.content)
-
-    os_templates_image_ret = requests.get(url=os_templates_image_url, cookies=request.cookies)
-    os_templates_image_ret = json.loads(os_templates_image_ret.content)
-    os_templates_image_mapping_by_id = dict()
-    for os_template_image in os_templates_image_ret['data']:
-        os_templates_image_mapping_by_id[os_template_image['id']] = os_template_image
+    url = url_for('api_guests.r_show', _external=True)
+    if request.args.__len__() >= 1:
+        args = list()
 
-    os_templates_profile_ret = requests.get(url=os_templates_profile_url, cookies=request.cookies)
-    os_templates_profile_ret = json.loads(os_templates_profile_ret.content)
-    os_templates_profile_mapping_by_id = dict()
-    for os_template_profile in os_templates_profile_ret['data']:
-        os_templates_profile_mapping_by_id[os_template_profile['id']] = os_template_profile
+        for k, v in request.args.items():
+            args.append('='.join([k, v]))
 
-    last_page = int(ceil(guests_ret['paging']['total'] / float(page_size)))
-    page_length = 5
-    pages = list()
-    if page < int(ceil(page_length / 2.0)):
-        for i in range(1, page_length + 1):
-            pages.append(i)
-            if i == last_page or last_page == 0:
-                break
-
-    elif last_page - page < page_length / 2:
-        for i in range(last_page - page_length + 1, last_page + 1):
-            if i < 1:
-                continue
-            pages.append(i)
+        url += '?' + '&'.join(args)
 
-    else:
-        for i in range(page - page_length / 2, page + int(ceil(page_length / 2.0))):
-            pages.append(i)
-            if i == last_page or last_page == 0:
-                break
+    ret = requests.get(url=url, cookies=request.cookies)
+    ret = json.loads(ret.content)
 
-    return render_template('guests_show.html', guests_ret=guests_ret, resource_path=resource_path,
-                           os_templates_image_mapping_by_id=os_templates_image_mapping_by_id,
-                           os_templates_profile_mapping_by_id=os_templates_profile_mapping_by_id,
-                           hosts_mapping_by_node_id=hosts_mapping_by_node_id, page=page,
-                           page_size=page_size, keyword=keyword, pages=pages, last_page=last_page)
+    return render_template('guests_show.html', guests_ret=ret['data']['guests_ret'],
+                           resource_path=request.path,
+                           os_templates_image_mapping_by_id=ret['data']['os_templates_image_mapping_by_id'],
+                           os_templates_profile_mapping_by_id=ret['data']['os_templates_profile_mapping_by_id'],
+                           hosts_mapping_by_node_id=ret['data']['hosts_mapping_by_node_id'], page=ret['data']['page'],
+                           page_size=ret['data']['page_size'], keyword=ret['data']['keyword'],
+                           pages=ret['data']['pages'], last_page=ret['data']['last_page'])
 
 
 def create():