From 667b4bc29c1d95f45da94525329e4aaed1653443 Mon Sep 17 00:00:00 2001 From: RobbieHan Date: Mon, 1 Apr 2019 10:26:16 +0800 Subject: [PATCH] network asset --- apps/cmdb/forms.py | 31 ++- apps/cmdb/models.py | 27 ++- apps/cmdb/urls.py | 6 + apps/cmdb/views_eam.py | 61 ++++- templates/cmdb/cabinet.html | 4 +- templates/cmdb/code.html | 4 +- templates/cmdb/network_asset.html | 306 ++++++++++++++++++++++++++ templates/cmdb/networkasset_form.html | 172 +++++++++++++++ templates/cmdb/supplier.html | 276 +++++++++++++++++++++++ templates/cmdb/supplier_form.html | 99 +++++++++ 10 files changed, 960 insertions(+), 26 deletions(-) create mode 100644 templates/cmdb/network_asset.html create mode 100644 templates/cmdb/networkasset_form.html create mode 100644 templates/cmdb/supplier.html create mode 100644 templates/cmdb/supplier_form.html diff --git a/apps/cmdb/forms.py b/apps/cmdb/forms.py index 0511b0c..33302ac 100644 --- a/apps/cmdb/forms.py +++ b/apps/cmdb/forms.py @@ -4,7 +4,7 @@ from django import forms -from .models import Code, DeviceInfo, ConnectionInfo, DeviceFile +from .models import Code, DeviceInfo, ConnectionInfo, DeviceFile, NetworkAsset class CodeCreateForm(forms.ModelForm): @@ -100,4 +100,31 @@ class ConnectionInfoForm(forms.ModelForm): class DeviceFileUploadForm(forms.ModelForm): class Meta: model = DeviceFile - fields = '__all__' \ No newline at end of file + fields = '__all__' + + +class NetworkAssetCreateForm(forms.ModelForm): + class Meta: + model = NetworkAsset + fields = '__all__' + error_messages = { + 'name': {'required': '请填写网络资产名称'}, + } + + def clean(self): + cleaned_data = super(NetworkAssetCreateForm, self).clean() + ip_address = cleaned_data.get('ip_address') + + if NetworkAsset.objects.filter(ip_address=ip_address).count(): + raise forms.ValidationError('资产地址已存在:{}已存在'.format(ip_address)) + + +class NetworkAssetUpdateForm(NetworkAssetCreateForm): + def clean(self): + cleaned_data = self.cleaned_data + ip_address = cleaned_data.get('ip_address') + + if self.instance: + matching_asset = NetworkAsset.objects.exclude(pk=self.instance.pk) + if matching_asset.filter(ip_address=ip_address).exists(): + raise forms.ValidationError('资产地址已存在:{}已存在'.format(ip_address)) \ No newline at end of file diff --git a/apps/cmdb/models.py b/apps/cmdb/models.py index a05aeee..00d63be 100644 --- a/apps/cmdb/models.py +++ b/apps/cmdb/models.py @@ -137,6 +137,9 @@ class NetworkAsset(models.Model): management = models.CharField(max_length=100, blank=True, default='', verbose_name='管理地址') show_on_top = models.BooleanField(default=False, verbose_name='首页展示') provider = models.ForeignKey('Supplier', blank=True, null=True, on_delete=models.SET_NULL, verbose_name='服务商') + state = models.BooleanField(default=True, verbose_name='状态') + buyDate = models.DateField(default=datetime.now, blank=True, null=True, verbose_name='购买日期') + warrantyDate = models.DateField(default=datetime.now, blank=True, null=True, verbose_name='到保日期') desc = models.TextField(blank=True, default='', verbose_name='备注信息') class Meta: @@ -144,6 +147,19 @@ class NetworkAsset(models.Model): verbose_name_plural = verbose_name +class NatRule(models.Model): + internet_ip = models.CharField(max_length=80, blank=True, default='', verbose_name='互联网IP') + src_port = models.IntegerField(blank=True, default='', verbose_name='源端口') + lan_ip = models.CharField(max_length=80, blank=True, default='', verbose_name='内网IP') + dest_port = models.IntegerField(blank=True, default='', verbose_name='目的端口') + state = models.BooleanField(default=True, verbose_name='状态') + desc = models.TextField(blank=True, default='', verbose_name='备注信息') + + class Meta: + verbose_name = 'NAT规则' + verbose_name_plural = verbose_name + + class DomainName(AbstractMode): dn_type_choices = (('1', '主域名'),('2', '二级域名')) domain = models.CharField(max_length=200, verbose_name='域名') @@ -165,14 +181,3 @@ class DomainName(AbstractMode): verbose_name_plural = verbose_name -class NatRule(models.Model): - internet_ip = models.CharField(max_length=80, blank=True, default='', verbose_name='互联网IP') - src_port = models.IntegerField(blank=True, default='', verbose_name='源端口') - lan_ip = models.CharField(max_length=80, blank=True, default='', verbose_name='内网IP') - dest_port = models.IntegerField(blank=True, default='', verbose_name='目的端口') - state = models.BooleanField(default=True, verbose_name='状态') - desc = models.TextField(blank=True, default='', verbose_name='备注信息') - - class Meta: - verbose_name = 'NAT规则' - verbose_name_plural = verbose_name \ No newline at end of file diff --git a/apps/cmdb/urls.py b/apps/cmdb/urls.py index 0f1e35c..87c2c3d 100644 --- a/apps/cmdb/urls.py +++ b/apps/cmdb/urls.py @@ -44,4 +44,10 @@ urlpatterns = [ path('eam/supplier/update/', views_eam.SupplierUpdateView.as_view(), name='eam-supplier-update'), path('eam/supplier/list/', views_eam.SupplierListView.as_view(), name='eam-supplier-list'), path('eam/supplier/delete/', views_eam.SupplierDeleteView.as_view(), name='eam-supplier-delete'), + + path('eam/network_asset/', views_eam.NetworkAssetView.as_view(), name='eam-network_asset'), + path('eam/network_asset/create/', views_eam.NetworkAssetCreateView.as_view(), name='eam-network_asset-create'), + path('eam/network_asset/update/', views_eam.NetworkAssetUpdateView.as_view(), name='eam-network_asset-update'), + path('eam/network_asset/list/', views_eam.NetworkAssetListView.as_view(), name='eam-network_asset-list'), + path('eam/network_asset/delete/', views_eam.NetworkAssetDeleteView.as_view(), name='eam-network_asset-delete'), ] diff --git a/apps/cmdb/views_eam.py b/apps/cmdb/views_eam.py index f0f76fd..e0b1e1c 100644 --- a/apps/cmdb/views_eam.py +++ b/apps/cmdb/views_eam.py @@ -11,8 +11,9 @@ from system.mixin import LoginRequiredMixin from custom import (BreadcrumbMixin, SandboxDeleteView, SandboxListView, SandboxUpdateView, SandboxCreateView) from .models import (Cabinet, DeviceInfo, Code, ConnectionInfo, DeviceFile, - Supplier) -from .forms import DeviceCreateForm, DeviceUpdateForm, ConnectionInfoForm, DeviceFileUploadForm + Supplier, NetworkAsset) +from .forms import (DeviceCreateForm, DeviceUpdateForm, ConnectionInfoForm, + DeviceFileUploadForm, NetworkAssetCreateForm, NetworkAssetUpdateForm) from utils.db_utils import MongodbDriver from utils.sandbox_utils import LoginExecution @@ -108,6 +109,8 @@ class DeviceListView(SandboxListView): device['service_type'] = get_object_or_404(Code, pk=int(service_type)).value if service_type else '' device['dev_cabinet'] = get_object_or_404(Cabinet, pk=int(dev_cabinet)).number if dev_cabinet else '' return context_data + + class DeviceCreateView(SandboxCreateView): model = DeviceInfo form_class = DeviceCreateForm @@ -115,7 +118,6 @@ class DeviceCreateView(SandboxCreateView): def get_context_data(self, **kwargs): public_data = get_device_public() kwargs.update(public_data) - print(public_data) return super().get_context_data(**kwargs) @@ -257,17 +259,58 @@ class SupplierUpdateView(SandboxUpdateView): class SupplierListView(SandboxListView): model = Supplier - fields = '__all__' + fields = ['id', 'firm', 'contact_details', 'desc'] def get_filters(self): data = self.request.GET filters = {} - if 'number' in data and data['number']: - filters['number__icontains'] = data['number'] - if 'position' in data and data['position']: - filters['position__icontains'] = data['position'] + if 'firm' in data and data['firm']: + filters['firm__icontains'] = data['firm'] + if 'contact_details' in data and data['contact_details']: + filters['contact_deatils__icontains'] = data['contact_details'] return filters class SupplierDeleteView(SandboxDeleteView): - model = Supplier \ No newline at end of file + model = Supplier + + +class NetworkAssetView(LoginRequiredMixin, BreadcrumbMixin, TemplateView): + template_name = 'cmdb/network_asset.html' + + +class NetworkAssetCreateView(SandboxCreateView): + model = NetworkAsset + form_class = NetworkAssetCreateForm + + def get_context_data(self, **kwargs): + kwargs['all_provider'] = Supplier.objects.all() + return super().get_context_data(**kwargs) + + +class NetworkAssetUpdateView(SandboxUpdateView): + model = NetworkAsset + form_class = NetworkAssetUpdateForm + + def get_context_data(self, **kwargs): + kwargs['all_provider'] = Supplier.objects.all() + return super().get_context_data(**kwargs) + + +class NetworkAssetListView(SandboxListView): + model = NetworkAsset + fields = ['id', 'name', 'ip_address', 'management', 'provider__firm', 'buyDate', 'warrantyDate', 'state'] + + def get_filters(self): + data = self.request.GET + filters = {} + if 'name' in data and data['name']: + filters['name__icontains'] = data['name'] + if 'ip_address' in data and data['ip_address']: + filters['ip_address__icontains'] = data['ip_address'] + return filters + + +class NetworkAssetDeleteView(SandboxDeleteView): + model = NetworkAsset + diff --git a/templates/cmdb/cabinet.html b/templates/cmdb/cabinet.html index 219a504..7245920 100644 --- a/templates/cmdb/cabinet.html +++ b/templates/cmdb/cabinet.html @@ -224,7 +224,7 @@ oDataTable.ajax.reload(); } else { //alert(msg.message); - layer.alert("操作失败", {icon: 2}); + layer.alert("没有权限", {icon: 2}); } return; } @@ -253,7 +253,7 @@ oDataTable.ajax.reload(); } else { //alert(msg.message); - layer.alert('删除失败', {icon: 2}); + layer.alert('没有权限', {icon: 2}); } return; } diff --git a/templates/cmdb/code.html b/templates/cmdb/code.html index b36f4d6..8cc8d2c 100644 --- a/templates/cmdb/code.html +++ b/templates/cmdb/code.html @@ -232,7 +232,7 @@ oDataTable.ajax.reload(); } else { //alert(msg.message); - layer.alert("操作失败", {icon: 2}); + layer.alert("没有权限", {icon: 2}); } return; } @@ -261,7 +261,7 @@ oDataTable.ajax.reload(); } else { //alert(msg.message); - layer.alert('删除失败', {icon: 2}); + layer.alert('没有权限', {icon: 2}); } return; } diff --git a/templates/cmdb/network_asset.html b/templates/cmdb/network_asset.html new file mode 100644 index 0000000..51f319d --- /dev/null +++ b/templates/cmdb/network_asset.html @@ -0,0 +1,306 @@ +{% extends "base-left.html" %} +{% load staticfiles %} + +{% block css %} + + + +{% endblock %} + +{% block content %} + + +
+
+
+
+
+ +
+
 
+
+ + +
+
 
+
+ +
+
+
+
+ + +
+
+ + +
+ +
+
+
+ +
+ + + + + + + + + + + + + + + + + +
ID资产名称IP地址管理地址服务商购买日期到期时间状态操作
+

+
+
+
+ +
+ + + +{% endblock %} + + +{% block javascripts %} + + + + + + + +{% endblock %} \ No newline at end of file diff --git a/templates/cmdb/networkasset_form.html b/templates/cmdb/networkasset_form.html new file mode 100644 index 0000000..493dc02 --- /dev/null +++ b/templates/cmdb/networkasset_form.html @@ -0,0 +1,172 @@ +{% extends 'base-layer.html' %} +{% load staticfiles %} + +{% block css %} + + + +{% endblock %} + +{% block main %} +
+
+ + {% csrf_token %} +
+
+ + +
+ +
+ +
+ +
+ +
+
+
+ +
+ +
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ + +
+ +
+ + +
+
+ +
+ +
+ +
+
+ +
+
+ + +
+
+ +{% endblock %} + +{% block javascripts %} + + + + +{% endblock %} \ No newline at end of file diff --git a/templates/cmdb/supplier.html b/templates/cmdb/supplier.html new file mode 100644 index 0000000..e04aa61 --- /dev/null +++ b/templates/cmdb/supplier.html @@ -0,0 +1,276 @@ +{% extends "base-left.html" %} +{% load staticfiles %} + +{% block css %} + + + +{% endblock %} + +{% block content %} + + +
+
+
+
+
+ +
+
 
+
+ + +
+
 
+
+ +
+
+
+
+ + +
+
+ + +
+ +
+
+
+ +
+ + + + + + + + + + + + + +
ID供应商联系信息备注信息操作
+

+
+
+
+ +
+ + + +{% endblock %} + + +{% block javascripts %} + + + + + + + +{% endblock %} \ No newline at end of file diff --git a/templates/cmdb/supplier_form.html b/templates/cmdb/supplier_form.html new file mode 100644 index 0000000..9bbd2e4 --- /dev/null +++ b/templates/cmdb/supplier_form.html @@ -0,0 +1,99 @@ +{% extends 'base-layer.html' %} +{% load staticfiles %} +{% block css %} + + +{% endblock %} +{% block main %} +
+
+ + {% csrf_token %} +
+
+ +

+
+ +
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+ +
+
+ + +
+
+ +{% endblock %} + +{% block javascripts %} + + + +{% endblock %} \ No newline at end of file