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
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
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
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
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
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