CMDB资产管理系统开发【day26】:02-数据写入待存区
一、资产自动回报数据及个更新流程图

二、表结构注释(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-数据写入待存区的更多相关文章
- CMDB资产管理系统开发【day25】:windows客户端开发
1.目录结构 PS Y:\MadkingClient> tree /f 卷 netgame 的文件夹 PATH 列表 卷序列号为 ACE3-896E Y:. ├─bin │ NedStark.p ...
- CMDB资产管理系统开发【day25】:表结构设计1
资产表 # _*_coding:utf-8_*_ __author__ = 'jieli' from assets.myauth import UserProfile from django.db i ...
- CMDB资产管理系统开发【day26】:数据正式存入待存区
1.from表单提交 1.数据提交到哪里呢? 提交到assets/new_assets_approval.html这了 2.Yes, I'm sure提交了什么? 为什么没有下拉框了 ...
- CMDB资产管理系统开发【day26】:admin action
本节目标 审核写到数据库,我就单独写一个如下的 页面 单机go后就跳转到如下图界面,我们这节课的目标就是写一个这样的页面 asset\admin.py部分代码 注释如下: class NewAsset ...
- CMDB资产管理系统开发【day26】:CMDB上节回顾
一.上节知识点回顾 服务器设计了一个表结构 开发了一个客户端 二.后台创建缓存区表 客户端连接服务器,在服务器的下面看报错信息 因为URL都没有写,所以我找不到呀 1.在MadKing\url.py ...
- CMDB资产管理系统开发【day26】:实现资产自动更新
1.需求分析 1.比对分析 比对的时候以那个数据源为主? old [1,2,3 ] db数据库 new [2,3,4 ] 客户端汇报过来的 当然以客户端汇报过来的数据为主 2.更新分析 不同的表到底拿 ...
- CMDB资产管理系统开发【day26】:批准资产入库
刚才都是一条像内存,硬盘,网卡.多条的话如何操作 只有一条数据 下面的是有多条数据的 硬盘必须字段的验证 def __create_disk_component(self): disk_info = ...
- CMDB资产管理系统开发【day26】:linux客户端开发
客户端疑难点及获取流程 1.linux客户端支持2就可以,python3就是很麻烦 难道你要求所有的客户端都上pytho3吗? 现在从bin的入口进去 HouseStark.ArgvHandler(s ...
- CMDB资产管理系统开发【day26】:Django admin
想实现的是一个表里面的字段 选择性的出现在菜单栏 1.如何自定义菜单 自定义菜单前 在asset\admin.py里添加如下代码: class NewAssetApprovalZoneAdmin(ad ...
随机推荐
- 001---Python简介
编程语言: 机器语言 最底层,更容易被计算机识别,执行速度最快 复杂,开发效率低 汇编语言 比较底层,执行速度较快 同样复杂 高级语言 编译型语言:先编译,后执行.生成独立的可执行文件.是计算机可以理 ...
- JAVA判断时间是否在时间区间内
package com.liying.tiger.test; import java.text.ParseException; import java.text.SimpleDateFormat; i ...
- Python3爬虫(一)HTTP相关基础
Infi-chu: http://www.cnblogs.com/Infi-chu/ 一.URI.URL.URN.HTTP URI:统一资源标志符 URL:是URI的一个子集 URN:是URI的另一个 ...
- java入门---基础语法&基础常识&编码规范&命名规范
一个Java程序可以认为是一系列对象的集合,而这些对象通过调用彼此的方法来协同工作.下面简要介绍下类.对象.方法和实例变量的概念. 对象:对象是类的一个实例,有状态和行为.例如,一条狗是一个对 ...
- LINUX系统配置相关
修改系统引导文件 grub.cfg的文件位置 /boot/grub/grub.cfg set default="4" 默认windows是在第四个选项 set timeout ...
- svn 用cmd命令行启动服务
部署好svn 服务器后,用cmd命令行 svnserve -d -r [仓库地址] 启动服务,这样别的用户可以通过网络访问svn服务器了.
- Python 学习笔记之—— PIL 库
PIL,全称 Python Imaging Library,是 Python 平台一个功能非常强大而且简单易用的图像处理库.但是,由于 PIL 仅支持到Python 2.7,加上年久失修,于是一群志愿 ...
- Fast-RCNN论文总结整理
此篇博客写作思路是一边翻译英文原文一边总结博主在阅读过程中遇到的问题及一些思考,因为博主本人阅读英文论文水平不高,所以还请大家在看此篇博客的过程中带着批判的眼神阅读!小墨镜带好,有什么不对的地方请在留 ...
- 合规P2P平台成PE/VC新宠
013年是互联网金融元年,余额宝.百发等掀起了大众理财的新一轮高潮.P2P平台作为互联网金融模式之一,也受到市场的重点关注-在部分平台不断爆出风险事件的同时,业内较为成熟的平台也正成为PE/VC的新宠 ...
- Java生成C#可用Model包
项目需要提供接口给.NET团队使用,为方便大伙,特地写一个从Java接口生成C#可用Model包的工具Class 主Class是一个Controller,可以随时进行生成 package com.fa ...