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

二、表结构注释(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. 014---Django的中间件

     前戏 我们在前面的课程中已经学会了给视图函数加装饰器来判断是用户是否登录,把没有登录的用户请求跳转到登录页面.我们通过给几个特定视图函数加装饰器实现了这个需求.但是以后添加的视图函数可能也需要加上装 ...

  2. MFC接收ShellExecute多个参数

    在应用程序开发过程中,我们经常需要带参数启动另一个执行程序,如何传递多个参数,如何解析多个参数呢?   传参数 传递参数可使用ShellExecute函数,示例如下: ShellExecute(NUL ...

  3. 初步学习pg_control文件之九

    接前文,初步学习pg_control文件之八 来看这个: pg_time_t time; /* time stamp of last pg_control update */ 当初初始化的时候,是这样 ...

  4. 1176: [Balkan2007]Mokia

    1176: [Balkan2007]Mokia 链接 分析 三维偏序问题,CDQ分治论文题. 代码 #include<bits/stdc++.h> using namespace std; ...

  5. NB-IOT的键值对

    1. 关于NB-IOT的软件开发,有一个功能,NB收到数据的时候可以唤醒处于低功耗下的MCU. 2. 2个键值对可以配置这个功能.使用键值对的方式. 3. 遇到的第一个问题,<config> ...

  6. .NET基础知识之八——深拷贝,浅拷贝

    目录 1.概念 2.使用赋值符号"=" 3.浅复制 4.深复制 5.问题一:如果类里面嵌套有多个类,然后嵌套类里面又嵌套类,那么像上面实现深拷贝的方法还能用吗? 6.问题二:实现深 ...

  7. gitk中文乱码问题处理

    执行了 git config --global gui.encoding utf- 查看 %USERPROFILE%\.gitconfig 文件中也有 [gui] encoding = utf-8 在 ...

  8. es6中类的注意事项

    class Circle { constructor(radius) { this.radius = radius; Circle.circlesMade++; }; static draw(circ ...

  9. 最小总代价 状压DP

    描述 n个人在做传递物品的游戏,编号为1-n. 游戏规则是这样的:开始时物品可以在任意一人手上,他可把物品传递给其他人中的任意一位:下一个人可以传递给未接过物品的任意一人. 即物品只能经过同一个人一次 ...

  10. idea在Maven Projects中显示灰色的解决办法

    问题描述: 在使用idea的过程中,遇到其中一个maven模块变成灰色,如下所示: 问题解决: 造成这个的原因可能是忽略了maven模块. 可以尝试如下解决方法:在idea中进入Settings–&g ...