From 3771b2ff70bc08aca2bb6785265ea9029be6ade0 Mon Sep 17 00:00:00 2001 From: wangyong <864072399@qq.com> Date: Sun, 21 Aug 2016 22:12:17 +0800 Subject: [PATCH 01/13] add asset detail and list --- apps/assets/migrations/0001_initial.py | 56 +-- .../migrations/0002_auto_20160821_1757.py | 20 + .../migrations/0003_auto_20160821_1759.py | 20 + apps/assets/models.py | 65 +-- .../assets/templates/assets/asset_detail.html | 374 ++++++++++++++++++ apps/assets/templates/assets/asset_list.html | 2 +- .../migrations/0004_auto_20160821_1754.py | 35 ++ 7 files changed, 512 insertions(+), 60 deletions(-) create mode 100644 apps/assets/migrations/0002_auto_20160821_1757.py create mode 100644 apps/assets/migrations/0003_auto_20160821_1759.py create mode 100644 apps/assets/templates/assets/asset_detail.html create mode 100644 apps/users/migrations/0004_auto_20160821_1754.py diff --git a/apps/assets/migrations/0001_initial.py b/apps/assets/migrations/0001_initial.py index c6784a4ac..1f8bae05e 100644 --- a/apps/assets/migrations/0001_initial.py +++ b/apps/assets/migrations/0001_initial.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# Generated by Django 1.10 on 2016-08-14 08:12 +# Generated by Django 1.10 on 2016-08-21 09:52 from __future__ import unicode_literals from django.db import migrations, models @@ -19,26 +19,26 @@ class Migration(migrations.Migration): fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('ip', models.CharField(blank=True, max_length=32, verbose_name='\u4e3b\u673aIP')), - ('other_ip', models.CharField(blank=True, max_length=255, null=True, verbose_name='\u5176\u4ed6IP')), - ('remote_card_ip', models.CharField(blank=True, max_length=16, null=True, verbose_name='\u8fdc\u63a7\u5361IP')), - ('hostname', models.CharField(max_length=128, unique=True, verbose_name='\u4e3b\u673a\u540d')), - ('port', models.IntegerField(blank=True, null=True, verbose_name='\u7aef\u53e3\u53f7')), - ('username', models.CharField(blank=True, max_length=16, null=True, verbose_name='\u7ba1\u7406\u7528\u6237\u540d')), - ('password', models.CharField(blank=True, max_length=256, null=True, verbose_name='\u5bc6\u7801')), - ('mac_addr', models.CharField(blank=True, max_length=20, null=True, verbose_name='MAC\u5730\u5740')), - ('brand', models.CharField(blank=True, max_length=64, null=True, verbose_name='\u786c\u4ef6\u5382\u5546\u578b\u53f7')), - ('cpu', models.CharField(blank=True, max_length=64, null=True, verbose_name='CPU')), - ('memory', models.CharField(blank=True, max_length=128, null=True, verbose_name='\u5185\u5b58')), - ('disk', models.CharField(blank=True, max_length=1024, null=True, verbose_name='\u786c\u76d8')), - ('os', models.CharField(blank=True, max_length=128, null=True, verbose_name='\u7cfb\u7edf\u4fe1\u606f')), - ('cabinet_no', models.CharField(blank=True, max_length=32, null=True, verbose_name='\u673a\u67dc\u53f7')), - ('cabinet_pos', models.IntegerField(blank=True, null=True, verbose_name='\u673a\u5668\u4f4d\u7f6e')), - ('number', models.CharField(blank=True, max_length=32, null=True, verbose_name='\u8d44\u4ea7\u7f16\u53f7')), - ('sn', models.CharField(blank=True, max_length=128, null=True, verbose_name='SN\u7f16\u53f7')), - ('created_by', models.CharField(blank=True, max_length=32, null=True, verbose_name='\u521b\u5efa\u8005')), + ('other_ip', models.CharField(blank=True, max_length=255, verbose_name='\u5176\u4ed6IP')), + ('remote_card_ip', models.CharField(blank=True, max_length=16, verbose_name='\u8fdc\u63a7\u5361IP')), + ('hostname', models.CharField(blank=True, max_length=128, unique=True, verbose_name='\u4e3b\u673a\u540d')), + ('port', models.IntegerField(blank=True, verbose_name='\u7aef\u53e3\u53f7')), + ('username', models.CharField(blank=True, max_length=16, verbose_name='\u7ba1\u7406\u7528\u6237\u540d')), + ('password', models.CharField(blank=True, max_length=256, verbose_name='\u5bc6\u7801')), + ('mac_addr', models.CharField(blank=True, max_length=20, unique=True, verbose_name='MAC\u5730\u5740')), + ('brand', models.CharField(blank=True, max_length=64, verbose_name='\u786c\u4ef6\u5382\u5546\u578b\u53f7')), + ('cpu', models.CharField(blank=True, max_length=64, verbose_name='CPU')), + ('memory', models.CharField(blank=True, max_length=128, verbose_name='\u5185\u5b58')), + ('disk', models.CharField(blank=True, max_length=1024, verbose_name='\u786c\u76d8')), + ('os', models.CharField(blank=True, max_length=128, verbose_name='\u7cfb\u7edf\u4fe1\u606f')), + ('cabinet_no', models.CharField(blank=True, max_length=32, verbose_name='\u673a\u67dc\u53f7')), + ('cabinet_pos', models.IntegerField(blank=True, verbose_name='\u673a\u5668\u4f4d\u7f6e')), + ('number', models.CharField(blank=True, max_length=32, unique=True, verbose_name='\u8d44\u4ea7\u7f16\u53f7')), + ('sn', models.CharField(blank=True, max_length=128, unique=True, verbose_name='SN\u7f16\u53f7')), + ('created_by', models.CharField(blank=True, max_length=32, verbose_name='\u521b\u5efa\u8005')), ('is_active', models.BooleanField(default=True, verbose_name='\u662f\u5426\u6fc0\u6d3b')), ('date_added', models.DateTimeField(auto_now=True, null=True)), - ('comment', models.CharField(blank=True, max_length=128, null=True, verbose_name='\u5907\u6ce8')), + ('comment', models.CharField(blank=True, max_length=128, verbose_name='\u5907\u6ce8')), ], options={ 'db_table': 'asset', @@ -55,7 +55,7 @@ class Migration(migrations.Migration): fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('name', models.CharField(max_length=64, unique=True)), - ('created_by', models.CharField(blank=True, max_length=32, null=True, verbose_name='\u521b\u5efa\u8005')), + ('created_by', models.CharField(blank=True, max_length=32, verbose_name='\u521b\u5efa\u8005')), ('comment', models.CharField(blank=True, max_length=128, null=True)), ], options={ @@ -67,15 +67,15 @@ class Migration(migrations.Migration): fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('name', models.CharField(max_length=32, verbose_name='\u673a\u623f\u540d\u79f0')), - ('bandwidth', models.CharField(blank=True, default='', max_length=32, null=True, verbose_name='\u673a\u623f\u5e26\u5bbd')), - ('contact', models.CharField(blank=True, default='', max_length=16, null=True, verbose_name='\u8054\u7cfb\u4eba')), - ('phone', models.CharField(blank=True, default='', max_length=32, null=True, verbose_name='\u8054\u7cfb\u7535\u8bdd')), - ('address', models.CharField(blank=True, default='', max_length=128, null=True, verbose_name='\u673a\u623f\u5730\u5740')), - ('network', models.TextField(blank=True, default='', null=True, verbose_name='IP\u5730\u5740\u6bb5')), + ('bandwidth', models.CharField(blank=True, max_length=32, verbose_name='\u673a\u623f\u5e26\u5bbd')), + ('contact', models.CharField(blank=True, max_length=16, verbose_name='\u8054\u7cfb\u4eba')), + ('phone', models.CharField(blank=True, max_length=32, verbose_name='\u8054\u7cfb\u7535\u8bdd')), + ('address', models.CharField(blank=True, max_length=128, verbose_name='\u673a\u623f\u5730\u5740')), + ('network', models.TextField(blank=True, verbose_name='IP\u5730\u5740\u6bb5')), ('date_added', models.DateField(auto_now=True, null=True)), - ('operator', models.CharField(blank=True, default='', max_length=32, null=True, verbose_name='\u8fd0\u8425\u5546')), - ('created_by', models.CharField(blank=True, max_length=32, null=True, verbose_name='\u521b\u5efa\u8005')), - ('comment', models.CharField(blank=True, default='', max_length=128, null=True, verbose_name='\u5907\u6ce8')), + ('operator', models.CharField(blank=True, max_length=32, verbose_name='\u8fd0\u8425\u5546')), + ('created_by', models.CharField(blank=True, max_length=32, verbose_name='\u521b\u5efa\u8005')), + ('comment', models.CharField(blank=True, max_length=128, verbose_name='\u5907\u6ce8')), ], options={ 'db_table': 'idc', diff --git a/apps/assets/migrations/0002_auto_20160821_1757.py b/apps/assets/migrations/0002_auto_20160821_1757.py new file mode 100644 index 000000000..e22966fd8 --- /dev/null +++ b/apps/assets/migrations/0002_auto_20160821_1757.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10 on 2016-08-21 09:57 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('assets', '0001_initial'), + ] + + operations = [ + migrations.AlterField( + model_name='asset', + name='cabinet_pos', + field=models.IntegerField(blank=True, max_length=4, verbose_name='\u673a\u5668\u4f4d\u7f6e'), + ), + ] diff --git a/apps/assets/migrations/0003_auto_20160821_1759.py b/apps/assets/migrations/0003_auto_20160821_1759.py new file mode 100644 index 000000000..e5c49bcd5 --- /dev/null +++ b/apps/assets/migrations/0003_auto_20160821_1759.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10 on 2016-08-21 09:59 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('assets', '0002_auto_20160821_1757'), + ] + + operations = [ + migrations.AlterField( + model_name='asset', + name='cabinet_pos', + field=models.IntegerField(blank=True, max_length=4, null=True, verbose_name='\u673a\u5668\u4f4d\u7f6e'), + ), + ] diff --git a/apps/assets/models.py b/apps/assets/models.py index 66612e7b4..d3a09d5ae 100644 --- a/apps/assets/models.py +++ b/apps/assets/models.py @@ -6,7 +6,7 @@ from django.db import models class AssetGroup(models.Model): name = models.CharField(max_length=64, unique=True) - created_by = models.CharField(max_length=32, blank=True, null=True, verbose_name=u"创建者") + created_by = models.CharField(max_length=32, blank=True, verbose_name=u"创建者") comment = models.CharField(max_length=128, blank=True, null=True) def __unicode__(self): @@ -18,15 +18,15 @@ 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, default='', verbose_name=u'机房带宽') - contact = models.CharField(max_length=16, blank=True, null=True, default='', verbose_name=u'联系人') - phone = models.CharField(max_length=32, blank=True, null=True, default='', verbose_name=u'联系电话') - address = models.CharField(max_length=128, blank=True, null=True, default='', verbose_name=u"机房地址") - network = models.TextField(blank=True, null=True, default='', verbose_name=u"IP地址段") + bandwidth = models.CharField(max_length=32, blank=True, verbose_name=u'机房带宽') + contact = models.CharField(max_length=16, blank=True, verbose_name=u'联系人') + phone = models.CharField(max_length=32, blank=True, verbose_name=u'联系电话') + address = models.CharField(max_length=128, blank=True, verbose_name=u"机房地址") + network = models.TextField(blank=True, verbose_name=u"IP地址段") date_added = models.DateField(auto_now=True, null=True) - operator = models.CharField(max_length=32, blank=True, default='', null=True, verbose_name=u"运营商") - created_by = models.CharField(max_length=32, blank=True, null=True, verbose_name=u"创建者") - comment = models.CharField(max_length=128, blank=True, default='', null=True, verbose_name=u"备注") + operator = models.CharField(max_length=32, blank=True, verbose_name=u"运营商") + created_by = models.CharField(max_length=32, blank=True, verbose_name=u"创建者") + comment = models.CharField(max_length=128, blank=True, verbose_name=u"备注") def __unicode__(self): return self.name @@ -43,31 +43,34 @@ class AssetExtend(models.Model): class Asset(models.Model): ip = models.CharField(max_length=32, blank=True, verbose_name="主机IP") - other_ip = models.CharField(max_length=255, blank=True, null=True, verbose_name="其他IP") - remote_card_ip = models.CharField(max_length=16, blank=True, null=True, verbose_name=u'远控卡IP') - hostname = models.CharField(unique=True, max_length=128, verbose_name=u"主机名") - port = models.IntegerField(blank=True, null=True, verbose_name=u"端口号") + other_ip = models.CharField(max_length=255, blank=True, verbose_name="其他IP") + remote_card_ip = models.CharField(max_length=16, blank=True, verbose_name=u'远控卡IP') + hostname = models.CharField(max_length=128, unique=True, blank=True, verbose_name=u"主机名") + port = models.IntegerField(blank=True, verbose_name=u"端口号") group = models.ManyToManyField(AssetGroup, blank=True, verbose_name=u"所属主机组") - username = models.CharField(max_length=16, blank=True, null=True, verbose_name=u"管理用户名") - password = models.CharField(max_length=256, blank=True, null=True, verbose_name=u"密码") - idc = models.ForeignKey(IDC, blank=True, null=True, on_delete=models.SET_NULL, verbose_name=u'机房') - mac_addr = models.CharField(max_length=20, blank=True, null=True, verbose_name=u"MAC地址") - brand = models.CharField(max_length=64, blank=True, null=True, verbose_name=u'硬件厂商型号') - cpu = models.CharField(max_length=64, blank=True, null=True, verbose_name=u'CPU') - memory = models.CharField(max_length=128, blank=True, null=True, verbose_name=u'内存') - disk = models.CharField(max_length=1024, blank=True, null=True, verbose_name=u'硬盘') - os = models.CharField(max_length=128, blank=True, null=True, verbose_name=u'系统信息') - cabinet_no = models.CharField(max_length=32, blank=True, null=True, verbose_name=u'机柜号') - cabinet_pos = models.IntegerField(blank=True, null=True, verbose_name=u'机器位置') - number = models.CharField(max_length=32, blank=True, null=True, verbose_name=u'资产编号') - status = models.ManyToManyField(AssetExtend, blank=True, related_name="asset_status_extend", verbose_name="机器状态") - type = models.ManyToManyField(AssetExtend, blank=True, related_name="asset_type_extend", verbose_name="机器类型") - env = models.ManyToManyField(AssetExtend, blank=True, related_name="asset_env_extend", verbose_name="所属主机组环境") - sn = models.CharField(max_length=128, blank=True, null=True, verbose_name=u"SN编号") - created_by = models.CharField(max_length=32, blank=True, null=True, verbose_name=u"创建者") + username = models.CharField(max_length=16, blank=True, verbose_name=u"管理用户名") + password = models.CharField(max_length=256, blank=True, verbose_name=u"密码") + idc = models.ForeignKey(IDC, blank=True, null=True, on_delete=models.SET_NULL, verbose_name=u'机房') + mac_addr = models.CharField(max_length=20, blank=True, unique=True, verbose_name=u"MAC地址") + brand = models.CharField(max_length=64, blank=True, verbose_name=u'硬件厂商型号') + cpu = models.CharField(max_length=64, blank=True, verbose_name=u'CPU') + memory = models.CharField(max_length=128, blank=True, verbose_name=u'内存') + disk = models.CharField(max_length=1024, blank=True, verbose_name=u'硬盘') + os = models.CharField(max_length=128, blank=True, verbose_name=u'系统信息') + cabinet_no = models.CharField(max_length=32, blank=True, verbose_name=u'机柜号') + cabinet_pos = models.IntegerField(max_length=4, null=True, blank=True, verbose_name=u'机器位置') + number = models.CharField(max_length=32, blank=True, unique=True, verbose_name=u'资产编号') + status = models.ManyToManyField(AssetExtend, blank=True, + related_name="asset_status_extend", verbose_name="机器状态") + type = models.ManyToManyField(AssetExtend, blank=True, + related_name="asset_type_extend", verbose_name="机器类型") + env = models.ManyToManyField(AssetExtend, blank=True, + related_name="asset_env_extend", verbose_name="所属主机组环境") + sn = models.CharField(max_length=128, blank=True, unique=True, verbose_name=u"SN编号") + created_by = models.CharField(max_length=32, blank=True, verbose_name=u"创建者") is_active = models.BooleanField(default=True, verbose_name=u"是否激活") date_added = models.DateTimeField(auto_now=True, null=True) - comment = models.CharField(max_length=128, blank=True, null=True, verbose_name=u"备注") + comment = models.CharField(max_length=128, blank=True, verbose_name=u"备注") def __unicode__(self): return self.ip diff --git a/apps/assets/templates/assets/asset_detail.html b/apps/assets/templates/assets/asset_detail.html new file mode 100644 index 000000000..5d8a48db9 --- /dev/null +++ b/apps/assets/templates/assets/asset_detail.html @@ -0,0 +1,374 @@ +{% extends 'base.html' %} +{% block content %} +
主机名 | +{{ asset.hostname|default_if_none:"" }} | +|
IP | +{{ asset.ip|default_if_none:"" }} | +|
其他IP | +
+
|
+ |
远控IP | +{{ asset.remote_ip|default_if_none:"" }} | +|
端口 | +{{ asset.port|default_if_none:"" }} | +|
主机组 | +
+
|
+ |
使用默认管理账号 | +{#{{ asset.use_default_auth|bool2str }} | #} +{#{{ asset.use_default_auth|bool2str }} {% if not asset.use_default_auth %} {{ asset.username }} {% endif %} | #} +
机房 | +{{ asset.idc.name|default_if_none:"" }} | +|
硬件厂商型号 | +{{ asset.brand|default_if_none:"" }} | +|
CPU | +{{ asset.cpu|default_if_none:"" }} | +|
内存 | +{{ asset.memory|default_if_none:"" }}{% if asset.memory %}G{% endif %} | +|
硬盘 | +
+
|
+ |
资产编号 | +{{ asset.number|default_if_none:"" }} | +|
SN | +{{ asset.sn|default_if_none:"" }} | +|
主机类型 | +{{ asset.get_asset_type_display|default_if_none:"" }} | +|
系统版本 | +{{ asset.system_type|default_if_none:"" }} {{ asset.system_version|default_if_none:"" }} | +|
系统平台 | +{{ asset.system_arch|default_if_none:"" }} | +|
运行环境 | +{{ asset.get_env_display|default_if_none:"" }} | +|
机器状态 | +{{ asset.get_status_display|default_if_none:"" }} | +|
机柜号 | +{{ asset.cabinet|default_if_none:"" }} | +|
机柜位置 | +{{ asset.position|default_if_none:"" }} | +|
激活 | +{{ asset.is_active }} | +|
添加日期 | +{{ asset.date_added|date:"Y-m-d H:i:s" }} | +|
备注 | +{{ asset.comment|default_if_none:"" }} | +
授权用户 | +关联用户 | + {% for perm in user_perm %} +|
{{ perm.0 }} | +
+
|
+
授权用户组 | +组详情 | + {% for user_group in user_group_perm %} +
{{ user_group }} | +详情 | +
授权规则 | +详情 | + {% for rule in user_rule_perm %} +
{{ rule }} | +详情 | +
(暂无)
+ {% endif %} +(暂无)
+ {% endif %} +Tips: 管理用户是服务器存在的root或拥有sudo的用户,用来推送系统用户
++
+
bK)c}
zK1>m^;^lrH>gQ`0{N=V7i&V~)aX+RDUAJrMk4G!8+7`Qzg}4IuW4h2JGUv`<+*OHn
zahBo=+>hx(Rb=jM-+0<=tJQ&Gal(33zmK?6`P>7QEZP|S*YpHEb+*cTwtDbZ}
zF5V-%@1f3v8#QwumR0J@U2owwVPGzL@^)og@ZRdlM?+fPG;v!nFuw~(U9ap?c3$+R
zsCWSj+pLAJ#5i5b)^kQSadR{@W@$_pRhW2pwbQgmOil?8RHvj=`lo#FIw2Lq;9(*z
zzg(H&K+e?8>EC}wT#KnYRbFKg@Q}%&X!oA*+ROg@?2im9AD6Veelxe~kDY0BD#L<9
ztPLvvH76>FFXukXf1+k?=kYhuN2lAL-TBwi?m{Vl*paF4?$3yJjd}a)>2IaetgBwN
z&O4E~I%-GOg!(Ag>yD;tA9ctqTNc|X^7E+KN}f}toqj3%W46x`dUC1ugV~gl|E?*q
zmmWKXKRH$VA;s|M$%5u6xKLPknXLPRYI66uME4>5?7sG2%5@|-y@LCO^OpjeHUkJ;>{
zlcbbyWQRK0;dt|JW8aZj1k1yc3;Y@h7S5WlGW?|XcUpcz{V2Woy32ojQA^-f=B1~J
z_1&MBvdS8IzARh01VklempArKtjK6vy9Qpqom0`&H@Qj=!Qnt!VuDO$q$CJ}2#3TO
zh=BxWco<0}&c`v~C3tDp@lBG?Y0Nh=UfrA-iIw_(m=rGn89(AxClDfIzq6*Lv>)oz
zFA@G@2?TzNfa`~-i3nxVLn_caUB25IpY!Q;G_W(iB`SoHKK$coO;>wHFZ)lw`vaSWnMp;$
lQ&~RpI64-Rxb7Cr
z1KO(5JCjB78>y
{E
z%HXy^%jDUwk5OZwC6HnjWEr8m?0Lb`ank9=s52oo>QL*{6VVw&Yc&^n=NFJ(9&QY-
z8NUYV&e6t#O{b3<4SCWeOOj4Dpl2`)3Dv;=D;1Es>G@6`Jb6Hp3e;c3GT6j>Y}B2C
zz0j+pdjM92Jc0vykzn*
JV|yUci~!o8QdPHc%JGHi|v53m6
~n
z#}h}<{9>>^tps0ZERk-o7F!bjr=Z<#16AMD9zT(+VqBhs(OX4>IGtrUYIXMJW}!ki
z3mIQN2w0vX8Op2aSPivl{r{;-#D9k;TOK)4#${R1I#u)RW5;gDFkT{(9x=fCEA&F(
zR0K*d-CYYQ7jN5~V#A)_+dS%JzXQ#j@ozislymDbl-5@HCJpe*Azr9UGW$}}h91nG
zbS*Zq`e&~!^2w