Skip to content

Commit

Permalink
Merge pull request #65 from TencentBlueKing/release_1.9.0
Browse files Browse the repository at this point in the history
release 1.9.0 merge dev
  • Loading branch information
normal-wls authored Nov 19, 2024
2 parents a0c6285 + 8dedb31 commit 4c03fa6
Show file tree
Hide file tree
Showing 42 changed files with 961 additions and 257 deletions.
2 changes: 1 addition & 1 deletion app_desc.yaml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
spec_version: 2
app_version: "1.8.0"
app_version: "1.9.0"
app:
region: default
bk_app_code: &APP_CODE bk_flow_engine
Expand Down
4 changes: 3 additions & 1 deletion bkflow/interface/context_processors.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ def bkflow_settings(request):
frontend_entry_url = "{}bkflow".format(settings.STATIC_URL) if settings.RUN_VER == "open" else "/static/bkflow"
enable_notice_center = int(EnvironmentVariables.objects.get_var("ENABLE_NOTICE_CENTER", 0))
language = request.COOKIES.get("blueking_language", "zh-cn")
doc_lang_mappings = {"zh-cn": "ZH", "en": "EN"}
run_ver_key = "BKAPP_RUN_VER_NAME" if language == "zh-cn" else "BKAPP_RUN_VER_NAME_{}".format(language.upper())

ctx = {
Expand All @@ -36,7 +37,8 @@ def bkflow_settings(request):
"MEMBER_SELECTOR_DATA_HOST": settings.MEMBER_SELECTOR_DATA_HOST,
"APP_CODE": settings.APP_CODE,
"USERNAME": request.user.username,
"BK_DOC_URL": f"{env.BK_DOC_CENTER_HOST}/markdown/ZH/BKFlow/1.8/UserGuide/Introduce/introduce.md",
"BK_DOC_URL": f"{env.BK_DOC_CENTER_HOST}/markdown/{doc_lang_mappings.get(language, 'ZH')}/BKFlow/1.8"
f"/UserGuide/Introduce/introduce.md",
# 是否开启通知中心
"ENABLE_NOTICE_CENTER": enable_notice_center,
"BK_PAAS_SHARED_RES_URL": env.BKPAAS_SHARED_RES_URL,
Expand Down
81 changes: 40 additions & 41 deletions bkflow/pipeline_plugins/query/select.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,55 +21,54 @@

import logging

import requests
from django.conf import settings
from django.http import JsonResponse
from django.utils.translation import ugettext_lazy as _

logger = logging.getLogger("root")


def variable_select_source_data_proxy(request):
"""
@summary: 获取下拉框源数据的通用接口
@summary: 获取下拉框源数据的通用接口,暂时关闭该接口
@param request:
@return:
"""
url = request.GET.get("url")
try:
response = requests.get(url=url, verify=False, timeout=10)
except Exception as e:
logger.exception("variable select get data from url[url={url}] raise error: {error}".format(url=url, error=e))
text = _("请求数据异常: {error}").format(error=e)
data = [{"text": text, "value": ""}]
return JsonResponse(data, safe=False)
return JsonResponse([{"text": "text1", "value": "value1"}])

try:
data = response.json()
except Exception:
try:
content = response.content.decode(response.encoding)
logger.exception(
"variable select get data from url[url={url}] is not a valid JSON: {data}".format(
url=url, data=content[:500]
)
)
except Exception:
logger.exception("variable select get data from url[url={url}] data is not a valid JSON".format(url=url))
text = _("返回数据格式错误,不是合法 JSON 格式")
data = [{"text": text, "value": ""}]
return JsonResponse(data, safe=False)

# 支持开发者对远程数据源数据配置处理函数,进行再处理
post_process_function = getattr(settings, "REMOTE_SOURCE_DATA_TRANSFORM_FUNCTION", None)
if post_process_function and callable(post_process_function):
try:
data = post_process_function(data)
except Exception as e:
logger.exception(
"variable select transforming data from remote resource url[url={url}] "
"raise error: {error}".format(url=url, error=e)
)
text = _("远程数据源数据转换失败: {error}").format(error=e)
data = [{"text": text, "value": ""}]
return JsonResponse(data, safe=False)
# url = request.GET.get("url")
# try:
# response = requests.get(url=url, verify=False, timeout=10)
# except Exception as e:
# logger.exception("variable select get data from url[url={url}] raise error: {error}".format(url=url, error=e))
# text = _("请求数据异常: {error}").format(error=e)
# data = [{"text": text, "value": ""}]
# return JsonResponse(data, safe=False)
#
# try:
# data = response.json()
# except Exception:
# try:
# content = response.content.decode(response.encoding)
# logger.exception(
# "variable select get data from url[url={url}] is not a valid JSON: {data}".format(
# url=url, data=content[:500]
# )
# )
# except Exception:
# logger.exception("variable select get data from url[url={url}] data is not a valid JSON".format(url=url))
# text = _("返回数据格式错误,不是合法 JSON 格式")
# data = [{"text": text, "value": ""}]
# return JsonResponse(data, safe=False)
#
# # 支持开发者对远程数据源数据配置处理函数,进行再处理
# post_process_function = getattr(settings, "REMOTE_SOURCE_DATA_TRANSFORM_FUNCTION", None)
# if post_process_function and callable(post_process_function):
# try:
# data = post_process_function(data)
# except Exception as e:
# logger.exception(
# "variable select transforming data from remote resource url[url={url}] "
# "raise error: {error}".format(url=url, error=e)
# )
# text = _("远程数据源数据转换失败: {error}").format(error=e)
# data = [{"text": text, "value": ""}]
# return JsonResponse(data, safe=False)
34 changes: 18 additions & 16 deletions bkflow/pipeline_plugins/static/variables/select.js
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
hookable: true,
items: [{name: gettext("自定义"), value: "0"}, {name: gettext("远程数据源"), value: "1"}],
value: "0",
hidden: true,
validation: [
{
type: "required"
Expand All @@ -29,7 +30,7 @@
attrs: {
name: gettext("选项"),
hookable: true,
placeholder: gettext('请输入数据源信息,自定义数据源格式为 [{"text": "", "value": ""}...],若是远程数据源则填写返回该格式数据的 URL'),
placeholder: gettext('请输入数据源信息,自定义数据源格式为 [{"text": "", "value": ""}...]'),
validation: [
{
type: "required"
Expand Down Expand Up @@ -73,10 +74,11 @@
let remote_url = "";
let items = [];
let placeholder = '';
if (metaConfig.datasource === "1") {
remote_url = $.context.get('site_url') + 'api/plugin_query/variable_select_source_data_proxy/?url=' + metaConfig.items_text;
remote = true;
} else {
// if (metaConfig.datasource === "1") {
// remote_url = $.context.get('site_url') + 'api/plugin_query/variable_select_source_data_proxy/?url=' + metaConfig.items_text;
// remote = true;
// }
if (metaConfig.datasource === "0") {
try {
items = JSON.parse(metaConfig.items_text);
} catch (err) {
Expand All @@ -92,16 +94,16 @@
let multiple = false;
let default_val = metaConfig.default || '';

if (metaConfig.type === "1") {
multiple = true;
default_val = [];
if (metaConfig.default) {
let vals = metaConfig.default.split(',');
for (let i in vals) {
default_val.push(vals[i].trim());
}
}
}
// if (metaConfig.type === "1") {
// multiple = true;
// default_val = [];
// if (metaConfig.default) {
// let vals = metaConfig.default.split(',');
// for (let i in vals) {
// default_val.push(vals[i].trim());
// }
// }
// }
return {
tag_code: this.tag_code,
type: "select",
Expand All @@ -115,7 +117,7 @@
remote_url: remote_url,
placeholder: placeholder,
remote_data_init: function (data) {
return data
return data;
},
validation: [
{
Expand Down
18 changes: 18 additions & 0 deletions bkflow/space/migrations/0007_alter_space_app_code.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# Generated by Django 3.2.15 on 2024-10-09 03:06

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('space', '0006_auto_20240823_1544'),
]

operations = [
migrations.AlterField(
model_name='space',
name='app_code',
field=models.CharField(max_length=32, verbose_name='应用ID'),
),
]
2 changes: 1 addition & 1 deletion bkflow/space/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ class Space(CommonModel):
id = models.AutoField(_("空间ID"), primary_key=True)
# 空间名不允许重复
name = models.CharField(_("空间名称"), max_length=32, null=False, blank=False, unique=True)
app_code = models.CharField(_("APP Code"), max_length=32, null=False, blank=False)
app_code = models.CharField(_("应用ID"), max_length=32, null=False, blank=False)
desc = models.CharField(_("空间描述"), max_length=128, null=True, blank=True)
platform_url = models.CharField(_("平台提供服务的地址"), max_length=256, null=False, blank=False)
create_type = models.CharField(
Expand Down
1 change: 1 addition & 0 deletions frontend/src/App.vue
Original file line number Diff line number Diff line change
Expand Up @@ -192,6 +192,7 @@ body {
}
.with-system-notice {
height: calc(100vh - 40px) !important;
.navigation-nav,
.container-content {
max-height: calc(100vh - 92px)!important;
}
Expand Down
49 changes: 32 additions & 17 deletions frontend/src/components/DecisionTable/ImportExport/ExportBtn.vue
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,6 @@
import { getCellText } from './dataTransfer.js';
export default {
props: {
name: {
type: String,
default: '',
},
data: {
type: Object,
default: () => ({}),
Expand All @@ -42,34 +38,52 @@
horizontal: 'center', // 水平居中
vertical: 'center', // 垂直居中
},
border: {
top: { style: 'thin', color: { rgb: '000000' } },
bottom: { style: 'thin', color: { rgb: '000000' } },
left: { style: 'thin', color: { rgb: '000000' } },
right: { style: 'thin', color: { rgb: '000000' } },
},
border: ['top', 'bottom', 'left', 'right'].reduce((acc, side) => {
acc[side] = { style: 'thin', color: { rgb: '000000' } };
return acc;
}, {}),
};
// 定义表头和注释
const headers = [
{
label: 'Input',
children: inputs.map(item => ({ label: `${item.name}(${item.id})`, description: JSON.stringify(item) })),
children: inputs.map((item) => {
const { id, name, ...rest } = item;
return { label: `${name}(${id})`, description: JSON.stringify(rest) };
}),
},
{
label: 'Output',
children: outputs.map(item => ({ label: `${item.name}(${item.id})`, description: JSON.stringify(item) })),
children: outputs.map((item) => {
const { id, name, ...rest } = item;
return { label: `${name}(${id})`, description: JSON.stringify(rest) };
}),
},
];
const data = records.reduce((acc, cur) => {
// 暂时过滤【条件组合】类型!!!
if (cur.inputs.type !== 'common') return acc;
const arr = [];
cur.inputs.conditions.forEach((item) => {
arr.push({ v: getCellText(item), t: 's', s: cellStyles });
cur.inputs.conditions.forEach((item, index) => {
const inputInfo = inputs[index];
const v = getCellText(item);
if (inputInfo.type === 'select') {
// 下拉框类型导出为text
const option = inputInfo.options.items.find(o => o.id === v);
arr.push({ v: option.name, t: 's', s: cellStyles });
} else {
arr.push({ v, t: 's', s: cellStyles });
}
});
outputs.forEach((item) => {
arr.push({ v: cur.outputs[item.id], t: 's', s: cellStyles });
if (item.type === 'select') {
// 下拉框类型导出为text
const option = item.options.items.find(o => o.id === cur.outputs[item.id]);
arr.push({ v: option.name, t: 's', s: cellStyles });
} else {
arr.push({ v: cur.outputs[item.id], t: 's', s: cellStyles });
}
});
acc.push(arr);
return acc;
Expand Down Expand Up @@ -108,8 +122,9 @@
fill: { fgColor: { rgb: '9FE3FF' } },
},
});
const c = headerIndex === 0 ? childIndex : (headers[headerIndex - 1].children.length + childIndex);
comments.push({
cell: XLSX.utils.encode_cell({ c: headerIndex * header.children.length + childIndex, r: 1 }),
cell: XLSX.utils.encode_cell({ c, r: 1 }),
comment: child.description,
});
});
Expand Down Expand Up @@ -154,7 +169,7 @@
XLSX.utils.book_append_sheet(wb, ws, 'Sheet1');
// 导出工作簿
XLSX.writeFile(wb, `${this.name || 'Decision'}_${moment().format('YYYYMMDDHHmmss')}.xlsx`);
XLSX.writeFile(wb, `${window.APP_CODE}_decision_${moment().format('YYYYMMDDHHmmss')}.xlsx`);
},
},
};
Expand Down
22 changes: 15 additions & 7 deletions frontend/src/components/DecisionTable/ImportExport/ImportBtn.vue
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
<script>
import * as XLSX from 'xlsx';
import tools from '@/utils/tools.js';
import { validateFiled, parseValue, validateValue, getValueRight } from './dataTransfer.js';
import { validateFiled, parseValue, getValueRight } from './dataTransfer.js';
export default {
props: {
data: {
Expand Down Expand Up @@ -114,7 +114,13 @@
},
getHeader(row, sheetValue) {
const header = [];
const titleRegex = /^([^\(]+)\(([^)]+)\)$/;
const result = row.every((cell) => {
if (!titleRegex.test(cell)) {
this.showMessage(`表格【${cell}】列标题数据结构不对`);
return false;
}
const comment = sheetValue.find(value => Object.prototype.toString.call(value) === '[object Object]' && value.v === cell);
if (!comment || !comment.c) {
Expand All @@ -127,7 +133,12 @@
this.showMessage(`表格【${cell}】列的配置注释不是json格式`);
return false;
}
header.push(JSON.parse(t));
const [, name, id] = cell.match(titleRegex);
header.push({
id,
name,
...JSON.parse(t),
});
return true;
});
Expand All @@ -142,11 +153,8 @@
const outputs = {};
const result = header.every((col, colIndex) => {
// 解析value和操作方式
const { value, type } = parseValue(row[colIndex]);
// 校验value
const message = validateValue(value, col);
// 解析并校验value和操作方式
const { value, type, message } = parseValue(row[colIndex], col);
if (message) {
this.showMessage(message);
return false;
Expand Down
Loading

0 comments on commit 4c03fa6

Please sign in to comment.