فهرست منبع

实现批量变更编制功能

James Iter 7 سال پیش
والد
کامیت
dc9a5edf0c
4فایلهای تغییر یافته به همراه125 افزوده شده و 49 حذف شده
  1. 57 19
      jimvc/api/guest.py
  2. 4 1
      jimvc/api_route_table.py
  3. 1 0
      jimvc/models/rules.py
  4. 63 29
      jimvc/themes/default/templates/guests_show.html

+ 57 - 19
jimvc/api/guest.py

@@ -1246,10 +1246,14 @@ def r_distribute_count():
 
 
 @Utils.dumps2response
-def r_update(uuid):
+def r_update(uuids):
+
+    ret = dict()
+    ret['state'] = ji.Common.exchange_state(20000)
+    ret['data'] = list()
 
     args_rules = [
-        Rules.UUID.value
+        Rules.UUIDS.value
     ]
 
     if 'remark' in request.json:
@@ -1257,33 +1261,29 @@ def r_update(uuid):
             Rules.REMARK.value,
         )
 
-    if 'service_id' in request.json:
-        args_rules.append(
-            Rules.SERVICE_ID.value,
-        )
-
     if args_rules.__len__() < 2:
-        ret = dict()
-        ret['state'] = ji.Common.exchange_state(20000)
         return ret
 
-    request.json['uuid'] = uuid
+    request.json['uuids'] = uuids
 
     try:
         ji.Check.previewing(args_rules, request.json)
         guest = Guest()
-        guest.uuid = uuid
-        guest.get_by('uuid')
+        # 检测所指定的 UUDIs 实例都存在
+        for uuid in uuids.split(','):
+            guest.uuid = uuid
+            guest.get_by('uuid')
 
-        guest.remark = request.json.get('remark', guest.label)
-        guest.service_id = request.json.get('service_id', guest.service_id)
+        for uuid in uuids.split(','):
+            guest.uuid = uuid
+            guest.get_by('uuid')
+            guest.remark = request.json.get('remark', guest.remark)
 
-        guest.update()
-        guest.get()
+            guest.update()
+            guest.get()
+
+            ret['data'].append(guest.__dict__)
 
-        ret = dict()
-        ret['state'] = ji.Common.exchange_state(20000)
-        ret['data'] = guest.__dict__
         return ret
     except ji.PreviewingError, e:
         return json.loads(e.message)
@@ -1470,6 +1470,44 @@ def r_adjust_ability(uuids, cpu, memory):
         return json.loads(e.message)
 
 
+@Utils.dumps2response
+def r_change_prepared_by(uuids, service_id):
+
+    ret = dict()
+    ret['state'] = ji.Common.exchange_state(20000)
+    ret['data'] = list()
+
+    args_rules = [
+        Rules.UUIDS.value,
+        Rules.SERVICE_ID_IN_URL.value
+    ]
+
+    try:
+        ji.Check.previewing(args_rules, {'uuids': uuids, 'service_id': service_id})
+
+        guest = Guest()
+
+        # 检测所指定的 UUDIs 实例都存在
+        for uuid in uuids.split(','):
+            guest.uuid = uuid
+            guest.get_by('uuid')
+
+        for uuid in uuids.split(','):
+            guest.uuid = uuid
+            guest.get_by('uuid')
+            guest.service_id = int(service_id)
+
+            guest.update()
+            guest.get()
+
+            ret['data'].append(guest.__dict__)
+
+        return ret
+
+    except ji.PreviewingError, e:
+        return json.loads(e.message)
+
+
 @Utils.dumps2response
 def r_refresh_guest_state():
     try:

+ 4 - 1
jimvc/api_route_table.py

@@ -111,7 +111,7 @@ add_rule_api(guest.blueprints, '/_migrate/<uuids>/<destination_host>', api_func=
 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'])
+add_rule_api(guest.blueprints, '/<uuids>', api_func='guest.r_update', methods=['PATCH'])
 add_rule_api(guest.blueprints, '/<uuids>', api_func='guest.r_delete', methods=['DELETE'])
 add_rule_api(guest.blueprints, '/_reset_password/<uuids>/<password>', api_func='guest.r_reset_password',
              methods=['PUT'])
@@ -122,6 +122,9 @@ add_rule_api(guest.blueprints, '/_allocate_bandwidth/<uuids>/<bandwidth>/<bandwi
 add_rule_api(guest.blueprints, '/_adjust_ability/<uuids>/<cpu>/<memory>', api_func='guest.r_adjust_ability',
              methods=['PUT'])
 
+add_rule_api(guest.blueprints, '/_change_prepared_by/<uuids>/<service_id>', api_func='guest.r_change_prepared_by',
+             methods=['PUT'])
+
 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'])
 

+ 1 - 0
jimvc/models/rules.py

@@ -126,4 +126,5 @@ class Rules(Enum):
     PROJECT_ID = (int, 'project_id')
     PROJECTS_ID = (REG_NUMBERS, 'projects_id')
     SERVICE_ID = (int, 'service_id')
+    SERVICE_ID_IN_URL = (REG_NUMBER, 'service_id')
     SERVICES_ID = (REG_NUMBERS, 'services_id')

+ 63 - 29
jimvc/themes/default/templates/guests_show.html

@@ -427,7 +427,7 @@
         var remark = $('#edit_remark').val();
         $('#edit_remark_modal').modal('hide');
         $.ajax({
-            url : '/api/guest/' + uuid,
+            url : '/api/guests/' + uuid,
             type : 'PATCH',
             contentType: "application/json; charset=utf-8",
             data : JSON.stringify({
@@ -671,6 +671,24 @@
         });
     }
 
+    function change_prepared_by(uuids, service_id) {
+        $.ajax({
+            url : '/api/guests/_change_prepared_by/' + uuids.join(',') + '/' + service_id,
+            type : 'PUT',
+            contentType: "application/json; charset=utf-8",
+            error : function() {
+                alter_danger('实例编制更新失败!');
+            },
+            success : function() {
+                alter_success('实例编制更新成功。页面将在3秒钟后自动跳转!');
+            }
+        });
+
+        setTimeout(function() {
+            window.location.reload();
+        }, 3000);
+    }
+
     function boot_at(me) {
         var uuid = $('#instance_uuid').val();
         boot([uuid]);
@@ -752,9 +770,9 @@
     }
 
     function migrate_go() {
-        var migrate_type = $('#migrate_type').val();
+        var do_type = $('#migrate_type').val();
         var uuids = [];
-        if (migrate_type === 'single') {
+        if (do_type === 'single') {
             uuids = [$('#migrate_instance_uuid').val()];
         } else {
             uuids = get_checked_uuids();
@@ -765,9 +783,9 @@
     }
 
     function reset_password_go() {
-        var migrate_type = $('#reset_password_type').val();
+        var do_type = $('#reset_password_type').val();
         var uuids = [];
-        if (migrate_type === 'single') {
+        if (do_type === 'single') {
             uuids = [$('#reset_password_instance_uuid').val()];
         } else {
             uuids = get_checked_uuids();
@@ -777,6 +795,20 @@
         reset_password([uuids], password);
     }
 
+    function change_prepared_by_go(me) {
+        var do_type = $(me).data('do_type');
+        var service_id = $(me).data('service_id');
+        var uuids = [];
+
+        if (do_type === 'single') {
+            uuids = [$('#instance_uuid').val()];
+        } else {
+            uuids = get_checked_uuids();
+        }
+
+        change_prepared_by([uuids], service_id);
+    }
+
     function get_selected_uuids() {
         var selected_element = get_selected_element(true);
         var uuids = [];
@@ -1310,7 +1342,16 @@
     function get_services_menu(services) {
         var html = '<ul class="dropdown-menu" style="position: absolute; transform: translate3d(-80px, 0px, 0px); top: 0px; left: 0px; will-change: transform;">';
         $.each(services, function(index, value) {
-            html += '<li><a href="javascript:;" onclick="$(\'#instance_uuid\').val($($(this).parent().parent().parent().parent().parent().parent().parent().parent().parent().children()[0]).text());change_service(this);" data-service_id="' + value.id + '">' + value.name + '</a></li>';
+            html += '<li><a href="javascript:;" onclick="$(\'#instance_uuid\').val($($(this).parent().parent().parent().parent().parent().parent().parent().parent().parent().children()[0]).text());change_prepared_by_go(this);" data-do_type="single" data-service_id="' + value.id + '">' + value.name + '</a></li>';
+        });
+        html += '</ul>';
+        return html;
+    }
+
+    function get_services_menu_for_bottom(services) {
+        var html = '<ul class="dropdown-menu">';
+        $.each(services, function(index, value) {
+            html += '<li><a href="javascript:;" onclick="change_prepared_by_go(this);" data-do_type="batch" data-service_id="' + value.id + '">' + value.name + '</a></li>';
         });
         html += '</ul>';
         return html;
@@ -1327,39 +1368,26 @@
             },
             success : function(data, textStatus, xhr) {
                 var prepared_by_menu = $('.prepared-by > ul');
+                var prepared_by_menu_bottom = $('.prepared-by-bottom > ul');
+
                 prepared_by_menu.empty();
+                prepared_by_menu_bottom.empty();
                 $.each(data.data, function(k, v) {
                     var html = '<li class="dropdown-submenu">';
+
                     html += '<a href="javascript:;">' + v.name + '</a>';
                     html += get_services_menu(v.services);
                     html += '</li>';
                     prepared_by_menu.append(html);
-                });
-            }
-        });
-    }
 
-    function change_service(me) {
-        var uuid = $('#instance_uuid').val();
-        var service_id = $(me).data('service_id');
-        $.ajax({
-            url : '/api/guest/' + uuid,
-            type : 'PATCH',
-            contentType: "application/json; charset=utf-8",
-            data : JSON.stringify({
-                service_id: service_id
-            }),
-            error : function() {
-                alter_danger('实例编制更新失败!');
-            },
-            success : function() {
-                alter_success('实例编制更新成功。页面将在3秒钟后自动跳转!');
+                    var html_bottom = '<li class="dropdown-submenu">';
+                    html_bottom += '<a href="javascript:;">' + v.name + '</a>';
+                    html_bottom += get_services_menu_for_bottom(v.services);
+                    html_bottom += '</li>';
+                    prepared_by_menu_bottom.append(html_bottom);
+                });
             }
         });
-
-        setTimeout(function() {
-            window.location.reload();
-        }, 3000);
     }
 </script>
 <div class="panel">
@@ -1606,6 +1634,12 @@
                                                 </a>
                                             </li>
                                             <li class="divider"></li>
+                                            <li class="dropdown-submenu prepared-by-bottom">
+                                                <a href="javascript:;">变更编制</a>
+                                                <ul class="dropdown-menu">
+                                                </ul>
+                                            </li>
+                                            <li class="divider"></li>
                                             <li>
                                                 <a href="javascript:;" data-toggle="modal" data-target="#batch_allocate_bandwidth_modal">分配带宽</a>
                                             </li>