Ejemplo n.º 1
0
    def del_app_maker(self, biz_cc_id, app_id, fake=False):
        """
        @param app_id:
        @param biz_cc_id:
        @param fake:
        @return:
        """
        try:
            app_maker_obj = AppMaker.objects.get(id=app_id,
                                                 business__cc_id=biz_cc_id,
                                                 is_deleted=False)
        except AppMaker.DoesNotExist:
            return False, _(u"当前操作的轻应用不存在或已删除!")

        del_name = time_now_str()
        if not fake:
            # rename before delete to avoid name conflict when create a new app
            app_edit_result = edit_maker_app(
                app_maker_obj.creator,
                app_maker_obj.code,
                del_name[:20],
            )
            if not app_edit_result['result']:
                return False, _(u"删除失败:%s") % app_edit_result['message']

            # delete app on blueking desk
            app_del_result = del_maker_app(app_maker_obj.creator,
                                           app_maker_obj.code)
            if not app_del_result['result']:
                return False, _(u"删除失败:%s") % app_del_result['message']

        app_maker_obj.is_deleted = True
        app_maker_obj.name = del_name[:20]
        app_maker_obj.save()
        return True, app_maker_obj.code
Ejemplo n.º 2
0
def export_templates(request, project_id):
    try:
        template_id_list = json.loads(request.GET.get('template_id_list'))
    except Exception:
        return JsonResponse({
            'result': False,
            'message': 'invalid template_id_list'
        })

    if not isinstance(template_id_list, list):
        return JsonResponse({
            'result': False,
            'message': 'invalid template_id_list'
        })

    templates = TaskTemplate.objects.filter(id__in=template_id_list,
                                            project_id=project_id,
                                            is_deleted=False)
    perms_tuples = [(task_template_resource,
                     [task_template_resource.actions.view.id], t)
                    for t in templates]
    batch_verify_or_raise_auth_failed(principal_type='user',
                                      principal_id=request.user.username,
                                      perms_tuples=perms_tuples)

    # wash
    try:
        templates_data = json.loads(
            json.dumps(TaskTemplate.objects.export_templates(
                template_id_list, project_id),
                       sort_keys=True))
    except TaskTemplate.DoesNotExist:
        return JsonResponse({
            'result': False,
            'message': 'Invalid template id list'
        })
    except FlowExportError as e:
        return JsonResponse({'result': False, 'message': e.message})

    digest = hashlib.md5(
        json.dumps(templates_data, sort_keys=True) +
        settings.TEMPLATE_DATA_SALT).hexdigest()

    file_data = base64.b64encode(
        json.dumps({
            'template_data': templates_data,
            'digest': digest
        },
                   sort_keys=True))
    filename = 'bk_sops_%s_%s.dat' % (project_id, time_now_str())
    response = HttpResponse()
    response['Content-Disposition'] = 'attachment; filename=%s' % filename
    response['mimetype'] = 'application/octet-stream'
    response['Content-Type'] = 'application/octet-stream'
    response.write(file_data)
    return response
Ejemplo n.º 3
0
def export_templates(request, biz_cc_id):
    data = json.loads(request.body)
    template_id_list = data['template_id_list']

    if not isinstance(template_id_list, list):
        return JsonResponse({
            'result': False,
            'message': 'invalid template_id_list'
        })

    if not template_id_list:
        return JsonResponse({
            'result': False,
            'message': 'template_id_list can not be empty'
        })

    # wash
    try:
        templates_data = json.loads(
            json.dumps(TaskTemplate.objects.export_templates(
                template_id_list, biz_cc_id),
                       sort_keys=True))
    except TaskTemplate.DoesNotExist:
        return JsonResponse({
            'result': False,
            'message': 'Invalid template id list'
        })
    except FlowExportError as e:
        return JsonResponse({'result': False, 'message': e.message})

    digest = hashlib.md5(
        json.dumps(templates_data, sort_keys=True) +
        settings.TEMPLATE_DATA_SALT).hexdigest()

    file_data = base64.b64encode(
        json.dumps({
            'template_data': templates_data,
            'digest': digest
        },
                   sort_keys=True))
    filename = 'bk_sops_%s_%s.dat' % (biz_cc_id, time_now_str())
    response = HttpResponse()
    response['Content-Disposition'] = 'attachment; filename=%s' % filename
    response['mimetype'] = 'application/octet-stream'
    response['Content-Type'] = 'application/octet-stream'
    response.write(file_data)
    return response
Ejemplo n.º 4
0
    def save_app_maker(self, biz_cc_id, app_params, fake=False):
        """
        @summary:
        @param biz_cc_id: 业务ID
        @param app_params: App maker参数
        @param fake: 为True则不会真正调用API创建轻应用
        @return:
        """
        logger.info('save_app_maker params: %s' % app_params)
        app_id = app_params['id']
        if app_id == '0' or not app_id:
            app_id = None
        template_id = app_params['template_id']
        app_params['name'] = name_handler(app_params['name'], 20)
        app_params['desc'] = name_handler(app_params.get('desc', ''), 30)
        biz = Business.objects.get(cc_id=biz_cc_id)
        try:
            task_template = TaskTemplate.objects.get(pk=template_id,
                                                     business__cc_id=biz_cc_id,
                                                     is_deleted=False)
        except TaskTemplate.DoesNotExist:
            return False, _(u"保存失败,引用的流程模板不存在!")

        # create appmaker
        if not app_id:
            fields = {
                'business': biz,
                'name': app_params['name'],
                'code': '',
                'desc': app_params['desc'],
                'logo_url': '',
                'link': app_params['link_prefix'],
                'creator': app_params['username'],
                'editor': app_params['username'],
                'task_template': task_template,
                # 生成一个删除状态的对象,以便拼接轻应用访问链接
                'is_deleted': True,
            }
            if app_params.get('template_scheme_id'):
                fields['template_scheme_id'] = app_params['template_scheme_id']
            app_maker_obj = AppMaker.objects.create(**fields)

            # update app link
            app_id = app_maker_obj.id
            app_link = '{appmaker_prefix}{app_id}/newtask/{biz_cc_id}/selectnode/?template_id={template_id}'.format(
                appmaker_prefix=app_params['link_prefix'],
                app_id=app_id,
                biz_cc_id=biz_cc_id,
                template_id=template_id)
            app_maker_obj.link = app_link

            if fake:
                app_maker_obj.code = '%s%s' % (settings.APP_CODE,
                                               time_now_str())
                app_maker_obj.is_deleted = False
                app_maker_obj.save()
                return True, app_maker_obj

            # create app on blueking desk
            app_create_result = create_maker_app(
                app_params['username'],
                app_params['name'],
                app_link,
                app_params['username'],
                task_template.category,
                app_params['desc'],
            )
            if not app_create_result['result']:
                return False, _(u"创建轻应用失败:%s") % app_create_result['message']

            app_code = app_create_result['data']['bk_light_app_code']
            app_maker_obj.code = app_code
            app_maker_obj.is_deleted = False

        # edit appmaker
        else:
            try:
                app_maker_obj = AppMaker.objects.get(
                    id=app_id,
                    business__cc_id=biz_cc_id,
                    task_template__id=template_id,
                    is_deleted=False)
            except AppMaker.DoesNotExist:
                return False, _(u"保存失败,当前操作的轻应用不存在或已删除!")

            app_code = app_maker_obj.code
            creator = app_maker_obj.creator
            link = app_maker_obj.link

            if not fake:
                # edit app on blueking
                app_edit_result = edit_maker_app(
                    creator,
                    app_code,
                    app_params['name'],
                    link,
                    creator,
                    task_template.category,
                    app_params['desc'],
                )
                if not app_edit_result['result']:
                    return False, _(u"编辑轻应用失败:%s") % app_edit_result['message']

            app_maker_obj.name = app_params['name']
            app_maker_obj.desc = app_params['desc']
            app_maker_obj.editor = app_params['username']
            if 'template_scheme_id' in app_params:
                app_maker_obj.template_scheme_id = app_params[
                    'template_scheme_id']

        # upload app logo
        if not fake and app_params['logo_content']:
            logo = base64.b64encode(app_params['logo_content'])
            app_logo_result = modify_app_logo(app_maker_obj.creator, app_code,
                                              logo)
            if not app_logo_result['result']:
                logger.warning(u"AppMaker[id=%s] upload logo failed: %s" %
                               (app_maker_obj.id, app_logo_result['message']))

        # update app maker info
        app_maker_obj.logo_url = get_app_logo_url(app_code=app_code)
        app_maker_obj.save()

        return True, app_maker_obj
Ejemplo n.º 5
0
    def save_app_maker(self,
                       biz_cc_id,
                       template_id,
                       app_params,
                       app_id=None,
                       fake=False):
        """
        @summary:
        @param biz_cc_id: 业务ID
        @param template_id: 模板ID
        @param app_params: App maker参数
        @param app_id: 为None则新建,否则编辑
        @param fake: 为True则不会真正调用API创建
        @return:
        """
        logger.info('save_app_maker param: %s' % app_params)
        biz = Business.objects.get(cc_id=biz_cc_id)
        try:
            task_template = TaskTemplate.objects.get(pk=template_id,
                                                     business__cc_id=biz_cc_id,
                                                     is_deleted=False)
        except TaskTemplate.DoesNotExist as e:
            return False, _(u"保存失败,引用的流程模板不存在!")

        # 处理可见范围,获取用户信息
        if not app_id:
            # create app_maker object
            kwargs = {
                'business': biz,
                'name': name_handler(app_params['app_name'], 20),
                'code': '',
                'desc': name_handler(app_params.get('app_desc', ''), 200),
                'logo_url': '',
                'link': app_params['app_link_prefix'],
                'creator': app_params['username'],
                'editor': app_params['username'],
                'task_template': task_template,
                'is_deleted': True,
            }
            if app_params.get('template_schema_id'):
                kwargs['template_schema_id'] = app_params['template_schema_id']
            app_maker_obj = AppMaker.objects.create(**kwargs)

            if fake:
                app_maker_obj.code = '%s%s' % (settings.APP_CODE,
                                               time_now_str())
                app_maker_obj.is_deleted = False
                app_maker_obj.save()
                return True, app_maker_obj.code

            # create app on blueking desk
            app_id = app_maker_obj.id
            app_link = '%s%s/newtask/%s/selectnode/?template_id=%s' % (
                app_params['app_link_prefix'], app_id, biz_cc_id, template_id)
            app_create_result = create_maker_app(
                app_params['username'],
                app_params['app_name'],
                app_link,
                app_params['username'],
                task_template.category,
                app_params.get('app_desc', ''),
            )
            if not app_create_result['result']:
                return None, _(u"创建轻应用失败:%s") % app_create_result['message']

            app_code = app_create_result['data']['app_code']
            app_logo_url = '%s/media/applogo/%s.png?v=%s' % (
                settings.BK_URL, app_code, time.time())
            app_maker_obj.code = app_code
            app_maker_obj.link = app_link
            app_maker_obj.logo_url = app_logo_url
            app_maker_obj.is_deleted = False
            app_maker_obj.save()

            return True, app_code

        else:
            try:
                app_maker_obj = AppMaker.objects.get(
                    id=app_id,
                    business__cc_id=biz_cc_id,
                    task_template__id=template_id,
                    is_deleted=False)
            except AppMaker.DoesNotExist as e:
                return False, _(u"保存失败,当前操作的轻应用不存在或已删除!")

            app_code = app_maker_obj.code
            creator = app_maker_obj.creator

            if not fake:
                # edit app on blueking
                app_edit_result = edit_maker_app(
                    creator,
                    app_code,
                    app_params['app_name'],
                    '',
                    creator,
                    task_template.category,
                    app_params.get('app_desc', ''),
                )
                if not app_edit_result['result']:
                    return None, _(u"编辑轻应用失败:%s") % app_edit_result['message']

            # update app maker info
            app_logo_url = '%s/media/applogo/%s.png?v=%s' % (
                settings.BK_URL, app_code, time.time())
            app_maker_obj.name = app_params['app_name']
            app_maker_obj.desc = app_params.get('app_desc', '')
            app_maker_obj.editor = app_params['username']
            if app_params.get('template_schema_id'):
                app_maker_obj.template_schema_id = app_params.get[
                    'template_schema_id']
            # cannot change bound task_template
            app_maker_obj.logo_url = app_logo_url
            app_maker_obj.save()

            return True, app_code
Ejemplo n.º 6
0
    def save_app_maker(self, project_id, app_params, fake=False):
        """
        @summary:
        @param project_id: 项目 ID
        @param app_params: App maker参数
        @param fake: 为True则不会真正调用API创建轻应用
        @return:
        """
        logger.info('save_app_maker params: %s' % app_params)
        app_id = app_params['id']
        if app_id == '0' or not app_id:
            app_id = None
        template_id = app_params['template_id']
        app_params['name'] = name_handler(app_params['name'], 20)
        app_params['desc'] = name_handler(app_params.get('desc', ''), 30)
        proj = Project.objects.get(id=project_id)
        try:
            task_template = TaskTemplate.objects.get(pk=template_id,
                                                     project_id=project_id,
                                                     is_deleted=False)
        except TaskTemplate.DoesNotExist:
            return False, _(u"保存失败,引用的流程模板不存在!")

        # create appmaker
        from gcloud.contrib.appmaker.permissions import mini_app_resource
        if not app_id:
            verify_or_raise_auth_failed(
                principal_type='user',
                principal_id=app_params['username'],
                resource=task_template_resource,
                action_ids=[task_template_resource.actions.create_mini_app.id],
                instance=task_template)

            fields = {
                'project': proj,
                'name': app_params['name'],
                'code': '',
                'desc': app_params['desc'],
                'logo_url': '',
                'link': app_params['link_prefix'],
                'creator': app_params['username'],
                'editor': app_params['username'],
                'task_template': task_template,
                # 生成一个删除状态的对象,以便拼接轻应用访问链接
                'is_deleted': True,
            }
            if app_params.get('template_scheme_id'):
                fields['template_scheme_id'] = app_params['template_scheme_id']
            app_maker_obj = AppMaker.objects.create(**fields)

            # update app link
            app_id = app_maker_obj.id
            app_link = '{appmaker_prefix}{app_id}/newtask/{project_id}/selectnode/?template_id={template_id}'.format(
                appmaker_prefix=app_params['link_prefix'],
                app_id=app_id,
                project_id=project_id,
                template_id=template_id)
            app_maker_obj.link = app_link

            if fake:
                app_maker_obj.code = '%s%s' % (settings.APP_CODE,
                                               time_now_str())
                app_maker_obj.is_deleted = False
                app_maker_obj.save()
                return True, app_maker_obj

            # create app on blueking desk
            app_create_result = create_maker_app(
                app_params['username'],
                app_params['name'],
                app_link,
                app_params['username'],
                task_template.category,
                app_params['desc'],
            )
            if not app_create_result['result']:
                return False, _(u"创建轻应用失败:%s") % app_create_result['message']

            app_code = app_create_result['data']['bk_light_app_code']
            app_maker_obj.code = app_code
            app_maker_obj.is_deleted = False

        # edit appmaker
        else:
            try:
                app_maker_obj = AppMaker.objects.get(
                    id=app_id,
                    project_id=project_id,
                    task_template__id=template_id,
                    is_deleted=False)
            except AppMaker.DoesNotExist:
                return False, _(u"保存失败,当前操作的轻应用不存在或已删除!")

            verify_or_raise_auth_failed(
                principal_type='user',
                principal_id=app_params['username'],
                resource=mini_app_resource,
                action_ids=[mini_app_resource.actions.edit.id],
                instance=app_maker_obj)

            app_code = app_maker_obj.code
            creator = app_maker_obj.creator
            link = app_maker_obj.link

            if not fake:
                # edit app on blueking
                app_edit_result = edit_maker_app(
                    creator,
                    app_code,
                    app_params['name'],
                    link,
                    creator,
                    task_template.category,
                    app_params['desc'],
                )
                if not app_edit_result['result']:
                    return False, _(u"编辑轻应用失败:%s") % app_edit_result['message']

            app_maker_obj.name = app_params['name']
            app_maker_obj.desc = app_params['desc']
            app_maker_obj.editor = app_params['username']
            if 'template_scheme_id' in app_params:
                app_maker_obj.template_scheme_id = app_params[
                    'template_scheme_id']

        # upload app logo
        if not fake and app_params['logo_content']:
            logo = base64.b64encode(app_params['logo_content'])
            app_logo_result = modify_app_logo(app_maker_obj.creator, app_code,
                                              logo)
            if not app_logo_result['result']:
                logger.warning(u"AppMaker[id=%s] upload logo failed: %s" %
                               (app_maker_obj.id, app_logo_result['message']))
            # update app maker info
            app_maker_obj.logo_url = get_app_logo_url(app_code=app_code)

        app_maker_obj.save()
        return True, app_maker_obj