def asset_edit(request): ''' api/asset/edit POST 编辑资产 可编辑的条目有:name, description, parent_id return: code = 200: success 201: parameter error 202:no such asset ''' nid, name, description, parent_id, custom = parse_args(request.body, 'nid', 'name', 'description', 'parent_id', 'custom', parent_id='', custom={}) asset = Asset.objects.get(id=nid) try: parent = Asset.objects.get(id=parent_id) except ValueError: parent = None else: if parent.status != 'IDLE' or asset.status != 'IDLE': return gen_response(code=204, message='只能修改空闲资产间的父子关系') asset.name, asset.parent = name, parent asset.description = description try: asset.save() AssetCustomAttr.update_custom_attrs(asset, custom) except InvalidMove: return gen_response(code=203, message='无法指定自己成为自己的父资产') return gen_response(code=200, message=f'修改资产 {asset.name} 信息')
def issue_permit_require(request): ''' api/issue/permit-require POST 资产管理员同意员工的资产申领请求,并向员工分配资产。 para: nid(int): require issue id selectedRows(List[int]): 资产id列表 ''' issue_id, asset_ids = parse_args(request.body, 'nid', 'selectedRows') if not asset_ids: return gen_response(code=204, message='没有指定任何资产') issue: RequireIssue = RequireIssue.objects.get(id=issue_id) assets = set() for asset_id in asset_ids: asset: Asset = Asset.objects.get(id=asset_id) assets.update(asset.get_entire_tree()) for asset in assets: asset.owner = issue.initiator asset.status = 'IN_USE' asset._change_reason = '领用' asset.save() issue.asset.add(asset) issue.status = 'SUCCESS' issue.save() return gen_response(code=200, message=f"{request.user.username} 批准资产领用请求")
def user_edit(request): ''' api/user/edit POST 编辑用户。 para: name(str), password(str), department_id(str), role([...]) return: code = 200: success 201: parameter error 202:no such user ''' name, pwd, department_id, roles = parse_args(request.body, 'name', 'password', 'department', 'role', department='') if name == 'admin': return gen_response(code=203, message="admin 的信息不能被修改") user = User.objects.get(username=name) if pwd != '': user.set_password(pwd) try: department = Department.objects.get(id=department_id) except Department.DoesNotExist: department = Department.root() user.department = department user.save() user.set_roles(roles) return gen_response(code=200, message=f'{user.username} 信息修改')
def user_change_password(request): ''' api/user/change-password POST 更改自己的密码。 para: oldPassword(str), newPassword(str) ''' user = request.user old_pwd, new_pwd = parse_args(request.body, 'oldPassword', 'newPassword') if not user.check_password(old_pwd): return gen_response(message='旧密码错误', code=202) user.set_password(new_pwd) user.save() return gen_response(code=200, message=f'用户 {user.username} 密码更改')
def category_add(request): ''' api/asset/category/add POST para: parent_id(int), name(str) return: code = 200: success ''' parent_id, category_name = parse_args(request.body, 'parent_id', 'name') parent = AssetCategory.objects.get(id=parent_id) try: AssetCategory.objects.create(name=category_name, parent=parent) except IntegrityError: return gen_response(code=203, message="类型名不能重复") return gen_response(code=200, message=f'添加资产类别 {category_name}')
def custom_attr_edit(request): ''' api/asset/custom/edit POST 修改自定义属性 para: - custom(list) ''' attrs = parse_args(request.body, 'custom')[0] CustomAttr.objects.all().delete() for attr in attrs: try: CustomAttr.objects.create(name=attr) except IntegrityError: return gen_response(code=203, message='不能设置两个相同自定义属性') return gen_response(code=200, message='修改自定义属性')
def category_edit(request): ''' api/asset/category/edit POST para: id(int), name(str) return: code = 200: success ''' category_id, name = parse_args(request.body, 'id', 'name') category = AssetCategory.objects.get(id=category_id) old_name, category.name = category.name, name try: category.save() except IntegrityError: return gen_response(code=203, message="类型名不能重复") return gen_response(code=200, message=f'将资产类别 {old_name} 更名为 {name}')
def asset_list(request): '''api/asset/list GET return an asset list for asset manager''' department = request.user.department all_assets = Asset.objects.filter(owner__department=department) res = get_assets_list(all_assets) return gen_response(code=200, data=res)
def asset_query(request): ''' api/asset/query POST para: name(str), category(str), description(str) ''' args = parse_args(request.body, 'name', 'category', 'description', 'customKey', 'customValue', name='', category='', description='', customKey='', customValue='') name, category, description, key, value = args assets = Asset.objects.filter(owner__department=request.user.department) assets = assets.filter(name__contains=name) assets = assets.filter(description__contains=description) if category != '': category = AssetCategory.objects.get(name=category) assets = assets.filter(category=category) if key != '': assets = AssetCustomAttr.search_custom_attr(key, value, assets) res = get_assets_list(assets) return gen_response(data=res, code=200)
def issue_fix(request): ''' api/issue/fix POST 维保资产 para: nid(int) 资产nid username(str) 维保人名 ''' nid, username = parse_args(request.body, 'nid', 'username') asset: Asset = Asset.objects.get(id=int(nid)) if Issue.objects.filter(initiator=request.user, asset=asset, status='DOING').exists(): return issue_conflict_error() handler = User.objects.get(username=username) Issue.objects.create( initiator=request.user, handler=handler, asset=asset, type_name='MAINTAIN', ) # 更新资产状态 asset.owner = handler asset.status = 'IN_MAINTAIN' asset._change_reason = '维保' asset.save(tree_update=True) message = f'{request.user.username} 向 {handler.username} 维保资产 {asset.name}' return gen_response(code=200, message=message)
def issue_delete(request): ''' api/issue/delete POST 删除issue. para: nid(int): issue id type_name(str): issue类型 ''' issue_id, type_name = parse_args(request.body, 'nid', 'type_name') if type_name == 'REQUIRE': issue: RequireIssue = RequireIssue.objects.get(id=issue_id) else: issue: Issue = Issue.objects.get(id=issue_id) if issue.status != 'DOING': return gen_response(code=203, message='已办结的事项不能删除') issue.delete() return gen_response(code=200, message=f"{request.user.username} 删除待办事项")
def user_delete(request): ''' api/user/delete POST 删除用户。 para: name(str) return: code = 200: success 201: parameter error 202: no such named user 203: admin can't be deleted ''' name = parse_args(request.body, 'name')[0] if name in ['admin', request.user.username]: return gen_response(message='不能删除自己或admin', code=203) user = User.objects.get(username=name) user.delete() return gen_response(code=200, message=f'删除用户 {name}')
def user_add(request): ''' api/user/add POST 添加用户。 para: name(str), department(str), role([...]) return: code = 200: success 201: parameter error 400: Validation Error when saving user ''' name, department_id, roles = parse_args(request.body, 'name', 'department', 'role', department='') try: department = Department.objects.get(id=department_id) except Department.DoesNotExist: department = Department.root() user = User(username=name, department=department) user.set_password('123456') user.full_clean() user.save() user.set_roles(roles) return gen_response(code=200, message=f'添加用户 {name}')
def category_delete(request): ''' api/asset/category/delete POST para: id(int) return: code = 200: success 201: parameter error 202: 对应部门不存在 203: 顶层部门不能删除 ''' category_id = parse_args(request.body, 'id')[0] if int(category_id) == AssetCategory.root().id: return gen_response(code=203, message='顶级资产类型不能删除') category = AssetCategory.objects.get(id=category_id) category.delete() return gen_response(code=200, message=f'删除资产类别 {category.name}')
def user_assets(request): ''' api/user/assets GET 获得自己名下的正在使用的资产列表 ''' user = request.user assets = Asset.objects.filter(owner=user, status='IN_USE') res = get_assets_list(assets) return gen_response(data=res, code=200)
def custom_attr_list(request): ''' api/asset/custom/list GET 获得自定义属性 ''' attrs = CustomAttr.objects.filter() res = [attr.name for attr in attrs] return gen_response(code=200, data=res)
def department_delete(request): ''' api/department/delete POST para: id(int) return: code = 200: success 201: parameter error 202: 对应部门不存在 203: 顶层部门不能删除 ''' nid = parse_args(request.body, 'id')[0] if int(nid) == Department.root().id: return gen_response(code=203, message='顶层部门不能删除') department = Department.objects.get(id=nid) department.delete() return gen_response(code=200, message=f'删除部门 {department.name}')
def asset_add(request): ''' api/asset/add POST 资产管理员添加资产,需要提供的条目: value, name, category, description, parent_id, custom return: code = 200: success 201: parameter error 400: Validation Error when saving asset ''' pack_list = parse_list(request.body, 'value', 'name', 'category', 'description', 'service_life', 'parent_id', 'custom', description='', service_life=5, parent_id=-1, custom={}) for pack in pack_list: value, name, category, description, service_life, parent_id, custom = pack category = AssetCategory.objects.get(name=category) try: parent: Asset = Asset.objects.get(id=parent_id) except Asset.DoesNotExist: parent = None else: if parent.status != 'IDLE': return gen_response(code=204, message='只能指定空闲资产为父资产') asset = Asset(value=value, name=name, category=category, description=description, owner=request.user, status='IDLE', service_life=service_life, parent=parent) asset.full_clean() asset.save() AssetCustomAttr.update_custom_attrs(asset, custom) return gen_response(code=200, message=f'添加资产 {len(pack_list)} 条')
def user_lock(request): ''' api/user/lock POST 锁定用户 para: username(str), active(0/1) return: code = 200: success 201: parameter error 202:no such user 203: admin can not be locked ''' username, active = parse_args(request.body, 'username', 'active') if username in ['admin', request.user.username]: return gen_response(message='不能锁定自己或admin', code=203) user = User.objects.get(username=username) user.active = active user.save() return gen_response(code=200)
def asset_available_list(request): '''api/asset/available GET 返回可以领用(IDLE)的资产 ''' department = request.user.department all_assets = Asset.objects.filter(owner__department=department, status='IDLE') res = get_assets_list(all_assets) return gen_response(code=200, data=res)
def department_add(request): ''' api/department/add POST para: parent_id(int), name(str) return: code = 200: success ''' parent_id, name = parse_args(request.body, 'parent_id', 'name') parent = Department.objects.get(id=parent_id) Department.objects.create(name=name, parent=parent) return gen_response(code=200, message=f'添加部门 {name}')
def handling_list(request): ''' api/issue/handling GET 需要本用户处理的请求列表 ''' issues = Issue.objects.filter(handler=request.user, status='DOING') res = get_issues_list(issues) issues = RequireIssue.objects.filter(handler=request.user, status='DOING') res += get_issues_list(issues) res.sort(key=lambda issue: issue['start_time'].timestamp()) return gen_response(code=200, data=res)
def waiting_list(request): ''' api/issue/waiting GET 本用户已提交的请求列表 ''' issues = Issue.objects.filter(initiator=request.user) res = get_issues_list(issues) issues = RequireIssue.objects.filter(initiator=request.user) res += get_issues_list(issues) res.sort(key=lambda issue: issue['start_time'].timestamp()) return gen_response(code=200, data=res)
def asset_retire(request): ''' api/asset/retire POST para: nid(int) 资产id, retire_family(bool) 是否清退关联资产 ''' nid, retire_family = parse_args(request.body, 'nid', 'retire_family', retire_family=False) asset: Asset = Asset.objects.get(id=int(nid)) if asset.status != 'IDLE': return gen_response(code=203, message='只能清退空闲中的资产') asset.status = 'RETIRED' asset._change_reason = '清退' if retire_family: asset.save(tree_update=True) else: asset.parent = None asset.save() Asset.objects.filter(parent=asset).update(parent=None) return gen_response(code=200, message=f'清退资产 {asset.name}')
def department_edit(request): ''' api/department/edit POST para: id(int), name(str) return: code = 200: success ''' nid, name = parse_args(request.body, 'id', 'name') department = Department.objects.get(id=nid) old_name, department.name = department.name, name department.save() return gen_response(code=200, message=f'将部门 {old_name} 更名为 {name}')
def user_exist(request): ''' api/user/exist POST 用户名是否存在。 para: name(str) return: exist(bool), code = 200: success 201: parameter error ''' name = parse_args(request.body, 'name')[0] exist = User.objects.filter(username=name).exists() return gen_response(code=200, exist=exist)
def require_asset_list(request): ''' api/issue/require-asset-list POST 同意资产领用时需要的某类空闲中资产列表 para: category(str) ''' category = parse_args(request.body, 'category')[0] category = AssetCategory.objects.get(name=category) assets = Asset.objects.filter(owner__department=request.user.department, status='IDLE', category=category) res = get_assets_list(assets) return gen_response(data=res, code=200)
def user_logout(request): ''' api/user/login POST 用户登出。 return: status = 0: success 1: fall ''' user = request.user user.token = '' user.save() return gen_response(status=0, message=f'{user.username} 登出')
def asset_allocate(request): ''' /api/asset/allocate POST 调拨资产到请求者(资产管理员)的部门中 para: ''' asset_id_list, department_id = parse_args(request.body, 'idList', 'id') department: Department = Department.objects.get(id=department_id) target_manager = department.get_asset_manager() if target_manager is None: return gen_response(code=203, message=f'{department.name} 没有资产管理员') assets = set() for nid in asset_id_list: asset: Asset = Asset.objects.get(id=nid) assets.update(asset.get_entire_tree()) for asset in assets: asset.owner = target_manager asset._change_reason = '调拨' asset.save() return gen_response( code=200, message=f'{request.user.username} 向部门 {department.name} ' f'调拨 {len(asset_id_list)}资产')
def asset_history(request): ''' api/asset/history POST para: nid(int) return: code = ... data = [ {time(str), user(str), type(str), info(str)}, ... ] ''' nid = parse_args(request.body, 'nid')[0] asset = Asset.objects.get(id=nid) history = asset.history.all() res = [gen_history(record) for record in history] return gen_response(code=200, data=res)