Esempio n. 1
0
    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': '你无权操作!'})
Esempio n. 2
0
    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
                    }
                })
Esempio n. 3
0
    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})