From a36f8d74f6a50e117bff20ac870217675275b14b Mon Sep 17 00:00:00 2001 From: RobbieHan Date: Fri, 25 Jan 2019 14:34:42 +0800 Subject: [PATCH] cabinet --- apps/cmdb/urls.py | 9 +- apps/cmdb/views_eam.py | 38 +++++ apps/cmdb/views_scan.py | 30 +++- apps/custom.py | 4 +- templates/cmdb/cabinet.html | 276 +++++++++++++++++++++++++++++++ templates/cmdb/cabinet_form.html | 99 +++++++++++ templates/cmdb/device_scan.html | 27 +++ 7 files changed, 478 insertions(+), 5 deletions(-) create mode 100644 apps/cmdb/views_eam.py create mode 100644 templates/cmdb/cabinet.html create mode 100644 templates/cmdb/cabinet_form.html diff --git a/apps/cmdb/urls.py b/apps/cmdb/urls.py index f39f734..f58f0a7 100644 --- a/apps/cmdb/urls.py +++ b/apps/cmdb/urls.py @@ -1,7 +1,7 @@ from django.urls import path from .views import CmdbView -from . import views_code, views_scan +from . import views_code, views_scan, views_eam app_name = 'cmdb' @@ -19,5 +19,12 @@ urlpatterns = [ path('portal/device_scan/detail/', views_scan.DeviceScanDetailView.as_view(), name='portal-device_scan-detail'), path('portal/device_scan/delete/', views_scan.DeviceScanDeleteView.as_view(), name='portal-device_scan-delete'), path('portal/device_scan/exec/', views_scan.DeviceScanExecView.as_view(), name='portal-device_scan-exec'), + path('portal/device_scan/inbound/', views_scan.DeviceScanInboundView.as_view(), name='portal-device_scan-inbound'), + + path('eam/cabinet/', views_eam.CabinetView.as_view(), name='eam-cabinet'), + path('eam/cabinet/create/', views_eam.CabinetCreateView.as_view(), name='eam-cabinet-create'), + path('eam/cabinet/update/', views_eam.CabinetUpdateView.as_view(), name='eam-cabinet-update'), + path('eam/cabinet/list/', views_eam.CabinetListView.as_view(), name='eam-cabinet-list'), + path('eam/cabinet/delete/', views_eam.CabinetDeleteView.as_view(), name='eam-cabinet-delete'), ] diff --git a/apps/cmdb/views_eam.py b/apps/cmdb/views_eam.py new file mode 100644 index 0000000..68d9018 --- /dev/null +++ b/apps/cmdb/views_eam.py @@ -0,0 +1,38 @@ +from django.views.generic import TemplateView + +from system.mixin import LoginRequiredMixin +from custom import (BreadcrumbMixin, SandboxDeleteView, + SandboxListView, SandboxUpdateView, SandboxCreateView) +from .models import Cabinet + + +class CabinetView(LoginRequiredMixin, BreadcrumbMixin, TemplateView): + template_name = 'cmdb/cabinet.html' + + +class CabinetCreateView(SandboxCreateView): + model = Cabinet + fields = '__all__' + + +class CabinetUpdateView(SandboxUpdateView): + model = Cabinet + fields = '__all__' + + +class CabinetListView(SandboxListView): + model = Cabinet + fields = ['id', 'number', 'position', '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'] + return filters + + +class CabinetDeleteView(SandboxDeleteView): + model = Cabinet diff --git a/apps/cmdb/views_scan.py b/apps/cmdb/views_scan.py index 2791bb8..543dd06 100644 --- a/apps/cmdb/views_scan.py +++ b/apps/cmdb/views_scan.py @@ -16,7 +16,8 @@ from system.mixin import LoginRequiredMixin from custom import BreadcrumbMixin, SandboxListView, SandboxDeleteView from utils.sandbox_utils import ConfigFileMixin from system.models import Menu -from .models import DeviceScanInfo +from .models import (DeviceScanInfo, ConnectionInfo, DeviceInfo, + ConnectionAbstract, DeviceAbstract) from .tasks import scan_execution error_logger = logging.getLogger('sandbox_error') @@ -89,4 +90,29 @@ class DeviceScanExecView(LoginRequiredMixin, View): ret['status'] = 'success' except AlreadyQueued: ret['status'] = 'already_queued' - return JsonResponse(ret) \ No newline at end of file + return JsonResponse(ret) + + +class DeviceScanInboundView(LoginRequiredMixin, View): + def post(self, request): + ret = dict(result=False) + login_succeed = list(DeviceScanInfo.objects.filter(status='succeed').values()) + connection_fields = [field.name for field in ConnectionAbstract._meta.fields if field.name is not 'id'] + device_fields = [field.name for field in DeviceAbstract._meta.fields if field.name is not 'id'] + device_fields.append('hostname') + for host in login_succeed: + connection_defaults = {key: host[key] for key in host.keys() & connection_fields} + device_defaults = {key: host[key] for key in host.keys() & device_fields} + connection_info, _ = ConnectionInfo.objects.update_or_create( + hostname=host['hostname'], + defaults=connection_defaults + ) + connection_id = int(getattr(connection_info, 'id')) + device_defaults['dev_connection'] = connection_id + device_defaults['changed_by_id'] = request.user.id + DeviceInfo.objects.update_or_create( + hostname=host['hostname'], + defaults=device_defaults + ) + ret['result'] = True + return JsonResponse(ret) diff --git a/apps/custom.py b/apps/custom.py index 0315e2c..4490fd5 100644 --- a/apps/custom.py +++ b/apps/custom.py @@ -84,9 +84,9 @@ class SandboxMultipleObjectMixin: filters = self.get_filters() fields = self.get_fields() if filters: - queryset = queryset.filter(**self.filters) + queryset = queryset.filter(**filters) if fields: - queryset = queryset.values(*self.fields) + queryset = queryset.values(*fields) record_filter_count = queryset.count() diff --git a/templates/cmdb/cabinet.html b/templates/cmdb/cabinet.html new file mode 100644 index 0000000..219a504 --- /dev/null +++ b/templates/cmdb/cabinet.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/cabinet_form.html b/templates/cmdb/cabinet_form.html new file mode 100644 index 0000000..6541ed9 --- /dev/null +++ b/templates/cmdb/cabinet_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 diff --git a/templates/cmdb/device_scan.html b/templates/cmdb/device_scan.html index b753b05..55d751d 100644 --- a/templates/cmdb/device_scan.html +++ b/templates/cmdb/device_scan.html @@ -298,5 +298,32 @@ }); } + function doInbound() { + layer.alert('确定将扫描结果导入设备管理库吗?', { + title: '提示' + , icon: 3 + , time: 0 + , btn: ['YES', 'NO'] + , yes: function (index) { + layer.close(index); + $.ajax({ + type: "POST", + url: "{% url 'cmdb:portal-device_scan-inbound' %}", + data: {csrfmiddlewaretoken: '{{ csrf_token }}'}, + cache: false, + success: function (msg) { + if (msg.result) { + layer.alert('设备已入库', {icon: 1}); + } + else { + //alert(msg.message); + layer.alert('设备入库失败', {icon: 2}); + } + return; + } + }); + } + }); + } {% endblock %} \ No newline at end of file