From 9d0bd95b69a528880d481a8f84e310d469c2fa75 Mon Sep 17 00:00:00 2001 From: RobbieHan Date: Thu, 3 Jan 2019 20:54:17 +0800 Subject: [PATCH] device models --- apps/cmdb/models.py | 100 +++++++++++++++++++++++++++++++++++++++- apps/cmdb/views_code.py | 4 +- 2 files changed, 100 insertions(+), 4 deletions(-) diff --git a/apps/cmdb/models.py b/apps/cmdb/models.py index f231cf1..6927c8d 100644 --- a/apps/cmdb/models.py +++ b/apps/cmdb/models.py @@ -1,6 +1,11 @@ -from django.db import models +import os +from datetime import datetime -# Create your models here. +from django.db import models +from django.contrib.auth import get_user_model +from django.dispatch import receiver + +User = get_user_model() class AbstractMode(models.Model): @@ -20,3 +25,94 @@ class Code(AbstractMode): class Meta: verbose_name = '字典' verbose_name_plural = verbose_name + + +class TimeAbstract(models.Model): + add_time = models.DateTimeField(auto_now_add=True, verbose_name="添加时间") + modify_time = models.DateTimeField(auto_now=True, verbose_name="更新时间") + + class Meta: + abstract = True + + +class ConnectionAbstract(models.Model): + auth_method_choices = ( + ('private_key', '密钥认证'), + ('password', '密码认证') + ) + hostname = models.CharField(max_length=50, verbose_name='设备地址(IP或域名)') + port = models.IntegerField(default=22, verbose_name='SSH端口') + username = models.CharField(max_length=15, blank=True, default='', verbose_name='SSH用户名') + password = models.CharField(max_length=80, blank=True, default='', verbose_name='SSH密码') + private_key = models.CharField(max_length=100, blank=True, default='', verbose_name='密钥路径') + auth_type = models.CharField(max_length=30, choices=auth_method_choices, default='') + status = models.CharField(max_length=10, blank=True, default='') + + class Meta: + abstract = True + + +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='设备类型') + + class Meta: + abstract = True + + +class DeviceScanInfo(ConnectionAbstract, DeviceAbstract, TimeAbstract): + error_message = models.CharField(max_length=80, blank=True, default='', verbose_name='错误信息') + + class Meta: + verbose_name = '扫描信息' + verbose_name_plural = verbose_name + + +class ConnectionInfo(ConnectionAbstract, TimeAbstract): + + class Meta: + verbose_name = 'SSH连接信息' + verbose_name_plural = verbose_name + + +class Cabinet(models.Model): + number = models.CharField(max_length=50, verbose_name='机柜编号') + position = models.CharField(max_length=80, verbose_name='机柜位置') + desc = models.TextField(blank=True, default='', verbose_name='备注信息') + + class Meta: + verbose_name = '机柜信息' + verbose_name_plural = verbose_name + + +class DeviceInfo(AbstractMode, DeviceAbstract, TimeAbstract): + hostname = models.CharField(max_length=50, verbose_name='设备地址(IP或域名)') + network_type = models.IntegerField(blank=True, null=True, verbose_name='网络类型') + service_type = models.IntegerField(blank=True, null=True, verbose_name='服务类型') + operation_type = models.IntegerField(blank=True, null=True, verbose_name='业务类型') + leader = models.IntegerField(blank=True, null=True, verbose_name='责任人') + dev_cabinet = models.IntegerField(blank=True, null=True, verbose_name='机柜信息') + dev_connection = models.IntegerField(blank=True, null=True, verbose_name='连接信息') + buyDate = models.DateField(default=datetime.now, verbose_name="购买日期") + warrantyDate = models.DateField(default=datetime.now, verbose_name="到保日期") + desc = models.TextField(blank=True, default='', verbose_name='备注信息') + + class Meta: + verbose_name = '设备信息' + verbose_name_plural = verbose_name + + +class DeviceFile(TimeAbstract): + device = models.ForeignKey('DeviceInfo', blank=True, null=True, on_delete=models.SET_NULL, verbose_name='设备') + file_content = models.FileField(upload_to="asset_file/%Y/%m", null=True, blank=True, verbose_name="资产文件") + upload_user = models.CharField(max_length=20, verbose_name="上传人") + + +@receiver(models.signals.post_delete, sender=DeviceFile) +def auto_delete_file(sender, instance, **kwargs): + if instance.file_content: + if os.path.isfile(instance.file_content.path): + os.remove(instance.file_content.path) diff --git a/apps/cmdb/views_code.py b/apps/cmdb/views_code.py index af63d20..ca45aa4 100644 --- a/apps/cmdb/views_code.py +++ b/apps/cmdb/views_code.py @@ -15,8 +15,8 @@ class CodeView(LoginRequiredMixin, BreadcrumbMixin, TemplateView): template_name = 'cmdb/code.html' def get_context_data(self): - context = dict(code_parent=Code.objects.filter(parent=None)) - return context + self.kwargs['code_parent'] = Code.objects.filter(parent=None) + return super().get_context_data(**self.kwargs) class CodeCreateView(SandboxCreateView):