def put(self, request, *args, **kwargs): """ 账号申请状态,拒绝 :param request: :return: """ data = json.loads(request.body.decode('utf-8'))['params'] if request.user.is_superuser: queryset = InnerAccount.objects.filter(id=data.get('id')).first() if queryset.status == 2: name = queryset.name email = queryset.account_name queryset.status = 1 queryset.save() user_id = UserInfo.objects.filter(email=email).first() try: data = { 'title': '账号申请已被拒绝', 'msg': f'【账号类型】 \n \n {queryset.account_zh_desc} \n 您发起的帐号申请已被拒绝, 详细原因请咨询管理员! \n {local_time}', 'user_id': user_id.user_id } logger.info('已拒绝该用户的申请, 开始发送异步通知') result = deploy_send_dingtalk_work_notice.delay(data) logger.info('异步任务返回ID: %s, 状态: %s' % (str(result.id), str(result.state))) except BaseException as e: pass return JsonResponse(data={ "msg": "已拒绝该用户的申请!", "errcode": 0, }) else: return JsonResponse(data={'errcode': 403, 'msg': '你无权操作!'})
def post(self, request, *args, **kwargs): """ 创建部署单 :param request: :param args: :param kwargs: :return: """ data = json.loads(request.body) file = data['params']['file'] logger.info('原始请求报文: %s' % str(data)) err_file_name = [] for file_status in file: err_file_name.append(file_status['name']) if int( file_status['percent']) != 100 else print('\n') # 判断是否有未上传的文件 if err_file_name: logger.warning('%s 未上传测试报告, 或上传的文件格式不正确! 原因:%s' % (request.user.name, err_file_name)) return JsonResponse( data={ "errcode": -1, "msg": "未上传测试报告, 或上传的文件格式不正确!", "data": { "fileName": err_file_name } }) elif file: # 应用部署单, 生成的参数为: # project_id: 应用编号, task_name: 任务id, submit_user: 部署发起人, submit_mobile: 提交人手机号 project_id = data['params']['projectId'] try: project_obj = Project.objects.filter(id=project_id).values( 'title', 'project_env', 'is_container').first() deploy_env = str(project_obj['project_env']).upper() task_id = str(uuid.uuid1()).replace('-', '') deploy_info = data['params']['deploy'] title = deploy_info['title'] version = deploy_info['version'] desc = deploy_info['desc'] develop_user = str( deploy_info['developUser']).strip().split(' ') online_time = deploy_info['onlineTime'] # 将online_time (2020-11-17T08:25:56.812Z)转换为本地时间2017-07-28 16:28:47.776000 UTC_FORMAT = "%Y-%m-%dT%H:%M:%S.%fZ" utc_time = datetime.datetime.strptime(online_time, UTC_FORMAT) online_local_time = utc_time + datetime.timedelta(hours=8) ding_talk = deploy_info['dingTalk'] deploy_type = deploy_info['deployType'] approval_user = deploy_info['approvalUser'] # 原始文件名 logger.info("原始文件名称:%s" % file) original_file_name = file[0]['name'] test_repo = file[0]['response']['data']['url'].split( '/files/')[1] # 获取审批人user_id obj = UserInfo.objects.filter(name=approval_user).first() # 0容器化应用, 1标准化应用 if project_obj[ 'is_container'] == 0 and deploy_type == 'CONTAINER': with transaction.atomic(): DeployTask.objects.create( task_id=task_id, project_id=project_id, title=title, version=version, before_comment=desc, dingtalk_notice=ding_talk, approval_user=approval_user, test_report=test_repo, develop_user=develop_user, online_time=online_local_time, submit_people=request.user.name, submit_user_id=request.user.user_id, deploy_env=deploy_env, deploy_type=deploy_type, original_file_name=original_file_name) logger.info( '%s 发起的部署任务单创建成功, 应用类型:CONTAINER 任务ID:%s 发布的版本:%s' % (request.user.name, task_id, version)) # 将操作记录写入到deploy_logs表中 DeployLogs.objects.create(task_id=task_id, project_id=project_id, message='%s发起了部署单申请' % request.user.name) try: # 给审批人发送工作通知 data = { 'title': '有一条上线申请单待审批!', 'msg': f'#### 请登陆运维平台审批该工单 \n【申请标题】 \n {title} \n \n【上线版本】 \n {version} \n \n【提交人员】 \n {request.user.name} \n \n【开发人员】 \n {develop_user} \n {local_time}', 'user_id': str(obj.user_id) } deploy_send_dingtalk_work_notice.delay(data) except BaseException as e: logger.error( '发送钉钉工作通知失败, 异常原因: %s' % str(traceback.format_exc()), e) return JsonResponse(data={ "errcode": 0, "msg": "部署单创建成功!", "data": "null" }) elif project_obj['is_container'] == 1 and deploy_type == 'INC': with transaction.atomic(): DeployTask.objects.create( task_id=task_id, project_id=project_id, title=title, version=version, before_comment=desc, dingtalk_notice=ding_talk, approval_user=approval_user, test_report=test_repo, develop_user=develop_user, online_time=online_local_time, submit_people=request.user.name, submit_user_id=request.user.user_id, deploy_env=deploy_env, deploy_type=deploy_type, original_file_name=original_file_name) logger.info( '%s 发起的部署任务单创建成功, 应用类型:INC 任务ID:%s 发布的版本:%s' % (request.user.name, task_id, version)) DeployLogs.objects.create(task_id=task_id, project_id=project_id, message='%s发起了部署单申请' % request.user.name) try: # 给审批人发送工作通知 data = { 'title': '有一条上线申请单待审批!', 'msg': f'#### 请登陆运维平台审批该工单 \n【申请标题】 \n {title} \n \n【上线版本】 \n {version} \n \n【提交人员】 \n {request.user.name} \n \n【开发人员】 \n {develop_user} \n {local_time}', 'user_id': str(obj.user_id) } deploy_send_dingtalk_work_notice.delay(data) except BaseException as e: logger.error('发送钉钉工作通知失败, 异常原因: %s' % str(traceback.format_exc())) return JsonResponse(data={ "errcode": 0, "msg": "部署单创建成功!", "data": "null" }) elif project_obj['is_container'] == 1 and deploy_type == 'FULL': with transaction.atomic(): DeployTask.objects.create( task_id=task_id, project_id=project_id, title=title, version=project_obj["title"], before_comment=desc, dingtalk_notice=ding_talk, approval_user=approval_user, test_report=test_repo, develop_user=develop_user, online_time=online_local_time, submit_people=request.user.name, submit_user_id=request.user.user_id, deploy_env=deploy_env, deploy_type=deploy_type, original_file_name=original_file_name) logger.info( '%s 发起的部署任务单创建成功, 应用类型:FULL 任务ID:%s 发布的版本:%s' % (request.user.name, task_id, version)) DeployLogs.objects.create(task_id=task_id, project_id=project_id, message='%s发起了部署单申请' % request.user.name) try: # 给审批人发送工作通知 data = { 'title': '有一条上线申请单待审批!', 'msg': f'#### 请登陆运维平台审批该工单 \n【申请标题】 \n {title} \n \n【上线版本】 \n {project_obj["title"]} \n \n【提交人员】 \n {request.user.name} \n \n【开发人员】 \n {develop_user} \n {local_time}', 'user_id': str(obj.user_id) } deploy_send_dingtalk_work_notice.delay(data) except BaseException as e: logger.error( '发送钉钉工作通知失败, 异常原因: %s' % str(traceback.format_exc()), e) return JsonResponse(data={ "errcode": 0, "msg": "部署单创建成功!", "data": "null" }) else: logger.warning('%s 发布类型不正确' % request.user.name) return JsonResponse( data={ "errcode": "10300", "msg": "您选择的发布类型不正确, 请重新选择!", "data": { "fileName": '' } }) except BaseException as e: logger.error('系统出现未知错误, 异常原因:%s' % str(traceback.format_exc())) return JsonResponse( data={ "errcode": "1006", "msg": "系统异常, 请刷新重试!", "data": e }, status=status.HTTP_500_INTERNAL_SERVER_ERROR, json_dumps_params={'ensure_ascii': False}) else: logger.warning('%s 未上传测试报告, 或上传的文件格式不正确! 原因:%s' % (request.user.name, err_file_name)) return JsonResponse( data={ "errcode": -1, "msg": "未上传测试报告, 或上传的文件格式不正确!", "data": { "fileName": err_file_name } })
def post(self, request, *args, **kwargs): """ 审批部署任务单 :param request: :param args: :param kwargs: :return: """ data = json.loads(request.body)['params'] try: obj = DeployTask.objects.filter(task_id=data['taskId']) # 判断当前用户是否为审批人 if obj and request.user.is_superuser or str( request.user.name) == str(obj.first().approval_user): if data['status'] == "agree": with transaction.atomic(): obj.update(status=2) DeployLogs.objects.create( task_id=data['taskId'], project_id=obj.first().project_id, message='%s已同意您发起的部署单, 等待部署中。 ' % request.user.name) logger.info( '%s发起的应用部署上线单已通过审核, 等待部署中, 任务ID: %s' % (str(obj.first().submit_people), data['taskId'])) try: # 给审批人发送工作通知 is_dingtalk_notice = obj.first() if is_dingtalk_notice.dingtalk_notice: submit_user_id = UserInfo.objects.filter( name=is_dingtalk_notice.submit_people).first() data = { 'title': '上线单已审批通过!', 'msg': f'\n【申请标题】 \n {is_dingtalk_notice.title} \n \n【上线版本】 \n \n {is_dingtalk_notice.version} \n \n【开发人员】 \n {is_dingtalk_notice.develop_user} \n {local_time}', 'user_id': str(submit_user_id.user_id) } deploy_send_dingtalk_work_notice.delay(data) # todo 通知运维 send_dingtalk_group.delay("%s \n 上线单已审批通过, 请前往运维平台部署" % str(obj.first().title)) except BaseException as e: logger.error( '发送钉钉群通知失败, 异常原因: %s' % str(traceback.format_exc()), e) return JsonResponse(data={ "errcode": 0, "msg": "操作成功", "data": "null" }) elif data['status'] == "refuse": if data['refuseMsg'] == '' or data['refuseMsg'] is None: return JsonResponse(data={ "errcode": 3001, "msg": "拒绝原因不能为空", "data": "null" }) with transaction.atomic(): obj.update(status=6) obj.update(refuse_msg=data['refuseMsg']) DeployLogs.objects.create( task_id=data['taskId'], project_id=obj.first().project_id, status=6, message='%s已驳回您发起的部署单,原因: %s。 ' % (request.user.name, data['refuseMsg'])) logger.info('部署单: %s 已被%s拒绝' % (data['taskId'], str(request.user.name))) try: # 给审批人发送工作通知 is_dingtalk_notice = obj.first() if is_dingtalk_notice.dingtalk_notice: submit_user_id = UserInfo.objects.filter( name=is_dingtalk_notice.submit_people).first() refuse_msg = data['refuseMsg'] data = { 'title': '上线单已被拒绝!', 'msg': f'#### 拒绝原因:{refuse_msg} \n【申请标题】 \n {is_dingtalk_notice.title} \n \n【上线版本】 \n \n {is_dingtalk_notice.version} \n \n【开发人员】 \n {is_dingtalk_notice.develop_user} \n {local_time}', 'user_id': str(submit_user_id.user_id) } deploy_send_dingtalk_work_notice.delay(data) except BaseException as e: logger.error( '发送钉钉工作通知失败, 异常原因: %s' % str(traceback.format_exc()), e) return JsonResponse(data={ "errcode": 0, "msg": "操作成功", "data": "null" }) else: logger.warning('非法操作, 参数异常') return JsonResponse(data={ "errcode": 3001, "msg": "非法操作", "data": "null" }) logger.info('您无权审批该工单, 操作人: %s' % str(request.user.name)) return JsonResponse(data={ "errcode": 3002, "msg": "非法操作, 您无权审批该工单!", "data": "null" }) except BaseException as e: logger.error('系统出现异常, 原因: %s' % str(traceback.format_exc())) return JsonResponse(data={ "errcode": "1006", "msg": "系统异常, 请刷新重试!", "data": e }, status=status.HTTP_500_INTERNAL_SERVER_ERROR, json_dumps_params={'ensure_ascii': False})