| + | ID | +主机名 | +SN编号 | +系统类型 | +设备类型 | +设备地址 | +MAC地址 | +责任人 | +操作 | +
|---|
+
diff --git a/apps/cmdb/forms.py b/apps/cmdb/forms.py
index 4f44c9b..6a2cd55 100644
--- a/apps/cmdb/forms.py
+++ b/apps/cmdb/forms.py
@@ -4,7 +4,7 @@
from django import forms
-from .models import Code
+from .models import Code, DeviceInfo
class CodeCreateForm(forms.ModelForm):
@@ -43,4 +43,33 @@ class CodeUpdateForm(CodeCreateForm):
raise forms.ValidationError(msg)
if matching_code.filter(value=value).exists():
msg = 'value:{} 已经存在'.format(value)
- raise forms.ValidationError(msg)
\ No newline at end of file
+ raise forms.ValidationError(msg)
+
+
+class DeviceCreateForm(forms.ModelForm):
+ class Meta:
+ model = DeviceInfo
+ exclude = ['dev_connection']
+ error_messages = {
+ 'hostname': {'required': '请填写设备地址'},
+ 'buyDate': {'required': '请填写购买日期'},
+ 'warrantyDate': {'required': '请填写到保日期'}
+ }
+
+ def clean(self):
+ cleaned_data = super(DeviceCreateForm, self).clean()
+ hostname = cleaned_data.get('hostname')
+
+ if DeviceInfo.objects.filter(hostname=hostname).count():
+ raise forms.ValidationError('设备地址:{}已存在'.format(hostname))
+
+
+class DeviceUpdateForm(DeviceCreateForm):
+ def clean(self):
+ cleaned_data = self.cleaned_data
+ hostname = cleaned_data.get('hostname')
+
+ if self.instance:
+ matching_device = DeviceInfo.objects.exclude(pk=self.instance.pk)
+ if matching_device.filter(hostname=hostname).exists():
+ raise forms.ValidationError('设备地址:{}已存在'.format(hostname))
\ No newline at end of file
diff --git a/apps/cmdb/models.py b/apps/cmdb/models.py
index 1151a50..41840d2 100644
--- a/apps/cmdb/models.py
+++ b/apps/cmdb/models.py
@@ -53,11 +53,11 @@ class ConnectionAbstract(models.Model):
class DeviceAbstract(models.Model):
- sys_hostname = models.CharField(max_length=50, blank=True, default='', verbose_name='主机名')
- mac_address = models.CharField(max_length=50, blank=True, default='', verbose_name='MAC地址')
- sn_number = models.CharField(max_length=50, blank=True, default='', verbose_name='SN号码')
- os_type = models.CharField(max_length=50, blank=True, default='', verbose_name='系统类型')
- device_type = models.CharField(max_length=50, blank=True, default='', verbose_name='设备类型')
+ sys_hostname = models.CharField(max_length=150, blank=True, default='', verbose_name='主机名')
+ mac_address = models.CharField(max_length=150, blank=True, default='', verbose_name='MAC地址')
+ sn_number = models.CharField(max_length=150, blank=True, default='', verbose_name='SN号码')
+ os_type = models.CharField(max_length=150, blank=True, default='', verbose_name='系统类型')
+ device_type = models.CharField(max_length=150, blank=True, default='', verbose_name='设备类型')
class Meta:
abstract = True
@@ -100,7 +100,7 @@ class DeviceInfo(AbstractMode, DeviceAbstract, TimeAbstract):
warrantyDate = models.DateField(default=datetime.now, verbose_name="到保日期")
desc = models.TextField(blank=True, default='', verbose_name='备注信息')
changed_by = models.ForeignKey(User, null=True, blank=True, on_delete=models.SET_NULL)
- history = HistoricalRecords(excluded_fields=['add_time', 'modify_time'])
+ history = HistoricalRecords(excluded_fields=['add_time', 'modify_time', 'parent'])
class Meta:
verbose_name = '设备信息'
diff --git a/apps/cmdb/urls.py b/apps/cmdb/urls.py
index f58f0a7..bc68639 100644
--- a/apps/cmdb/urls.py
+++ b/apps/cmdb/urls.py
@@ -27,4 +27,10 @@ urlpatterns = [
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'),
+ path('eam/device/', views_eam.DeviceView.as_view(), name='eam-device'),
+ path('eam/device/create/', views_eam.DeviceCreateView.as_view(), name='eam-device-create'),
+ path('eam/device/update/', views_eam.DeviceUpdateView.as_view(), name='eam-device-update'),
+ path('eam/device/list/', views_eam.DeviceListView.as_view(), name='eam-device-list'),
+ path('eam/device/delete/', views_eam.DeviceDeleteView.as_view(), name='eam-device-delete'),
+
]
diff --git a/apps/cmdb/views_eam.py b/apps/cmdb/views_eam.py
index 68d9018..c522681 100644
--- a/apps/cmdb/views_eam.py
+++ b/apps/cmdb/views_eam.py
@@ -1,9 +1,14 @@
from django.views.generic import TemplateView
+from django.contrib.auth import get_user_model
+from django.shortcuts import get_object_or_404
from system.mixin import LoginRequiredMixin
from custom import (BreadcrumbMixin, SandboxDeleteView,
SandboxListView, SandboxUpdateView, SandboxCreateView)
-from .models import Cabinet
+from .models import Cabinet, DeviceInfo, Code
+from .forms import DeviceCreateForm, DeviceUpdateForm
+
+User = get_user_model()
class CabinetView(LoginRequiredMixin, BreadcrumbMixin, TemplateView):
@@ -36,3 +41,80 @@ class CabinetListView(SandboxListView):
class CabinetDeleteView(SandboxDeleteView):
model = Cabinet
+
+
+def get_device_public():
+ all_code = Code.objects.all()
+ all_cabinet = Cabinet.objects.all()
+ all_user = User.objects.all()
+ all_device = DeviceInfo.objects.all()
+ ret = {
+ 'all_code': all_code,
+ 'all_cabinet': all_cabinet,
+ 'all_user': all_user,
+ 'all_device': all_device,
+ }
+ return ret
+
+
+class DeviceView(LoginRequiredMixin, BreadcrumbMixin, TemplateView):
+ template_name = 'cmdb/deviceinfo.html'
+
+ def get_context_data(self, **kwargs):
+ device_public = get_device_public()
+ kwargs.update(device_public)
+ return super().get_context_data(**kwargs)
+
+
+class DeviceListView(SandboxListView):
+ model = DeviceInfo
+ fields = ['id', 'sys_hostname', 'sn_number', 'os_type', 'device_type', 'hostname', 'mac_address', 'leader']
+
+ def get_filters(self):
+ data = self.request.GET
+ filters = {}
+ if 'sys_hostname' in data and data['sys_hostname']:
+ filters['sys_hostname__icontains'] = data['sys_hostname']
+ if 'hostname' in data and data['hostname']:
+ filters['hostname__icontains'] = data['hostname']
+ if 'network_type' in data and data['network_type']:
+ filters['network_type'] = data['network_type']
+ if 'service_type' in data and data['service_type']:
+ filters['service_type'] = data['service_type']
+ if 'operation_type' in data and data['operation_type']:
+ filters['operation_type'] = data['operation_type']
+ return filters
+
+ def get_datatables_paginator(self, request):
+ context_data = super().get_datatables_paginator(request)
+ data = context_data['data']
+ for device in data:
+ user_id = device['leader']
+ device['leader'] = get_object_or_404(
+ User, pk=int(user_id)).name if user_id else ''
+ return context_data
+
+
+class DeviceCreateView(SandboxCreateView):
+ model = DeviceInfo
+ form_class = DeviceCreateForm
+
+ def get_context_data(self, **kwargs):
+ public_data = get_device_public()
+ kwargs.update(public_data)
+ print(public_data)
+ return super().get_context_data(**kwargs)
+
+
+class DeviceUpdateView(SandboxUpdateView):
+ model = DeviceInfo
+ form_class = DeviceUpdateForm
+
+ def get_context_data(self, **kwargs):
+ public_data = get_device_public()
+ kwargs.update(public_data)
+ return super().get_context_data(**kwargs)
+
+
+class DeviceDeleteView(SandboxDeleteView):
+ model = DeviceInfo
diff --git a/requirements/pro.txt b/requirements/pro.txt
index a9b6246..b04e5cd 100644
--- a/requirements/pro.txt
+++ b/requirements/pro.txt
@@ -1,4 +1,4 @@
-django==2.1.2
+django==2.1.5
pillow==5.3.0
mysqlclient==1.3.13
ipython==7.1.1
diff --git a/templates/cmdb/deviceinfo.html b/templates/cmdb/deviceinfo.html
new file mode 100644
index 0000000..b3a7433
--- /dev/null
+++ b/templates/cmdb/deviceinfo.html
@@ -0,0 +1,329 @@
+{% extends "base-left.html" %}
+{% load staticfiles %}
+
+{% block css %}
+
+
+
+{% endblock %}
+
+{% block content %}
+
+
+
+
+
+
+
+
+
+
+
+ ID
+ 主机名
+ SN编号
+ 系统类型
+ 设备类型
+ 设备地址
+ MAC地址
+ 责任人
+ 操作
+
+