|
|
@@ -21,50 +21,50 @@ class Category(models.Model):
|
|
|
class Asset(models.Model):
|
|
|
"""硬件资产"""
|
|
|
|
|
|
- STATUS_CHOICES = [
|
|
|
- ('in_use', '在用'),
|
|
|
- ('idle', '闲置'),
|
|
|
- ('maintenance', '维修中'),
|
|
|
- ('scrapped', '已报废'),
|
|
|
- ]
|
|
|
-
|
|
|
# 基本信息
|
|
|
asset_number = models.CharField('资产编号', max_length=50, db_index=True)
|
|
|
name = models.CharField('设备名称', max_length=100)
|
|
|
category = models.ForeignKey(Category, on_delete=models.PROTECT, verbose_name='设备分类', related_name='assets')
|
|
|
|
|
|
# 硬件信息
|
|
|
- brand = models.CharField('品牌', max_length=50, blank=True, default='')
|
|
|
- model = models.CharField('型号', max_length=100, blank=True, default='')
|
|
|
- asset_value = models.DecimalField('资产面值', max_digits=12, decimal_places=2, blank=True, null=True)
|
|
|
- serial_number = models.CharField('序列号', max_length=100, blank=True, default='', db_index=True)
|
|
|
+ brand = models.CharField('品牌', max_length=200, blank=True, default='')
|
|
|
+ model = models.CharField('型号', max_length=200, blank=True, default='')
|
|
|
+ asset_value = models.CharField('资产面值', max_length=50, blank=True, default='')
|
|
|
+ serial_number = models.CharField('序列号', max_length=200, blank=True, default='', db_index=True)
|
|
|
|
|
|
# 位置信息
|
|
|
location = models.CharField('机房', max_length=200, blank=True, default='', help_text='楼层/房间/区域')
|
|
|
- cabinet = models.CharField('机柜', max_length=50, blank=True, default='')
|
|
|
- cabinet_position = models.CharField('机柜位置', max_length=50, blank=True, default='', help_text='U位')
|
|
|
+ cabinet = models.CharField('机柜', max_length=200, blank=True, default='')
|
|
|
+ cabinet_position = models.CharField('机柜位置', max_length=200, blank=True, default='', help_text='U位')
|
|
|
|
|
|
# 网络信息
|
|
|
- bmc_address = models.GenericIPAddressField('BMC地址', blank=True, null=True)
|
|
|
- ip_address = models.GenericIPAddressField('IP地址', blank=True, null=True)
|
|
|
+ bmc_address = models.CharField('BMC地址', max_length=200, blank=True, default='')
|
|
|
+ ip_address = models.CharField('IP地址', max_length=200, blank=True, default='')
|
|
|
|
|
|
# 显卡信息
|
|
|
- has_gpu = models.CharField('是否带卡', max_length=20, blank=True, default='')
|
|
|
- gpu_type = models.CharField('显卡类型', max_length=100, blank=True, default='')
|
|
|
- gpu_count = models.IntegerField('卡数', blank=True, null=True)
|
|
|
+ has_gpu = models.CharField('是否带卡', max_length=50, blank=True, default='')
|
|
|
+ gpu_type = models.CharField('显卡类型', max_length=200, blank=True, default='')
|
|
|
+ gpu_count = models.CharField('卡数', max_length=50, blank=True, default='')
|
|
|
|
|
|
# 采购与质保
|
|
|
- purchase_date = models.DateField('采购日期', blank=True, null=True)
|
|
|
- warranty_expire = models.DateField('质保到期', blank=True, null=True)
|
|
|
- supplier = models.CharField('供应商', max_length=100, blank=True, default='')
|
|
|
+ purchase_date = models.CharField('采购日期', max_length=50, blank=True, default='')
|
|
|
+ warranty_expire = models.CharField('质保到期', max_length=50, blank=True, default='')
|
|
|
+ supplier = models.CharField('供应商', max_length=200, blank=True, default='')
|
|
|
|
|
|
# 管理信息
|
|
|
- responsible_person = models.CharField('负责人', max_length=50, blank=True, default='')
|
|
|
- department = models.CharField('使用部门', max_length=100, blank=True, default='')
|
|
|
- user = models.CharField('维护人', max_length=50, blank=True, default='')
|
|
|
- business_type = models.CharField('业务类型', max_length=100, blank=True, default='')
|
|
|
- status = models.CharField('状态', max_length=20, choices=STATUS_CHOICES, default='in_use')
|
|
|
- remark = models.TextField('备注', blank=True, default='')
|
|
|
+ responsible_person = models.CharField('负责人', max_length=200, blank=True, default='')
|
|
|
+ department = models.CharField('使用部门', max_length=200, blank=True, default='')
|
|
|
+ user = models.CharField('维护人', max_length=200, blank=True, default='')
|
|
|
+ business_type = models.CharField('业务类型', max_length=200, blank=True, default='')
|
|
|
+ STATUS_CHOICES = [
|
|
|
+ ('in_use', '在用'),
|
|
|
+ ('idle', '闲置'),
|
|
|
+ ('maintenance', '维修中'),
|
|
|
+ ('scrapped', '已报废'),
|
|
|
+ ]
|
|
|
+
|
|
|
+ status = models.CharField('状态', max_length=50, choices=STATUS_CHOICES, default='in_use')
|
|
|
+ remark = models.CharField('备注', max_length=500, blank=True, default='')
|
|
|
|
|
|
# 系统字段
|
|
|
created_by = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, blank=True, verbose_name='创建人')
|
|
|
@@ -82,14 +82,23 @@ class Asset(models.Model):
|
|
|
@property
|
|
|
def is_expired(self):
|
|
|
if self.warranty_expire:
|
|
|
- return self.warranty_expire < date.today()
|
|
|
+ try:
|
|
|
+ from datetime import datetime
|
|
|
+ expire_date = datetime.strptime(self.warranty_expire, '%Y-%m-%d').date()
|
|
|
+ return expire_date < date.today()
|
|
|
+ except (ValueError, TypeError):
|
|
|
+ return False
|
|
|
return False
|
|
|
|
|
|
@property
|
|
|
def is_expiring_soon(self):
|
|
|
if self.warranty_expire:
|
|
|
- from datetime import timedelta
|
|
|
- return date.today() <= self.warranty_expire <= date.today() + timedelta(days=30)
|
|
|
+ try:
|
|
|
+ from datetime import datetime, timedelta
|
|
|
+ expire_date = datetime.strptime(self.warranty_expire, '%Y-%m-%d').date()
|
|
|
+ return date.today() <= expire_date <= date.today() + timedelta(days=30)
|
|
|
+ except (ValueError, TypeError):
|
|
|
+ return False
|
|
|
return False
|
|
|
|
|
|
|