一、资产自动回报数据及个更新流程图

二、表结构注释(NewAssetApprovalZone)

class NewAssetApprovalZone(models.Model):
"""新资产待审批区""" sn = models.CharField(u'资产SN号', max_length=128, unique=True)
'''
必填的:
1、sn号
如果管理员不审批。客户端就会不停的回报,难道每次汇报一次往表里写一次?所以就用sn来进行区分
如果sn变了资产就变了,只要不批准,就一直待存取,让待存取和和客户端保持一致,即便更新了 2、把数据存进去前要不要进行一个合法性验证
'''
asset_type_choices = (
('server', u'服务器'),
('switch', u'交换机'),
('router', u'路由器'),
('firewall', u'防火墙'),
('storage', u'存储设备'),
('NLB', u'NetScaler'),
('wireless', u'无线AP'),
('software', u'软件资产'),
('others', u'其它类'),
)
asset_type = models.CharField(choices=asset_type_choices, max_length=64, blank=True, null=True)
manufactory = models.CharField(max_length=64, blank=True, null=True)
model = models.CharField(max_length=128, blank=True, null=True)
ram_size = models.IntegerField(blank=True, null=True)
cpu_model = models.CharField(max_length=128, blank=True, null=True)
cpu_count = models.IntegerField(blank=True, null=True)
cpu_core_count = models.IntegerField(blank=True, null=True)
os_distribution = models.CharField(max_length=64, blank=True, null=True)
os_type = models.CharField(max_length=64, blank=True, null=True)
os_release = models.CharField(max_length=64, blank=True, null=True)

  

这些东西都没多少用,所以这几个字段是为了让用户看到

data = models.TextField(u'资产数据')

只有data对我来说用用,因为这个表里存的是临时数据,为了让管理员审批用的,要是审核通过
还是去data里面拿数据,

sn = models.CharField(u'资产SN号', max_length=128, unique=True)

三、把数据存进去前要不要进行一个合法性验证

def mandatory_check(self, data, only_check_sn=False):
for field in self.mandatory_fields:
if field not in data:
self.response_msg('error', 'MandatoryCheckFailed',
"The field [%s] is mandatory and not provided in your reporting data" % field)
else:
if self.response['error']: return False
try: if not only_check_sn:
self.asset_obj = models.Asset.objects.get(id=int(data['asset_id']), sn=data['sn'])
else:
self.asset_obj = models.Asset.objects.get(sn=data['sn'])
return True
except ObjectDoesNotExist as e:
self.response_msg('error', 'AssetDataInvalid',
"Cannot find asset object in DB by using asset id [%s] and SN [%s] " % (
data['asset_id'], data['sn']))
self.waiting_approval = True
return False

  

首先拿到数据
生成给客户端返回一个空字典
先判断能不能获取到,如果能获取到,检查only_check_sn mandtory_check到客户端回报的数据 ,在不在这个data,如果不在,

首先判断error在不在这个临安

self.response_msg('error', 'MandatoryCheckFailed',

四、一次性能返回多个错误

为什么要这样存?

1、就是把错误信息 放到error字典里面,但是没有返回给客户端
2、一次性返回多个信息,一次提交2个返回一个很麻烦
3、一个key 一个消息传给了函数,写前端需要10个字段你一刷新说那九个字段都需要比填
循环完字段,这几个必填字段,有报错,直接就结束,不用往下判断。

            if not only_check_sn:
self.asset_obj = models.Asset.objects.get(id=int(data['asset_id']), sn=data['sn'])
else:
self.asset_obj = models.Asset.objects.get(sn=data['sn'])
return True
except ObjectDoesNotExist as e:
self.response_msg('error', 'AssetDataInvalid',
"Cannot find asset object in DB by using asset id [%s] and SN [%s] " % (
data['asset_id'], data['sn']))
self.waiting_approval = True
return False

1 、首先从mandatory_check这个地方检测,如果这一段如果通过了之后

去资产表里获取资产,因为没有所以怎么都获取不到,获取不到就报错,就认为是一个新资产,设为等待批准

2、然后就返回

谁调用的C:\MadKing-master\assets\core 下的mandatory_check?

答:是下面这段调用的

C:\MadKing-master\assets\core\views.py

@csrf_exempt
def asset_with_no_asset_id(request): res = ass_handler.get_asset_id_by_sn()

五、C:\MadKing-master\assets\core.py部分代码注释

class Asset(object):
def __init__(self, request):
self.request = request
self.mandatory_fields = ['sn', 'asset_id', 'asset_type'] # must contains 'sn' , 'asset_id' and 'asset_type'
self.field_sets = {
'asset': ['manufactory'],
'server': ['model', 'cpu_count', 'cpu_core_count', 'cpu_model', 'raid_type', 'os_type', 'os_distribution',
'os_release'],
'networkdevice': []
}
self.response = {
'error': [],
'info': [],
'warning': []
} def response_msg(self, msg_type, key, msg):
if msg_type in self.response:
self.response[msg_type].append({key: msg})
else:
raise ValueError def mandatory_check(self, data, only_check_sn=False):
for field in self.mandatory_fields:
if field not in data:
self.response_msg('error', 'MandatoryCheckFailed',
"The field [%s] is mandatory and not provided in your reporting data" % field)
else:
if self.response['error']: return False
'''是有资产的时候,更新用的,因为数据库里没有这个资产,所以直接就报错'''
try: if not only_check_sn:
self.asset_obj = models.Asset.objects.get(id=int(data['asset_id']), sn=data['sn'])
else:
self.asset_obj = models.Asset.objects.get(sn=data['sn'])
return True
except ObjectDoesNotExist as e:
self.response_msg('error', 'AssetDataInvalid',
"Cannot find asset object in DB by using asset id [%s] and SN [%s] " % (
data['asset_id'], data['sn']))
'''数据库里没有这条资产,肯定会报这个错'''
self.waiting_approval = True '''
重点是这条:这条资产为待批准,这里就结束,
self.waiting_approval是什么意思?为什么要设置这个东西?
报错,没有退出,没有返回
''' return False def get_asset_id_by_sn(self):
'''When the client first time reports it's data to Server,it doesn't know it's asset id yet,so it will come to the server asks for the asset it first,then report the data again '''
data = self.request.POST.get("asset_data")
response = {}
if data:
try:
data = json.loads(data)
if self.mandatory_check(data,
only_check_sn=True): # the asset is already exist in DB,just return it's asset id to client
response = {'asset_id': self.asset_obj.id}
else:
if hasattr(self, 'waiting_approval'):
response = {
'needs_aproval': "this is a new asset,needs IT admin's approval to create the new asset id."}
self.clean_data = data
self.save_new_asset_to_approval_zone()
print(response)
else:
response = self.response
except ValueError as e:
self.response_msg('error', 'AssetDataInvalid', str(e))
response = self.response else:
self.response_msg('error', 'AssetDataInvalid', "The reported asset data is not valid or provided")
response = self.response
return response '''
若果这个表里没有,就执行if hasattr(self, 'waiting_approval'):
给用户返回的时候,同时存在待存区,
如何存呢?
''' def save_new_asset_to_approval_zone(self):
'''When find out it is a new asset, will save the data into approval zone to waiting for IT admin's approvals'''
asset_sn = self.clean_data.get('sn')
asset_already_in_approval_zone = models.NewAssetApprovalZone.objects.get_or_create(sn=asset_sn,
data=json.dumps(
self.clean_data),
manufactory=self.clean_data.get(
'manufactory'),
model=self.clean_data.get(
'model'),
asset_type=self.clean_data.get(
'asset_type'),
ram_size=self.clean_data.get(
'ram_size'),
cpu_model=self.clean_data.get(
'cpu_model'),
cpu_count=self.clean_data.get(
'cpu_count'),
cpu_core_count=self.clean_data.get(
'cpu_core_count'),
os_distribution=self.clean_data.get(
'os_distribution'),
os_release=self.clean_data.get(
'os_release'),
os_type=self.clean_data.get(
'os_type'), )
return True '''
如果存在就取出来,不存在就创建一条
这里面有一个waiting_approval标志位,这里面有一个waiting_approval标志位
'''

CMDB资产管理系统开发【day26】:02-数据写入待存区的更多相关文章

  1. CMDB资产管理系统开发【day25】:windows客户端开发

    1.目录结构 PS Y:\MadkingClient> tree /f 卷 netgame 的文件夹 PATH 列表 卷序列号为 ACE3-896E Y:. ├─bin │ NedStark.p ...

  2. CMDB资产管理系统开发【day25】:表结构设计1

    资产表 # _*_coding:utf-8_*_ __author__ = 'jieli' from assets.myauth import UserProfile from django.db i ...

  3. CMDB资产管理系统开发【day26】:数据正式存入待存区

    1.from表单提交 1.数据提交到哪里呢? 提交到assets/new_assets_approval.html这了 2.Yes, I'm sure提交了什么?          为什么没有下拉框了 ...

  4. CMDB资产管理系统开发【day26】:admin action

    本节目标 审核写到数据库,我就单独写一个如下的 页面 单机go后就跳转到如下图界面,我们这节课的目标就是写一个这样的页面 asset\admin.py部分代码 注释如下: class NewAsset ...

  5. CMDB资产管理系统开发【day26】:CMDB上节回顾

    一.上节知识点回顾 服务器设计了一个表结构 开发了一个客户端 二.后台创建缓存区表 客户端连接服务器,在服务器的下面看报错信息 因为URL都没有写,所以我找不到呀 1.在MadKing\url.py ...

  6. CMDB资产管理系统开发【day26】:实现资产自动更新

    1.需求分析 1.比对分析 比对的时候以那个数据源为主? old [1,2,3 ] db数据库 new [2,3,4 ] 客户端汇报过来的 当然以客户端汇报过来的数据为主 2.更新分析 不同的表到底拿 ...

  7. CMDB资产管理系统开发【day26】:批准资产入库

    刚才都是一条像内存,硬盘,网卡.多条的话如何操作 只有一条数据 下面的是有多条数据的 硬盘必须字段的验证 def __create_disk_component(self): disk_info = ...

  8. CMDB资产管理系统开发【day26】:linux客户端开发

    客户端疑难点及获取流程 1.linux客户端支持2就可以,python3就是很麻烦 难道你要求所有的客户端都上pytho3吗? 现在从bin的入口进去 HouseStark.ArgvHandler(s ...

  9. CMDB资产管理系统开发【day26】:Django admin

    想实现的是一个表里面的字段 选择性的出现在菜单栏 1.如何自定义菜单 自定义菜单前 在asset\admin.py里添加如下代码: class NewAssetApprovalZoneAdmin(ad ...

随机推荐

  1. javaweb 项目部署到tomcat

    1.准备环境 1.安装 mysql 2.安装java 环境 3.使用idea打war包 点击 apply 生成war包 将war包传到tomcat的webapp目录下,进入tomcat安装目录,进入b ...

  2. 各种数据库分页语句整理以及Oracle数据库中的ROWNUM和ORDER BY的区别

    .oracle数据库分页 select * from (select a.*,rownum rc from 表名 where rownum<=endrow) a where a.rc>=s ...

  3. Electron入门应用打包exe(windows)

    最近在学习nodejs,得知Electron是通过将Chromium和Node.js合并到同一个运行时环境中,用HTML,CSS和JavaScript来构建跨平台桌面应用程序的一门技术.对于之前一直从 ...

  4. P2347 砝码称重

    P2347 砝码称重 题目描述 设有1g.2g.3g.5g.10g.20g的砝码各若干枚(其总重<=1000), 输入输出格式 输入格式: 输入方式:a1 a2 a3 a4 a5 a6 (表示1 ...

  5. javascript的优美与鸡肋

    --总结来自:<javascript语言精粹> 任何语言都有其优美的地方和其鸡肋的地方.避归一些语言的糟粕,能相应的降低bug出现的几率. 优美处: 函数是头等对象 基于原型继承的动态对象 ...

  6. jsp 路径问题和环境路径以及各种路径总结

    首先确定问题: 浏览器发送请求后,服务器会返回一个响应,但是返回的网页中,会有各种路径问题,所以在此用jsp中的属性来解决.(只是记录问题,用了不专业的术语,请见谅.) 总结: 以路径  http:/ ...

  7. JMeter上传图片

    JMeter怎样上传图片? 请注意图片的路径要与.jmx脚本的目录保持一致, 或者放在JMeter的bin目录下. 协议:http 服务器名称或IP:www.abcdef.com 方法:POST 路径 ...

  8. 一个简单的ipfs音乐播放器的实现

    IPFS音乐播放器 IPFS相关 IPFS第一次亲密接触 什么是IPFS IPFS对比HTTP/FTP等协议的优势 IPFS应用场景 -移动数据 交易 路由 网络 定义数据 命名 使用数据 具体场景; ...

  9. STL应用——hdu1412(set)

    set函数的应用 超级水题 #include <iostream> #include <cstdio> #include <algorithm> #include ...

  10. 平面最近点对(HDU 1007)

    题解:点击 #include <stdio.h> #include <string.h> #include <algorithm> #include <ios ...