From d42197db3ab0be4a3c908a8c388cc4f18c162660 Mon Sep 17 00:00:00 2001
From: halcyon <864072399@qq.com>
Date: Tue, 17 Nov 2015 23:34:13 +0800
Subject: [PATCH] fix tower bugs

---
 jasset/asset_api.py                           |   2 +-
 jasset/models.py                              |   4 +-
 jasset/views.py                               |  22 ++++++----
 .../excels/cmdb_excel_2015_11_17_22_38.xlsx   | Bin 0 -> 4990 bytes
 .../excels/cmdb_excel_2015_11_17_22_39.xlsx   | Bin 0 -> 4990 bytes
 .../excels/cmdb_excel_2015_11_17_23_19.xlsx   | Bin 0 -> 4990 bytes
 templates/jasset/asset_detail.html            |  38 +++++++++---------
 templates/jasset/asset_list.html              |   8 ++--
 templates/jasset/group_add.html               |  12 +++---
 templates/jasset/group_detail.html            |  14 +++----
 templates/jasset/group_edit.html              |   4 +-
 templates/nav.html                            |   2 +-
 12 files changed, 57 insertions(+), 49 deletions(-)
 create mode 100644 static/files/excels/cmdb_excel_2015_11_17_22_38.xlsx
 create mode 100644 static/files/excels/cmdb_excel_2015_11_17_22_39.xlsx
 create mode 100644 static/files/excels/cmdb_excel_2015_11_17_23_19.xlsx

diff --git a/jasset/asset_api.py b/jasset/asset_api.py
index 998d669c..28457437 100644
--- a/jasset/asset_api.py
+++ b/jasset/asset_api.py
@@ -381,13 +381,13 @@ def excel_to_db(excel_file):
             row = table.row_values(row_num)
             if row:
                 ip, port, hostname, use_default_auth, username, password, group = row
-                print ip
                 use_default_auth = 1 if use_default_auth == u'默认' else 0
                 if get_object(Asset, ip=ip):
                     continue
                 if ip and port:
                     asset = Asset(ip=ip,
                                   port=port,
+                                  hostname=hostname,
                                   use_default_auth=use_default_auth,
                                   username=username,
                                   password=password
diff --git a/jasset/models.py b/jasset/models.py
index e011302a..f1e5b46f 100644
--- a/jasset/models.py
+++ b/jasset/models.py
@@ -37,8 +37,8 @@ class AssetGroup(models.Model):
 class IDC(models.Model):
     name = models.CharField(max_length=32, verbose_name=u'机房名称')
     bandwidth = models.CharField(max_length=32, blank=True, null=True, verbose_name=u'机房带宽')
-    linkman = models.CharField(max_length=16, null=True, verbose_name=u'联系人')
-    phone = models.CharField(max_length=32, verbose_name=u'联系电话')
+    linkman = models.CharField(max_length=16, blank=True, null=True, verbose_name=u'联系人')
+    phone = models.CharField(max_length=32, blank=True, null=True, verbose_name=u'联系电话')
     address = models.CharField(max_length=128, blank=True, null=True, verbose_name=u"机房地址")
     network = models.TextField(blank=True, null=True, verbose_name=u"IP地址段")
     date_added = models.DateField(auto_now=True, null=True)
diff --git a/jasset/views.py b/jasset/views.py
index 8427f9f6..6bafd566 100644
--- a/jasset/views.py
+++ b/jasset/views.py
@@ -2,9 +2,9 @@
 
 import ast
 from django.db.models import Q
-from django.shortcuts import get_object_or_404
 from jasset.asset_api import *
 from jumpserver.api import *
+from jumpserver.models import Setting
 from jasset.forms import AssetForm, IdcForm
 from jasset.models import Asset, IDC, AssetGroup, ASSET_TYPE, ASSET_STATUS
 from ansible_api import Tasks
@@ -330,13 +330,20 @@ def asset_update(request):
         return HttpResponseRedirect('/jasset/asset_detail/?id=%s' % asset_id)
     name = request.session.get('username', 'admin')
     if asset.use_default_auth:
-        username = 'root'
-        password = '123456'
+        default = Setting.objects.all()
+        if default:
+            default = default[0]
+            username = default.default_user
+            password = default.default_password
+            port = default.default_port
+        else:
+            return HttpResponse(u'没有设置默认用户名和密码!')
     else:
         username = asset.username
         password = asset.password
+        port = asset.port
 
-    resource = [{"hostname": asset.ip, "port": asset.port,
+    resource = [{"hostname": asset.ip, "port": port,
                  "username": username, "password": password}]
 
     ansible_instance = Tasks(resource)
@@ -446,9 +453,10 @@ def idc_del(request):
     """
     IDC delete view
     """
-    uuid = request.GET.get('uuid', '')
-    idc = get_object_or_404(IDC, uuid=uuid)
-    idc.delete()
+    uuid = request.GET.get('id', '')
+    idc = get_object(IDC, id=uuid)
+    if idc:
+        idc.delete()
     return HttpResponseRedirect('/jasset/idc_list/')
 
 
diff --git a/static/files/excels/cmdb_excel_2015_11_17_22_38.xlsx b/static/files/excels/cmdb_excel_2015_11_17_22_38.xlsx
new file mode 100644
index 0000000000000000000000000000000000000000..705c543475c0c947a28b36483792e3b1b833512d
GIT binary patch
literal 4990
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

literal 0
HcmV?d00001

diff --git a/static/files/excels/cmdb_excel_2015_11_17_22_39.xlsx b/static/files/excels/cmdb_excel_2015_11_17_22_39.xlsx
new file mode 100644
index 0000000000000000000000000000000000000000..83ea97d23f2eeae373115ee6738bfbaae0d7d4ae
GIT binary patch
literal 4990
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

literal 0
HcmV?d00001

diff --git a/static/files/excels/cmdb_excel_2015_11_17_23_19.xlsx b/static/files/excels/cmdb_excel_2015_11_17_23_19.xlsx
new file mode 100644
index 0000000000000000000000000000000000000000..26eb983077e37f5610942199853436c035056bb7
GIT binary patch
literal 4990
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

literal 0
HcmV?d00001

diff --git a/templates/jasset/asset_detail.html b/templates/jasset/asset_detail.html
index 1f8d0d13..143ca6a4 100644
--- a/templates/jasset/asset_detail.html
+++ b/templates/jasset/asset_detail.html
@@ -31,11 +31,11 @@
                                 <table class="table">
                                     <tr>
                                         <td class="text-navy">IP</td>
-                                        <td>{{ asset.ip }}</td>
+                                        <td>{{ asset.ip|default_if_none:""  }}</td>
                                     </tr>
                                     <tr>
                                         <td class="text-navy">主机名</td>
-                                        <td>{{ asset.hostname }}</td>
+                                        <td>{{ asset.hostname|default_if_none:""  }}</td>
                                     </tr>
                                     <tr>
                                         <td class="text-navy">å…¶ä»–IP</td>
@@ -53,11 +53,11 @@
                                     </tr>
                                     <tr>
                                         <td class="text-navy">远控IP</td>
-                                        <td>{{ asset.remote_ip }}</td>
+                                        <td>{{ asset.remote_ip|default_if_none:"" }}</td>
                                     </tr>
                                     <tr>
                                         <td class="text-navy">端口</td>
-                                        <td>{{ asset.port }}</td>
+                                        <td>{{ asset.port|default_if_none:"" }}</td>
                                     </tr>
 
                                     <tr>
@@ -66,7 +66,7 @@
                                              <table class="table">
                                                  {% for asset_group in asset.group.all %}
                                                     <tr>
-                                                        <td>{{ asset_group.name }}</td>
+                                                        <td>{{ asset_group.name|default_if_none:"" }}</td>
                                                     </tr>
                                                  {% endfor %}
                                              </table>
@@ -79,19 +79,19 @@
                                     </tr>
                                     <tr>
                                         <td class="text-navy">机房</td>
-                                        <td>{{ asset.idc.name }}</td>
+                                        <td>{{ asset.idc.name|default_if_none:"" }}</td>
                                     </tr>
                                     <tr>
                                         <td class="text-navy">硬件厂商型号</td>
-                                        <td>{{ asset.brand }}</td>
+                                        <td>{{ asset.brand|default_if_none:"" }}</td>
                                     </tr>
                                     <tr>
                                         <td class="text-navy">CPU</td>
-                                        <td>{{ asset.cpu }}</td>
+                                        <td>{{ asset.cpu|default_if_none:"" }}</td>
                                     </tr>
                                     <tr>
                                         <td class="text-navy">内存</td>
-                                        <td>{{ asset.memory }}M</td>
+                                        <td>{{ asset.memory|default_if_none:"" }}</td>
                                     </tr>
                                     <tr>
                                         <td class="text-navy">硬盘</td>
@@ -100,7 +100,7 @@
                                             {% if asset.disk %}
                                                  {% for disk, value in asset.disk|str_to_dic %}
                                                     <tr>
-                                                        <td><span class="text-navy">{{ disk }}</span> &nbsp&nbsp&nbsp {{ value }}</td>
+                                                        <td><span class="text-navy">{{ disk|default_if_none:"" }}</span> &nbsp&nbsp&nbsp {{ value|default_if_none:"" }}</td>
                                                     </tr>
                                                  {% endfor %}
                                             {% endif %}
@@ -109,35 +109,35 @@
                                     </tr>
                                     <tr>
                                         <td class="text-navy">资产编号</td>
-                                        <td>{{ asset.number }}</td>
+                                        <td>{{ asset.number|default_if_none:"" }}</td>
                                     </tr>
                                     <tr>
                                         <td class="text-navy">SN</td>
-                                        <td>{{ asset.sn }}</td>
+                                        <td>{{ asset.sn|default_if_none:"" }}</td>
                                     </tr>
                                     <tr>
                                         <td class="text-navy">主机类型</td>
-                                        <td>{{ asset.get_asset_type_display }}</td>
+                                        <td>{{ asset.get_asset_type_display|default_if_none:"" }}</td>
                                     </tr>
                                     <tr>
                                         <td class="text-navy">系统版本</td>
-                                        <td>{{ asset.system_type }} {{ asset.system_version }}</td>
+                                        <td>{{ asset.system_type|default_if_none:"" }} {{ asset.system_version|default_if_none:"" }}</td>
                                     </tr>
                                     <tr>
                                         <td class="text-navy">运行环境</td>
-                                        <td>{{ asset.get_env_display }}</td>
+                                        <td>{{ asset.get_env_display|default_if_none:"" }}</td>
                                     </tr>
                                     <tr>
                                         <td class="text-navy">机器状态</td>
-                                        <td>{{ asset.get_status_display }}</td>
+                                        <td>{{ asset.get_status_display|default_if_none:"" }}</td>
                                     </tr>
                                     <tr>
                                         <td class="text-navy">机柜号</td>
-                                        <td>{{ asset.cabinet }}</td>
+                                        <td>{{ asset.cabinet|default_if_none:"" }}</td>
                                     </tr>
                                     <tr>
                                         <td class="text-navy">机柜位置</td>
-                                        <td>{{ asset.position }}</td>
+                                        <td>{{ asset.position|default_if_none:"" }}</td>
                                     </tr>
                                     <tr>
                                         <td class="text-navy">激活</td>
@@ -149,7 +149,7 @@
                                     </tr>
                                     <tr>
                                         <td class="text-navy">备注</td>
-                                        <td>{{ asset.comment }}</td>
+                                        <td>{{ asset.comment|default_if_none:"" }}</td>
                                     </tr>
                                 </table>
                             </div>
diff --git a/templates/jasset/asset_list.html b/templates/jasset/asset_list.html
index 133e41ee..63eb123a 100644
--- a/templates/jasset/asset_list.html
+++ b/templates/jasset/asset_list.html
@@ -119,12 +119,12 @@
                                     <td class="text-center" name="id" value="{{ asset.id }}" data-editable='false'>
                                         <input name="id" value="{{ asset.id }}" type="checkbox" class="i-checks">
                                     </td>
-                                    <td class="text-center"> {{ asset.ip }} </td>
-                                    <td class="text-center"> {{ asset.hostname }} </td>
-                                    <td class="text-center"> {{ asset.idc.name }} </td>
+                                    <td class="text-center"> {{ asset.ip|default_if_none:"" }} </td>
+                                    <td class="text-center"> {{ asset.hostname|default_if_none:"" }} </td>
+                                    <td class="text-center"> {{ asset.idc.name|default_if_none:"" }} </td>
                                     <td class="text-center">{{ asset.group.all|group_str2 }}</td>
 {#                                    <td class="text-center">{{ asset.cpu }}|{{ asset.memory }}|{{ asset.disk }}</td>#}
-                                    <td class="text-center">{{ asset.system_type }}{{ asset.system_version }}</td>
+                                    <td class="text-center">{{ asset.system_type|default_if_none:"" }}{{ asset.system_version|default_if_none:"" }}</td>
                                     <td class="text-center"> {{ asset.use_default_auth|bool2str }} </td>
                                     <td class="text-center" data-editable='false'>
                                         <a href="/jasset/asset_detail/?id={{ asset.id }}" class="btn btn-xs btn-primary">详情</a>
diff --git a/templates/jasset/group_add.html b/templates/jasset/group_add.html
index f5013ae1..51ffd23c 100644
--- a/templates/jasset/group_add.html
+++ b/templates/jasset/group_add.html
@@ -75,12 +75,12 @@
 
 
                         <div class="form-group">
-                            <label for="" class="col-sm-2 control-label">主机<span class="red-fonts">*</span></label>
+                            <label for="" class="col-sm-2 control-label">主机</label>
                             <div class="col-sm-4">
                                 <div>
                                     <select id="assets" name="assets" class="form-control m-b" size="12" multiple>
                                         {% for asset in asset_all %}
-                                            <option value="{{ asset.id }}">{{ asset.ip }}</option>
+                                            <option value="{{ asset.id }}">{{ asset.hostname|default_if_none:"" }} - {{ asset.ip|default_if_none:"" }} - {{ asset.port|default_if_none:"" }}</option>
                                         {% endfor %}
                                     </select>
                                 </div>
@@ -133,12 +133,12 @@
     timely: 2,
     theme: "yellow_right_effect",
     fields: {
-        "j_group": {
+        "name": {
             rule: "required",
-            tip: "输入业务组名",
+            tip: "输入主机组名",
             ok: "",
-            msg: {required: "业务组名必须填写!"},
-            data: {'data-ok':"业务组名可以使用"}
+            msg: {required: "主机组名必须填写!"},
+            data: {'data-ok':"主机组名可以使用"}
         }
     },
     valid: function(form) {
diff --git a/templates/jasset/group_detail.html b/templates/jasset/group_detail.html
index e31a5d69..b2b95e96 100644
--- a/templates/jasset/group_detail.html
+++ b/templates/jasset/group_detail.html
@@ -52,17 +52,17 @@
                         <tbody>
                         {% for asset in contacts.object_list %}
                             <tr class="gradeX">
-                                <td class="text-center" name="j_id" value="{{ asset.id }}" data-editable='false'><input name="id" value="{{ asset.id }}" type="checkbox" class="i-checks"></td>
-                                <td class="text-center" name="j_ip"> {{ asset.ip }} </td>
-                                <td class="text-center" name="j_port"> {{ asset.port }} </td>
-                                <td class="text-center" name="j_idc"> {{ asset.idc.name }} </td>
+                                <td class="text-center" name="j_id" value="{{ asset.id|default_if_none:"" }}" data-editable='false'><input name="id" value="{{ asset.id }}" type="checkbox" class="i-checks"></td>
+                                <td class="text-center" name="j_ip"> {{ asset.ip|default_if_none:"" }} </td>
+                                <td class="text-center" name="j_port"> {{ asset.port|default_if_none:"" }} </td>
+                                <td class="text-center" name="j_idc"> {{ asset.idc.name|default_if_none:"" }} </td>
                                 <td class="text-center" name="j_group">{{ asset.bis_group.all | group_str2 }}</td>
                                 <td class="text-center" name="j_active"> {{ asset.is_active|bool2str }} </td>
                                 <td class="text-center"> {{ asset.date_added|date:"Y-m-d H:i:s" }} </td>
-                                <td class="text-center" name="j_comment"> {{ asset.comment }} </td>
+                                <td class="text-center" name="j_comment"> {{ asset.comment|default_if_none:"" }} </td>
                                 <td class="text-center" data-editable='false'>
-                                    <a href="/jasset/host_detail/?id={{ asset.id }}" class="iframe btn btn-xs btn-primary">详情</a>
-                                    <a href="/jasset/host_edit/?id={{ asset.id }}" class="btn btn-xs btn-info">编辑</a>
+                                    <a href="/jasset/asset_detail/?id={{ asset.id }}" class="iframe btn btn-xs btn-primary">详情</a>
+                                    <a href="/jasset/asset_edit/?id={{ asset.id }}" class="btn btn-xs btn-info">编辑</a>
                                     <a href="/jasset/group_del_host/?id={{ asset.id }}&gid={{ group.id }}" class="btn btn-xs btn-danger">删除</a>
                                 </td>
                             </tr>
diff --git a/templates/jasset/group_edit.html b/templates/jasset/group_edit.html
index e9054cca..8cb4ca9b 100644
--- a/templates/jasset/group_edit.html
+++ b/templates/jasset/group_edit.html
@@ -86,7 +86,7 @@
                                 <div>
                                     <select id="assets" name="assets" class="form-control m-b" size="12" multiple>
                                         {% for asset in asset_no_select %}
-                                        <option value="{{ asset.id }}">{{ asset.ip }}</option>
+                                        <option value="{{ asset.id }}">{{ asset.hostname|default_if_none:"" }} - {{ asset.ip|default_if_none:"" }} - {{ asset.port|default_if_none:"" }}</option>
                                         {% endfor %}
                                     </select>
                                 </div>
@@ -103,7 +103,7 @@
                                 <div>
                                     <select id="asset_select" name="asset_select" class="form-control m-b" size="12"  multiple>
                                         {% for asset in asset_select %}
-                                            <option value="{{ asset.id }}">{{ asset.ip }}</option>
+                                            <option value="{{ asset.id }}">{{ asset.hostname|default_if_none:"" }} - {{ asset.ip|default_if_none:"" }} - {{ asset.port|default_if_none:"" }}</option>
                                         {% endfor %}
                                     </select>
                                 </div>
diff --git a/templates/nav.html b/templates/nav.html
index 3f3e76d4..97911049 100644
--- a/templates/nav.html
+++ b/templates/nav.html
@@ -76,7 +76,7 @@
                 <a><i class="fa fa-cube"></i> <span class="nav-label">资产管理</span><span class="fa arrow"></span></a>
                 <ul class="nav nav-second-level">
 {#                    <li class="host_add host_add_multi"><a href="/jasset/host_add/">添加资产</a></li>#}
-                    <li class="host_list host_detail host_edit"><a href="/jasset/asset_list/">查看资产<span class="label label-info pull-right">{{ host_active_num }}/{{ host_total_num}}</span></a></li>
+                    <li class="asset_list asset_detail asset_edit"><a href="/jasset/asset_list/">查看资产<span class="label label-info pull-right">{{ host_active_num }}/{{ host_total_num}}</span></a></li>
                     <li class="idc_list idc_detail idc_edit"><a href="/jasset/idc_list/">查看IDC</a></li>
                     <li class="group_add"><a href="/jasset/group_add/">添加主机组</a></li>
                     <li class="group_list group_detail group_edit"><a href="/jasset/group_list/">查看主机组</a></li>
-- 
2.18.0