From fcd39370ed14f3348602bc4f0897a1c4e562f3eb Mon Sep 17 00:00:00 2001 From: wangyong <864072399@qq.com> Date: Sun, 14 Aug 2016 22:10:10 +0800 Subject: [PATCH] add asset some cbv --- apps/assets/forms.py | 35 ++ apps/assets/migrations/0001_initial.py | 111 +++++ apps/assets/models.py | 84 +++- apps/assets/templates/assets/asset_add.html | 197 +++++++++ apps/assets/templates/assets/asset_list.html | 430 +++++++++++++++++++ apps/assets/templates/assets/example.html | 0 apps/assets/urls.py | 11 + apps/assets/views.py | 55 ++- apps/jumpserver/urls.py | 1 + 9 files changed, 921 insertions(+), 3 deletions(-) create mode 100644 apps/assets/forms.py create mode 100644 apps/assets/migrations/0001_initial.py create mode 100644 apps/assets/templates/assets/asset_add.html create mode 100644 apps/assets/templates/assets/asset_list.html delete mode 100644 apps/assets/templates/assets/example.html diff --git a/apps/assets/forms.py b/apps/assets/forms.py new file mode 100644 index 000000000..0c6ac66e4 --- /dev/null +++ b/apps/assets/forms.py @@ -0,0 +1,35 @@ +# coding:utf-8 +from django import forms + +from .models import IDC, Asset, AssetGroup + + +class AssetForm(forms.ModelForm): + + class Meta: + model = Asset + + fields = [ + "ip", "other_ip", "hostname", "port", "group", "username", "password", "idc", "mac_addr", + "remote_card_ip", "brand", "cpu", "memory", "disk", "os", "cabinet_no", "cabinet_pos", + "number", "status", "type", "env", "sn", "is_active", "comment" + ] + + +class AssetGroupForm(forms.ModelForm): + class Meta: + model = AssetGroup + fields = [ + "name", "comment" + ] + + +class IdcForm(forms.ModelForm): + class Meta: + model = IDC + fields = ['name', "bandwidth", "operator", 'contact', 'phone', 'address', 'network', 'comment'] + widgets = { + 'name': forms.TextInput(attrs={'placeholder': 'Name'}), + 'network': forms.Textarea( + attrs={'placeholder': '192.168.1.0/24\n192.168.2.0/24'}) + } diff --git a/apps/assets/migrations/0001_initial.py b/apps/assets/migrations/0001_initial.py new file mode 100644 index 000000000..c6784a4ac --- /dev/null +++ b/apps/assets/migrations/0001_initial.py @@ -0,0 +1,111 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10 on 2016-08-14 08:12 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='Asset', + 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')), + ('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')), + ], + options={ + 'db_table': 'asset', + }, + ), + migrations.CreateModel( + name='AssetExtend', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ], + ), + migrations.CreateModel( + name='AssetGroup', + 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')), + ('comment', models.CharField(blank=True, max_length=128, null=True)), + ], + options={ + 'db_table': 'assetgroup', + }, + ), + migrations.CreateModel( + name='IDC', + 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')), + ('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')), + ], + options={ + 'db_table': 'idc', + 'verbose_name': 'IDC\u673a\u623f', + 'verbose_name_plural': 'IDC\u673a\u623f', + }, + ), + migrations.AddField( + model_name='asset', + name='env', + field=models.ManyToManyField(blank=True, related_name='asset_env_extend', to='assets.AssetExtend', verbose_name='\u6240\u5c5e\u4e3b\u673a\u7ec4\u73af\u5883'), + ), + migrations.AddField( + model_name='asset', + name='group', + field=models.ManyToManyField(blank=True, to='assets.AssetGroup', verbose_name='\u6240\u5c5e\u4e3b\u673a\u7ec4'), + ), + migrations.AddField( + model_name='asset', + name='idc', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='assets.IDC', verbose_name='\u673a\u623f'), + ), + migrations.AddField( + model_name='asset', + name='status', + field=models.ManyToManyField(blank=True, related_name='asset_status_extend', to='assets.AssetExtend', verbose_name='\u673a\u5668\u72b6\u6001'), + ), + migrations.AddField( + model_name='asset', + name='type', + field=models.ManyToManyField(blank=True, related_name='asset_type_extend', to='assets.AssetExtend', verbose_name='\u673a\u5668\u7c7b\u578b'), + ), + ] diff --git a/apps/assets/models.py b/apps/assets/models.py index bd4b2abe9..66612e7b4 100644 --- a/apps/assets/models.py +++ b/apps/assets/models.py @@ -1,5 +1,87 @@ +# coding:utf-8 from __future__ import unicode_literals from django.db import models -# Create your models here. + +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"创建者") + comment = models.CharField(max_length=128, blank=True, null=True) + + def __unicode__(self): + return self.name + + class Meta: + db_table = 'assetgroup' + + +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地址段") + 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"备注") + + def __unicode__(self): + return self.name + + class Meta: + db_table = 'idc' + verbose_name = u"IDC机房" + verbose_name_plural = verbose_name + + +class AssetExtend(models.Model): + pass + + +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"端口号") + 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"创建者") + 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"备注") + + def __unicode__(self): + return self.ip + + class Meta: + db_table = 'asset' + + + + + + + + + + + diff --git a/apps/assets/templates/assets/asset_add.html b/apps/assets/templates/assets/asset_add.html new file mode 100644 index 000000000..f42a06c9f --- /dev/null +++ b/apps/assets/templates/assets/asset_add.html @@ -0,0 +1,197 @@ +{% extends 'base.html' %} +{% load bootstrap %} +{% block content %} +
+
+
+
+
+
填写资产基本信息
+ +
+ +
+
+ +
+
+
+ {% if error %} +
{{ error }}
+ {% endif %} + {% if msg %} +
{{ msg }}
+ {% endif %} + +
+ {% csrf_token %} + + {{ form.hostname|bootstrap_horizontal }} + +
+ {{ form.ip|bootstrap_horizontal }} +

Tips: 如果IP地址不填写, IP默认会设置与主机名一致

+ +{#
#} +{#
#} +{# #} +{#
#} +{#
#} +{# #} +{#
#} +{#
#} +{#
#} +{#

Tips: 管理用户是服务器存在的root或拥有sudo的用户,用来推送系统用户

#} +{# #} + +
+
+ +
+ +
+
+ +
+ {{ form.group|bootstrap_horizontal }} + +{# {{ af.is_active|bootstrap_horizontal }}#} + +
+
+
+
+ + +
+
+
+ +
+
+
+ + +
+
+
+
+
+
+
+
+
+
+
+
+{% endblock %} + +{% block self_footer_js %} + + +{% endblock %} \ No newline at end of file diff --git a/apps/assets/templates/assets/asset_list.html b/apps/assets/templates/assets/asset_list.html new file mode 100644 index 000000000..53288cb83 --- /dev/null +++ b/apps/assets/templates/assets/asset_list.html @@ -0,0 +1,430 @@ +{% extends 'base.html' %} +{% block content %} + +
+
+
+
+
+
主机详细信息列表
+ +
+ +
+
+ + +
+ + + + + + + +
+ +
+
+ + +
+ + +
+
+
+
+ + + + + + + + +{# #} + + + + + + + + + {% for asset in assets %} + + + + + +{# #} +{# #} + + + + + + + {% endfor %} + +
+ + 主机名 IP地址 IDC 所属主机组 配置信息 操作系统 cpu核数 内存 硬盘 操作
+ + {{ asset.hostname|default_if_none:"" }} {{ asset.ip|default_if_none:"" }} {{ asset.idc.name|default_if_none:"" }} {{ asset.group.all|group_str2 }}{{ asset.cpu }}|{{ asset.memory }}|{{ asset.disk }}{{ asset.system_type|default_if_none:"" }}{{ asset.system_version|default_if_none:"" }} {{ asset.cpu|default_if_none:"" }} {{ asset.memory|default_if_none:"" }}{% if asset.memory %}G{% endif %} {{ asset.disk }}{% if asset.disk %}G{% endif %} +{# 编辑#} + 连接 +{# 删除#} +
+
+
+ +{# 修改#} + +{# #} + +
+{# {% include 'paginator.html' %}#} +
+
+
+
+
+
+
+{% endblock %} + +{% block self_footer_js %} + + +{% endblock %} diff --git a/apps/assets/templates/assets/example.html b/apps/assets/templates/assets/example.html deleted file mode 100644 index e69de29bb..000000000 diff --git a/apps/assets/urls.py b/apps/assets/urls.py index 39b3350fb..6b19a7de6 100644 --- a/apps/assets/urls.py +++ b/apps/assets/urls.py @@ -1 +1,12 @@ +# coding:utf-8 from django.conf.urls import url +from .views import * + +app_name = 'assets' + +urlpatterns = [ + url(r'^add/$', AssetAddView.as_view(), name='asset-add'), + url(r'^list/$', AssetListView.as_view(), name='asset-list'), + url(r'^(?P[0-9]+)/delete/$', AssetDeleteView.as_view(), name='asset-list'), + url(r'^(?P[0-9]+)/detail/$', AssetDetailView.as_view(), name='asset-detail'), +] diff --git a/apps/assets/views.py b/apps/assets/views.py index 91ea44a21..af451f4b7 100644 --- a/apps/assets/views.py +++ b/apps/assets/views.py @@ -1,3 +1,54 @@ -from django.shortcuts import render +from django.views.generic import ( + TemplateView, ListView +) + +from django.urls import reverse_lazy + + +from django.views.generic.edit import ( + CreateView, DeleteView, FormView, UpdateView +) + + +from django.views.generic.detail import ( + DetailView +) + + +from .models import ( + Asset, AssetGroup, IDC, AssetExtend +) + + +from .forms import ( + AssetForm, +) + + +class AssetAddView(CreateView): + model = Asset + form_class = AssetForm + template_name = 'assets/asset_add.html' + success_url = reverse_lazy('assets:asset-list') + + +class AssetEdit(): + pass + + +class AssetDeleteView(DeleteView): + model = Asset + success_url = reverse_lazy('assets:asset-list') + + +class AssetListView(ListView): + model = Asset + context_object_name = 'assets' + template_name = 'assets/asset_list.html' + + +class AssetDetailView(DetailView): + model = Asset + context_object_name = 'asset' + template_name = 'assets/asset_detail.html' -# Create your views here. diff --git a/apps/jumpserver/urls.py b/apps/jumpserver/urls.py index c048ceeff..f86796eb8 100644 --- a/apps/jumpserver/urls.py +++ b/apps/jumpserver/urls.py @@ -18,5 +18,6 @@ from django.conf.urls import url, include urlpatterns = [ url(r'^users/', include('users.urls')), + url(r'^assets/', include('assets.urls')), # url(r'^admin/', admin.site.urls), ]