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 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_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_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 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 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 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 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 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 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 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 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)
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 issue_handle(request): ''' api/issue/handle POST 处理代办issue para: nid(int): issue id success(bool): 批准或拒绝 type_name(str): issue name ''' def fix(asset: Asset, issue: Issue): ''' 资产维保 成功或失败 后 ''' asset.owner = issue.initiator asset.status = 'IN_USE' asset._change_reason = '维保结束' asset.save(tree_update=True) def return_success(asset: Asset, issue: Issue): ''' 资产退还成功后 ''' asset.owner = issue.handler asset.status = 'IDLE' asset._change_reason = '退还' asset.save(tree_update=True) def transfer_success(asset: Asset, issue: Issue): ''' 资产转移成功后 ''' asset.owner = issue.assignee asset._change_reason = '转移' asset.save(tree_update=True) issue_id, success, type_name = parse_args(request.body, 'nid', 'success', 'type_name') if type_name == 'REQUIRE': issue: RequireIssue = RequireIssue.objects.get(id=issue_id) else: issue: Issue = Issue.objects.get(id=issue_id) issue.status = 'SUCCESS' if success else 'FAIL' issue.save() asset = issue.asset if type_name == 'MAINTAIN': fix(asset, issue) elif success and type_name == 'TRANSFER': transfer_success(asset, issue) elif success and type_name == 'RETURN': return_success(asset, issue) 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 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 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 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_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 issue_return(request): ''' api/issue/return POST 退还资产 para: nid(int) 资产nid ''' nid = parse_args(request.body, 'nid')[0] asset: Asset = Asset.objects.get(id=int(nid)) if Issue.objects.filter(initiator=request.user, asset=asset, status='DOING').exists(): return issue_conflict_error() Issue.objects.create( initiator=request.user, handler=asset.get_asset_manager(), asset=asset, type_name='RETURN', ) message = f'{request.user.username} 请求退还资产 {asset.name}' return gen_response(code=200, message=message)
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 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 issue_transfer(request): ''' api/issue/transfer 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() manager = asset.get_asset_manager() assignee = User.objects.get(username=username) Issue.objects.create( initiator=request.user, handler=manager, assignee=assignee, asset=asset, type_name='TRANSFER', ) message = f'{request.user.username} 请求向 {assignee.username} 转移资产 {asset.name}' return gen_response(code=200, message=message)
def issue_require(request): ''' api/issue/require POST 领用资产的新API para: category(str) 资产类别名 reason(str) 申领理由 ''' category, reason = parse_args(request.body, 'category', 'reason', reason='') category: AssetCategory = AssetCategory.objects.get(name=category) if RequireIssue.objects.filter(initiator=request.user, status='DOING', asset_category=category).exists(): return gen_response(code=203, message='不能对同一类资产发起多个领用请求') manager = request.user.department.get_asset_manager() if manager is None: return gen_response(code=204, message='本部门暂无资产管理员,无法进行领用') RequireIssue.objects.create(initiator=request.user, handler=manager, asset_category=category, reason=reason) return gen_response( code=200, message=f'{request.user.username} 请求领用 {category.name} 类型资产')
def user_login(request): ''' api/user/login POST 用户登录。 para: username(str), password(str) return: code = 201: parameter error status = 0: success 1: fall ''' name, pwd = parse_args(request.body, 'username', 'password') user = User.objects.get(username=name) if not user.check_password(pwd): return gen_response(message='密码有误', status=1) if not user.active: return gen_response(message='用户不处于活跃状态', status=1) user.token = user.generate_jwt_token() user.save() return gen_response(token=user.token, status=0, message=f'{name} 登录')
from app.utils import parse_args, get_arg_parser, init_es from app.shards import scan_shard, get_shards_to_routing if __name__ == '__main__': parser = get_arg_parser() args = parse_args(parser) es = init_es(args) shards_to_routing = get_shards_to_routing(es, args.index, args.doc_type) jobs = [] for shard, routing in shards_to_routing.items(): print(f"shard: {shard}, routing: {routing}") query = {"query": {"match_all": {}}} scan_shard(es, args.index, args.doc_type, query, routing, lambda doc: print(doc))
def main(): options = parse_args() logger.info("Server start") uvicorn.run(app, host=options.host, port=options.port)
from app.utils import ( run_classifier, draw_boxes, get_video_source, log_metrics, parse_args, get_classifier, dump_results, detect_api, ) from app.tasks import detect_and_compare from app.redis import get_redis if __name__ == '__main__': args = parse_args() video = get_video_source(args) # if args.redis: # r = get_redis() # p = r.pubsub(ignore_subscribe_messages=True) # p.subscribe('ack') # r.set('threshold', args.threshold) # TODO: perform this conditionally # r = get_redis() # r.set('q1', args.threshold) # r.set('q2', args.threshold) # r.set('q3', args.threshold) # r.set('q4', args.threshold)