dataops-sdk 0.3.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of dataops-sdk might be problematic. Click here for more details.
- dataops_sdk/__init__.py +84 -0
- dataops_sdk/constants.py +6 -0
- dataops_sdk/exceptions.py +31 -0
- dataops_sdk/runner/__init__.py +46 -0
- dataops_sdk/runner/datasource_factory.py +83 -0
- dataops_sdk/runner/schemas/nacos/__init__.py +5 -0
- dataops_sdk/runner/schemas/nacos/config.py +40 -0
- dataops_sdk/runner/schemas/nacos/constants.py +235 -0
- dataops_sdk/runner/schemas/nacos/instance.py +103 -0
- dataops_sdk/runner/schemas/nacos/nacos_exception.py +44 -0
- dataops_sdk/runner/schemas/nacos/naming_param.py +62 -0
- dataops_sdk/runner/schemas/nacos/naming_request.py +84 -0
- dataops_sdk/runner/schemas/nacos/naming_response.py +50 -0
- dataops_sdk/runner/schemas/nacos/preserved_metadata_key.py +10 -0
- dataops_sdk/runner/schemas/nacos/service.py +119 -0
- dataops_sdk/runner/utils/__init__.py +42 -0
- dataops_sdk/runner/utils/common.py +209 -0
- dataops_sdk/runner/utils/dbConn_base.py +256 -0
- dataops_sdk/runner/utils/dbConn_sync.py +485 -0
- dataops_sdk/runner/utils/duckdb_manager.py +203 -0
- dataops_sdk/runner/utils/file_transfer_base.py +307 -0
- dataops_sdk/runner/utils/ftp_file_transfer.py +242 -0
- dataops_sdk/runner/utils/log.py +50 -0
- dataops_sdk/runner/utils/nacos.py +96 -0
- dataops_sdk/runner/utils/neo4j_sync.py +236 -0
- dataops_sdk/runner/utils/queue_base.py +224 -0
- dataops_sdk/runner/utils/queue_kafka.py +150 -0
- dataops_sdk/runner/utils/sftp_file_transfer.py +243 -0
- dataops_sdk/schemas/__init__.py +32 -0
- dataops_sdk/schemas/alarm.py +38 -0
- dataops_sdk/schemas/api.py +37 -0
- dataops_sdk/schemas/data_table.py +437 -0
- dataops_sdk/schemas/datasource.py +26 -0
- dataops_sdk/schemas/dict_.py +13 -0
- dataops_sdk/schemas/enums.py +120 -0
- dataops_sdk/schemas/group.py +40 -0
- dataops_sdk/schemas/hazard.py +151 -0
- dataops_sdk/schemas/meta.py +175 -0
- dataops_sdk/schemas/query.py +175 -0
- dataops_sdk/schemas/report.py +22 -0
- dataops_sdk/schemas/skill.py +70 -0
- dataops_sdk/schemas/table.py +65 -0
- dataops_sdk/schemas/user.py +52 -0
- dataops_sdk/schemas/widget.py +651 -0
- dataops_sdk/schemas/workflow.py +63 -0
- dataops_sdk/services/__init__.py +110 -0
- dataops_sdk/services/alarm.py +324 -0
- dataops_sdk/services/api.py +28 -0
- dataops_sdk/services/auth.py +120 -0
- dataops_sdk/services/data_table.py +485 -0
- dataops_sdk/services/dataset.py +127 -0
- dataops_sdk/services/datasource.py +57 -0
- dataops_sdk/services/dict_.py +69 -0
- dataops_sdk/services/hazard.py +260 -0
- dataops_sdk/services/meta.py +523 -0
- dataops_sdk/services/metrics.py +42 -0
- dataops_sdk/services/ref.py +66 -0
- dataops_sdk/services/report.py +36 -0
- dataops_sdk/services/skill.py +276 -0
- dataops_sdk/services/table.py +340 -0
- dataops_sdk/services/widget.py +143 -0
- dataops_sdk/services/workflow.py +102 -0
- dataops_sdk/session.py +292 -0
- dataops_sdk/tiptap/__init__.py +30 -0
- dataops_sdk/tiptap/builder.py +75 -0
- dataops_sdk/tiptap/constants.py +133 -0
- dataops_sdk/tiptap/markdown_parser.py +294 -0
- dataops_sdk/tiptap/models.py +43 -0
- dataops_sdk/tiptap/parse_utils.py +889 -0
- dataops_sdk/tiptap/render_utils.py +846 -0
- dataops_sdk/tiptap/renderers.py +51 -0
- dataops_sdk/tiptap/tool.py +629 -0
- dataops_sdk/utils/__init__.py +15 -0
- dataops_sdk/utils/common.py +211 -0
- dataops_sdk/utils/utils.py +120 -0
- dataops_sdk-0.3.0.dist-info/METADATA +25 -0
- dataops_sdk-0.3.0.dist-info/RECORD +79 -0
- dataops_sdk-0.3.0.dist-info/WHEEL +5 -0
- dataops_sdk-0.3.0.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,437 @@
|
|
|
1
|
+
"""多维表格 (DataTable) 的 Schema 定义.
|
|
2
|
+
|
|
3
|
+
对应前端 meta.data 的完整结构定义,参考:
|
|
4
|
+
- data-ops-frame-work/apps/web-data-ops/src/pages/data_table
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
from collections.abc import Mapping
|
|
10
|
+
from typing import Annotated, Any, Literal
|
|
11
|
+
|
|
12
|
+
from pydantic import (
|
|
13
|
+
AliasChoices,
|
|
14
|
+
BaseModel,
|
|
15
|
+
BeforeValidator,
|
|
16
|
+
ConfigDict,
|
|
17
|
+
Field,
|
|
18
|
+
JsonValue,
|
|
19
|
+
)
|
|
20
|
+
|
|
21
|
+
from dataops_sdk.schemas.enums import ColumnType, SqlExpression
|
|
22
|
+
|
|
23
|
+
from .meta import Meta, MetaCreate
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def insert_dict_by_none(v):
|
|
27
|
+
if v is None:
|
|
28
|
+
return {}
|
|
29
|
+
return v
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
# ---------------------------------------------------------------------------
|
|
33
|
+
# Field typeExt sub-models
|
|
34
|
+
# ---------------------------------------------------------------------------
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
class TextFieldTypeExt(BaseModel):
|
|
38
|
+
"""text 类型扩展配置."""
|
|
39
|
+
|
|
40
|
+
length: Annotated[int, Field(description="最大字符数", default=200)] = 200
|
|
41
|
+
default_value: Annotated[str | None, Field(description="默认值")] = None
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
class NumberFieldTypeExt(BaseModel):
|
|
45
|
+
"""number 类型扩展配置."""
|
|
46
|
+
|
|
47
|
+
format: Annotated[
|
|
48
|
+
Literal[
|
|
49
|
+
"integer",
|
|
50
|
+
"thousand",
|
|
51
|
+
"thousand_decimal",
|
|
52
|
+
"decimal1",
|
|
53
|
+
"decimal2",
|
|
54
|
+
"decimal3",
|
|
55
|
+
"decimal4",
|
|
56
|
+
"decimal5",
|
|
57
|
+
"decimal6",
|
|
58
|
+
"decimal7",
|
|
59
|
+
"decimal8",
|
|
60
|
+
"decimal9",
|
|
61
|
+
"percentage",
|
|
62
|
+
"percentage_decimal",
|
|
63
|
+
]
|
|
64
|
+
| None,
|
|
65
|
+
Field(description="数字格式"),
|
|
66
|
+
] = None
|
|
67
|
+
length: Annotated[int | None, Field(description="数字总长度")] = None
|
|
68
|
+
decimal_place: Annotated[int | None, Field(description="小数位数")] = None
|
|
69
|
+
default_value: Annotated[float | None, Field(description="默认值")] = None
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
class DateFieldTypeExt(BaseModel):
|
|
73
|
+
"""date 类型扩展配置."""
|
|
74
|
+
|
|
75
|
+
format: Annotated[str | None, Field(description="显示格式,如 YYYY-MM-DD")] = None
|
|
76
|
+
default_value_type: Annotated[
|
|
77
|
+
Literal["custom", "create_time"] | None, Field(description="默认值类型")
|
|
78
|
+
] = None
|
|
79
|
+
default_value: Annotated[str | None, Field(description="具体默认日期")] = None
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
class DatetimeFieldTypeExt(BaseModel):
|
|
83
|
+
"""datetime 类型扩展配置."""
|
|
84
|
+
|
|
85
|
+
format: Annotated[str | None, Field(description="显示格式")] = None
|
|
86
|
+
value_format: Annotated[str | None, Field(description="值格式")] = None
|
|
87
|
+
picker_type: Annotated[Literal["date", "datetime"] | None, Field(description="选择器类型")] = (
|
|
88
|
+
None
|
|
89
|
+
)
|
|
90
|
+
default_value_type: Annotated[
|
|
91
|
+
Literal["custom", "create_time"] | None, Field(description="默认值类型")
|
|
92
|
+
] = None
|
|
93
|
+
default_value: Annotated[str | None, Field(description="具体默认值")] = None
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
class SelectOption(BaseModel):
|
|
97
|
+
"""单选/多选选项."""
|
|
98
|
+
|
|
99
|
+
id: Annotated[str, Field(description="选项ID")]
|
|
100
|
+
value: Annotated[str, Field(description="选项值")]
|
|
101
|
+
color: Annotated[str | None, Field(description="选项颜色 (hex)")] = None
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
class SelectRef(BaseModel):
|
|
105
|
+
"""select/reference 模式的数据源引用."""
|
|
106
|
+
|
|
107
|
+
type: Annotated[Literal["data_table"], Field(description="引用类型")]
|
|
108
|
+
code: Annotated[str, Field(description="引用的数据表编码")]
|
|
109
|
+
subtype: Annotated[Literal["field"] | None, Field(description="子类型")] = None
|
|
110
|
+
subcode: Annotated[str | None, Field(description="引用的字段ID")] = None
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
class SelectFieldTypeExt(BaseModel):
|
|
114
|
+
"""select 类型扩展配置 (也用于 multiSelect)."""
|
|
115
|
+
|
|
116
|
+
mode: Annotated[Literal["custom", "reference"] | None, Field(description="选项模式")] = None
|
|
117
|
+
options: Annotated[list[SelectOption] | None, Field(description="自定义选项列表")] = None
|
|
118
|
+
show_color: Annotated[bool | None, Field(description="是否显示颜色")] = None
|
|
119
|
+
ref: Annotated[SelectRef | None, Field(description="引用模式的数据源")] = None
|
|
120
|
+
default_value: Annotated[Any | None, Field(description="默认值")] = None
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
class RelationRef(BaseModel):
|
|
124
|
+
"""relation 字段的关联目标."""
|
|
125
|
+
|
|
126
|
+
type: Annotated[Literal["data_table", "table"], Field(description="关联类型")]
|
|
127
|
+
code: Annotated[str, Field(description="关联对象编码")]
|
|
128
|
+
value_field: Annotated[str | None, Field(description="值字段 (table类型)")] = None
|
|
129
|
+
display_field: Annotated[str | None, Field(description="显示字段 (table类型)")] = None
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
class FilterCondition(BaseModel):
|
|
133
|
+
"""过滤条件."""
|
|
134
|
+
|
|
135
|
+
name: Annotated[str | None, Field(description="字段名/参数名")] = None
|
|
136
|
+
expression: Annotated[SqlExpression | None, Field(description="表达式")] = None
|
|
137
|
+
value: Annotated[Any | None, Field(description="过滤值")] = None
|
|
138
|
+
value_ext: Annotated[Any | None, Field(description="扩展值")] = None
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
class RelationFieldTypeExt(BaseModel):
|
|
142
|
+
"""relation 类型扩展配置."""
|
|
143
|
+
|
|
144
|
+
ref: Annotated[RelationRef | None, Field(description="关联目标")] = None
|
|
145
|
+
multiple: Annotated[bool, Field(description="是否允许多选", default=False)] = False
|
|
146
|
+
range_type: Annotated[Literal["all", "filter"] | None, Field(description="可关联数据范围")] = (
|
|
147
|
+
None
|
|
148
|
+
)
|
|
149
|
+
filters: Annotated[list[FilterCondition] | None, Field(description="筛选条件")] = None
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
class SubTableRef(BaseModel):
|
|
153
|
+
"""subtable 关联目标."""
|
|
154
|
+
|
|
155
|
+
type: Annotated[Literal["data_table"], Field(description="关联类型")]
|
|
156
|
+
code: Annotated[str, Field(description="关联的多维表格编码")]
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
class SubTableFieldSelect(BaseModel):
|
|
160
|
+
"""subtable 选择显示的字段."""
|
|
161
|
+
|
|
162
|
+
name: Annotated[str, Field(description="字段名")]
|
|
163
|
+
|
|
164
|
+
|
|
165
|
+
class SubTableQueryParamCondition(BaseModel):
|
|
166
|
+
"""subtable 条件映射."""
|
|
167
|
+
|
|
168
|
+
source_field: Annotated[str, Field(description="源字段名")]
|
|
169
|
+
target_field: Annotated[str, Field(description="目标字段名")]
|
|
170
|
+
|
|
171
|
+
|
|
172
|
+
class SubTableQueryParam(BaseModel):
|
|
173
|
+
"""subtable 查询参数."""
|
|
174
|
+
|
|
175
|
+
condition_list: Annotated[
|
|
176
|
+
list[SubTableQueryParamCondition] | None, Field(description="条件映射列表")
|
|
177
|
+
] = None
|
|
178
|
+
|
|
179
|
+
|
|
180
|
+
class SubTableFieldTypeExt(BaseModel):
|
|
181
|
+
"""subtable 类型扩展配置."""
|
|
182
|
+
|
|
183
|
+
ref: Annotated[SubTableRef | None, Field(description="关联的多维表格")]
|
|
184
|
+
fields: Annotated[list[SubTableFieldSelect] | None, Field(description="选择显示的字段")]
|
|
185
|
+
allow_add: Annotated[bool, Field(description="是否允许新增", default=True)] = True
|
|
186
|
+
allow_delete: Annotated[bool, Field(description="是否允许删除", default=True)] = True
|
|
187
|
+
query_param: Annotated[SubTableQueryParam | None, Field(description="查询参数")] = None
|
|
188
|
+
|
|
189
|
+
|
|
190
|
+
class DictRef(BaseModel):
|
|
191
|
+
"""dict 类型引用."""
|
|
192
|
+
|
|
193
|
+
type: Annotated[Literal["dict"], Field(description="引用类型")]
|
|
194
|
+
code: Annotated[str, Field(description="字典编码")]
|
|
195
|
+
|
|
196
|
+
|
|
197
|
+
class DictFieldTypeExt(BaseModel):
|
|
198
|
+
"""dict 类型扩展配置."""
|
|
199
|
+
|
|
200
|
+
ref: Annotated[DictRef | None, Field(description="字典引用")]
|
|
201
|
+
multiple: Annotated[bool, Field(description="是否允许多选", default=False)] = False
|
|
202
|
+
|
|
203
|
+
|
|
204
|
+
class UserFieldTypeExt(BaseModel):
|
|
205
|
+
"""user 类型扩展配置."""
|
|
206
|
+
|
|
207
|
+
multiple: Annotated[bool, Field(description="是否允许多选用户", default=False)] = False
|
|
208
|
+
|
|
209
|
+
|
|
210
|
+
class FileFieldTypeExt(BaseModel):
|
|
211
|
+
"""file 类型扩展配置."""
|
|
212
|
+
|
|
213
|
+
limit: Annotated[int, Field(description="最大文件数量", default=1)] = 1
|
|
214
|
+
accept: Annotated[str | None, Field(description="接受的文件类型")] = None
|
|
215
|
+
|
|
216
|
+
|
|
217
|
+
# ---------------------------------------------------------------------------
|
|
218
|
+
# FieldTypeExt discriminated union
|
|
219
|
+
# ---------------------------------------------------------------------------
|
|
220
|
+
|
|
221
|
+
|
|
222
|
+
class DataTableFieldTypeExt(BaseModel):
|
|
223
|
+
"""联合的 typeExt 类型,兼容所有字段类型."""
|
|
224
|
+
|
|
225
|
+
text: Annotated[TextFieldTypeExt | None, Field(description="text 类型配置")] = None
|
|
226
|
+
number: Annotated[NumberFieldTypeExt | None, Field(description="number 类型配置")] = None
|
|
227
|
+
date: Annotated[DateFieldTypeExt | None, Field(description="date 类型配置")] = None
|
|
228
|
+
datetime: Annotated[DatetimeFieldTypeExt | None, Field(description="datetime 类型配置")] = None
|
|
229
|
+
select: Annotated[SelectFieldTypeExt | None, Field(description="select 类型配置")] = None
|
|
230
|
+
multi_select: Annotated[
|
|
231
|
+
SelectFieldTypeExt | None, Field(description="multiSelect 类型配置")
|
|
232
|
+
] = None
|
|
233
|
+
relation: Annotated[RelationFieldTypeExt | None, Field(description="relation 类型配置")] = None
|
|
234
|
+
dict_type: Annotated[DictFieldTypeExt | None, Field(description="dict 类型配置")] = None
|
|
235
|
+
user: Annotated[UserFieldTypeExt | None, Field(description="user 类型配置")] = None
|
|
236
|
+
file: Annotated[FileFieldTypeExt | None, Field(description="file 类型配置")] = None
|
|
237
|
+
subtable: Annotated[SubTableFieldTypeExt | None, Field(description="subtable 类型配置")] = None
|
|
238
|
+
|
|
239
|
+
|
|
240
|
+
# ---------------------------------------------------------------------------
|
|
241
|
+
# Field Definition
|
|
242
|
+
# ---------------------------------------------------------------------------
|
|
243
|
+
|
|
244
|
+
|
|
245
|
+
class DataTableField(BaseModel):
|
|
246
|
+
"""多维表格字段定义."""
|
|
247
|
+
|
|
248
|
+
id: Annotated[str | None, Field(description="字段唯一标识 (UUID)", exclude=True)] = None
|
|
249
|
+
|
|
250
|
+
dbName: Annotated[str, Field(description="字段名称/列名 (存储在数据库中的名称)")]
|
|
251
|
+
dbType: Annotated[ColumnType, Field(description="字段类型")]
|
|
252
|
+
|
|
253
|
+
title: Annotated[str | None, Field(description="显示标题")]
|
|
254
|
+
name: Annotated[str, Field(description="字段名称/列名 (前端显示的名称)")]
|
|
255
|
+
type: Annotated[str, Field(description="字段类型")]
|
|
256
|
+
|
|
257
|
+
# 数据属性
|
|
258
|
+
pk: Annotated[bool, Field(description="是否主键")] = False
|
|
259
|
+
label: Annotated[bool, Field(description="是否标签字段 (用于卡片/记录展示)")] = False
|
|
260
|
+
visible: Annotated[bool, Field(description="是否在表格中可见")] = True
|
|
261
|
+
width: Annotated[int | None, Field(description="列宽 (默认 200)")] = None
|
|
262
|
+
required: Annotated[bool, Field(description="是否必填")] = False
|
|
263
|
+
|
|
264
|
+
# 布局属性
|
|
265
|
+
fixed: Annotated[Literal["left", "right"] | None, Field(description="固定列位置")] = None
|
|
266
|
+
align: Annotated[
|
|
267
|
+
Literal["left", "center", "right"] | None, Field(description="文本对齐方式")
|
|
268
|
+
] = None
|
|
269
|
+
|
|
270
|
+
# 默认值
|
|
271
|
+
default_value: Annotated[Any | None, Field(description="新增记录时的默认值")] = None
|
|
272
|
+
|
|
273
|
+
# 类型扩展配置
|
|
274
|
+
type_ext: Annotated[
|
|
275
|
+
Mapping[str, JsonValue],
|
|
276
|
+
BeforeValidator(insert_dict_by_none),
|
|
277
|
+
Field(description="类型扩展配置", validation_alias=AliasChoices("typeExt", "type_ext")),
|
|
278
|
+
] = None
|
|
279
|
+
|
|
280
|
+
model_config = ConfigDict(str_to_lower=True, extra="allow")
|
|
281
|
+
|
|
282
|
+
|
|
283
|
+
# ---------------------------------------------------------------------------
|
|
284
|
+
# Fill Color (Conditional Styling)
|
|
285
|
+
# ---------------------------------------------------------------------------
|
|
286
|
+
|
|
287
|
+
|
|
288
|
+
class FillColor(BaseModel):
|
|
289
|
+
"""填色规则 (条件单元格/行/列样式)."""
|
|
290
|
+
|
|
291
|
+
id: Annotated[str | None, Field(description="规则ID")] = None
|
|
292
|
+
color: Annotated[str, Field(description="填充颜色 (hex 带透明度,如 #FFCCCC)")] = ""
|
|
293
|
+
mode: Annotated[Literal["cell", "row", "column"], Field(description="填充模式")] = "cell"
|
|
294
|
+
field_id: Annotated[str | None, Field(description="字段ID (用于单元格和整行模式)")] = None
|
|
295
|
+
expression: Annotated[SqlExpression | None, Field(description="过滤表达式")] = None
|
|
296
|
+
value: Annotated[Any | None, Field(description="过滤值")] = None
|
|
297
|
+
value_ext: Annotated[Any | None, Field(description="扩展值 (用于 between 等表达式)")] = None
|
|
298
|
+
|
|
299
|
+
|
|
300
|
+
# ---------------------------------------------------------------------------
|
|
301
|
+
# Custom Button
|
|
302
|
+
# ---------------------------------------------------------------------------
|
|
303
|
+
|
|
304
|
+
|
|
305
|
+
class CustomButtonAttrs(BaseModel):
|
|
306
|
+
"""自定义按钮属性."""
|
|
307
|
+
|
|
308
|
+
type: Annotated[
|
|
309
|
+
Literal["primary", "success", "warning", "danger", "info", ""] | None,
|
|
310
|
+
Field(description="按钮样式类型"),
|
|
311
|
+
] = None
|
|
312
|
+
size: Annotated[Literal["large", "default", "small"] | None, Field(description="按钮尺寸")] = (
|
|
313
|
+
None
|
|
314
|
+
)
|
|
315
|
+
plain: Annotated[bool | None, Field(description="是否朴素按钮")] = None
|
|
316
|
+
round: Annotated[bool | None, Field(description="是否圆角按钮")] = None
|
|
317
|
+
bg: Annotated[bool | None, Field(description="是否背景按钮")] = None
|
|
318
|
+
icon: Annotated[str | None, Field(description="Lucide 图标名称")] = None
|
|
319
|
+
link: Annotated[str | None, Field(description="链接地址 (type=link)")] = None
|
|
320
|
+
target: Annotated[Literal["_self", "_blank"] | None, Field(description="打开方式")] = None
|
|
321
|
+
actions: Annotated[
|
|
322
|
+
list[Literal["create", "update", "batch_update"]] | None,
|
|
323
|
+
Field(description="允许的动作 (type=form)"),
|
|
324
|
+
] = None
|
|
325
|
+
|
|
326
|
+
|
|
327
|
+
class CustomButton(BaseModel):
|
|
328
|
+
"""自定义按钮定义."""
|
|
329
|
+
|
|
330
|
+
id: Annotated[str | None, Field(description="按钮ID")] = None
|
|
331
|
+
title: Annotated[str, Field(description="按钮显示文字")]
|
|
332
|
+
type: Annotated[Literal["link", "form", "code"], Field(description="按钮类型")]
|
|
333
|
+
attrs: Annotated[CustomButtonAttrs | None, Field(description="按钮属性")] = None
|
|
334
|
+
|
|
335
|
+
|
|
336
|
+
# ---------------------------------------------------------------------------
|
|
337
|
+
# Query Configuration
|
|
338
|
+
# ---------------------------------------------------------------------------
|
|
339
|
+
|
|
340
|
+
|
|
341
|
+
class QueryCondition(BaseModel):
|
|
342
|
+
"""查询条件 (公开级别)."""
|
|
343
|
+
|
|
344
|
+
id: Annotated[str | None, Field(description="条件ID")] = None
|
|
345
|
+
name: Annotated[str, Field(description="字段名")]
|
|
346
|
+
title: Annotated[str | None, Field(description="显示标题")]
|
|
347
|
+
condition: Annotated[dict[SqlExpression, Any], Field(description="条件表达式和值")] = Field(
|
|
348
|
+
default_factory=dict
|
|
349
|
+
)
|
|
350
|
+
|
|
351
|
+
|
|
352
|
+
class QueryFormParams(BaseModel):
|
|
353
|
+
"""查询表单布局配置."""
|
|
354
|
+
|
|
355
|
+
label_position: Annotated[Literal["left", "top"] | None, Field(description="标签对齐方式")] = (
|
|
356
|
+
None
|
|
357
|
+
)
|
|
358
|
+
|
|
359
|
+
|
|
360
|
+
class QueryForm(BaseModel):
|
|
361
|
+
"""查询表单配置."""
|
|
362
|
+
|
|
363
|
+
columns_each_row: Annotated[int | None, Field(description="每行列数 (1-6)")] = None
|
|
364
|
+
params: Annotated[QueryFormParams | None, Field(description="表单参数")] = None
|
|
365
|
+
|
|
366
|
+
|
|
367
|
+
# ---------------------------------------------------------------------------
|
|
368
|
+
# DataTableData (meta.data)
|
|
369
|
+
# ---------------------------------------------------------------------------
|
|
370
|
+
|
|
371
|
+
|
|
372
|
+
class DataTableModel(BaseModel):
|
|
373
|
+
"""数据源模型配置."""
|
|
374
|
+
|
|
375
|
+
datasource: Annotated[str, Field(description="数据源编码")]
|
|
376
|
+
ref_code: Annotated[
|
|
377
|
+
str, Field(description="引用模型编码", validation_alias=AliasChoices("refCode", "ref_code"))
|
|
378
|
+
]
|
|
379
|
+
ref_type: Annotated[
|
|
380
|
+
str, Field(description="引用模型类型", validation_alias=AliasChoices("refType", "ref_type"))
|
|
381
|
+
]
|
|
382
|
+
table_name: Annotated[
|
|
383
|
+
str, Field(description="表名", validation_alias=AliasChoices("tableName", "table_name"))
|
|
384
|
+
]
|
|
385
|
+
|
|
386
|
+
|
|
387
|
+
class DataTableData(BaseModel):
|
|
388
|
+
"""多维表格 meta.data 完整结构."""
|
|
389
|
+
|
|
390
|
+
# 模型配置
|
|
391
|
+
model: Annotated[DataTableModel, Field(description="数据源模型配置")]
|
|
392
|
+
|
|
393
|
+
# 字段定义
|
|
394
|
+
fields: Annotated[list[DataTableField], Field(description="字段列表", default_factory=list)] = (
|
|
395
|
+
Field(default_factory=list)
|
|
396
|
+
)
|
|
397
|
+
|
|
398
|
+
# 条件样式
|
|
399
|
+
fill_colors: Annotated[list[FillColor] | None, Field(description="填色规则列表")] = None
|
|
400
|
+
|
|
401
|
+
# 显示设置
|
|
402
|
+
line_height: Annotated[
|
|
403
|
+
Literal["default", "compact", "comfortable"] | None,
|
|
404
|
+
Field(description="行高设置"),
|
|
405
|
+
] = None
|
|
406
|
+
|
|
407
|
+
# # 自定义按钮
|
|
408
|
+
# custom_buttons: Annotated[
|
|
409
|
+
# list[CustomButton] | None,
|
|
410
|
+
# Field(
|
|
411
|
+
# description="自定义按钮列表",
|
|
412
|
+
# validation_alias=AliasChoices("customButtons", "custom_buttons"),
|
|
413
|
+
# default_factory=list,
|
|
414
|
+
# ),
|
|
415
|
+
# ]
|
|
416
|
+
|
|
417
|
+
# 数据分组
|
|
418
|
+
group_field: Annotated[str | None, Field(description="分组字段名")] = None
|
|
419
|
+
|
|
420
|
+
# 查询配置
|
|
421
|
+
querys: Annotated[list[QueryCondition] | None, Field(description="查询条件列表")] = None
|
|
422
|
+
query_form: Annotated[QueryForm | None, Field(description="查询表单配置")] = None
|
|
423
|
+
|
|
424
|
+
|
|
425
|
+
# ---------------------------------------------------------------------------
|
|
426
|
+
# MetaDataTable
|
|
427
|
+
# ---------------------------------------------------------------------------
|
|
428
|
+
|
|
429
|
+
|
|
430
|
+
class MetaDataTable(Meta[DataTableData]):
|
|
431
|
+
"""多维表格 Meta schema."""
|
|
432
|
+
|
|
433
|
+
pass
|
|
434
|
+
|
|
435
|
+
|
|
436
|
+
class MetaCreateDataTable(MetaCreate[DataTableData]):
|
|
437
|
+
"""多维表格 Meta schema."""
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
from typing import Annotated
|
|
2
|
+
|
|
3
|
+
from dataops_sdk.schemas.enums import DataSourceType
|
|
4
|
+
from pydantic import BaseModel, BeforeValidator, Field
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
def str_to_number(v: str):
|
|
8
|
+
assert v.isnumeric(), "must be number"
|
|
9
|
+
return int(v)
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class DataDataSource(BaseModel):
|
|
13
|
+
"""Data source"""
|
|
14
|
+
|
|
15
|
+
type: Annotated[DataSourceType, Field(description="数据源类型")] = DataSourceType.MYSQL
|
|
16
|
+
port: Annotated[
|
|
17
|
+
int, BeforeValidator(str_to_number), Field(description="数据源端口", le=65535, gt=0)
|
|
18
|
+
]
|
|
19
|
+
ip: Annotated[str, Field(description="数据源主机")]
|
|
20
|
+
username: Annotated[str, Field(description="数据源用户名")]
|
|
21
|
+
password: Annotated[str, Field(description="数据源密码")]
|
|
22
|
+
database: Annotated[str, Field(description="数据库名称")]
|
|
23
|
+
|
|
24
|
+
category: Annotated[str, Field(description="数据源分类")] = "database"
|
|
25
|
+
|
|
26
|
+
bootstrap_servers: Annotated[str | None, Field(description="kafka bootstrap servers")] = None
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
from typing import Annotated
|
|
2
|
+
|
|
3
|
+
from pydantic import BaseModel, Field
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class DictItem(BaseModel):
|
|
7
|
+
id: Annotated[str, Field(description="id", exclude=True)]
|
|
8
|
+
value: Annotated[str | int, Field(description="值")]
|
|
9
|
+
label: Annotated[str, Field(description="名")]
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class DataDict(BaseModel):
|
|
13
|
+
options: Annotated[list[DictItem], Field(description="字典数据", default_factory=list)]
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
from enum import StrEnum
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class InnerMetaType(StrEnum):
|
|
5
|
+
DATASOURCE = "datasource"
|
|
6
|
+
|
|
7
|
+
def __repr__(self):
|
|
8
|
+
return self.value
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class MetaType(StrEnum):
|
|
12
|
+
# 技能
|
|
13
|
+
SKILL = "skill"
|
|
14
|
+
# 技能子文件
|
|
15
|
+
SKILL_FILE = "skill_file"
|
|
16
|
+
# 文档
|
|
17
|
+
REPORT = "report"
|
|
18
|
+
# 多维表格
|
|
19
|
+
DATA_TABLE = "data_table"
|
|
20
|
+
# 指标
|
|
21
|
+
METRICS = "metrics"
|
|
22
|
+
# 卡片
|
|
23
|
+
WIDGET = "widget"
|
|
24
|
+
# 工作流
|
|
25
|
+
WORKFLOW = "workflow"
|
|
26
|
+
# 模板
|
|
27
|
+
TEMPLATE = "template"
|
|
28
|
+
# API
|
|
29
|
+
API = "api"
|
|
30
|
+
# 表
|
|
31
|
+
TABLE = "table"
|
|
32
|
+
# 数据集
|
|
33
|
+
DATASET = "dataset"
|
|
34
|
+
# 字典
|
|
35
|
+
DICT = "dict"
|
|
36
|
+
|
|
37
|
+
def __repr__(self):
|
|
38
|
+
return self.value
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
class SqlExpression(StrEnum):
|
|
42
|
+
EQ = "="
|
|
43
|
+
NE = "!="
|
|
44
|
+
GT = ">"
|
|
45
|
+
GE = ">="
|
|
46
|
+
LT = "<"
|
|
47
|
+
LE = "<="
|
|
48
|
+
IN = "in"
|
|
49
|
+
NOT_IN = "notin"
|
|
50
|
+
LIKE = "like"
|
|
51
|
+
NOT_LIKE = "notlike"
|
|
52
|
+
BETWEEN = "between"
|
|
53
|
+
NOT_BETWEEN = "notbetween"
|
|
54
|
+
IS_NULL = "isnull"
|
|
55
|
+
IS_NOT_NULL = "isnotnull"
|
|
56
|
+
EXISTS = "exists"
|
|
57
|
+
APPEND = "append"
|
|
58
|
+
|
|
59
|
+
@property
|
|
60
|
+
def title(self) -> str:
|
|
61
|
+
return _EXPRESSION_TITLES[self]
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
_EXPRESSION_TITLES: dict[str, str] = {
|
|
65
|
+
"=": "相等",
|
|
66
|
+
"!=": "不相等",
|
|
67
|
+
">": "大于",
|
|
68
|
+
">=": "大于等于",
|
|
69
|
+
"<": "小于",
|
|
70
|
+
"<=": "小于等于",
|
|
71
|
+
"in": "属于",
|
|
72
|
+
"notin": "不属于",
|
|
73
|
+
"like": "匹配",
|
|
74
|
+
"notlike": "不匹配",
|
|
75
|
+
"between": "范围",
|
|
76
|
+
"notbetween": "不在范围",
|
|
77
|
+
"isnull": "为空",
|
|
78
|
+
"isnotnull": "不为空",
|
|
79
|
+
"exists": "存在",
|
|
80
|
+
"append": "追加",
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
class DataSourceType(StrEnum):
|
|
85
|
+
MYSQL = "mysql"
|
|
86
|
+
POSTGRESQL = "postgresql"
|
|
87
|
+
DORIS = "doris"
|
|
88
|
+
ORACLE = "oracle"
|
|
89
|
+
DM = "dm"
|
|
90
|
+
NEO4J = "neo4j"
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
class ColumnTag(StrEnum):
|
|
94
|
+
# 核心
|
|
95
|
+
CORE = "core"
|
|
96
|
+
# 描述
|
|
97
|
+
DESC = "desc"
|
|
98
|
+
# 拓展
|
|
99
|
+
EXTEND = "extend"
|
|
100
|
+
# 技术
|
|
101
|
+
TECH = "tech"
|
|
102
|
+
# 冗余
|
|
103
|
+
REDU = "redu"
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
class ColumnType(StrEnum):
|
|
107
|
+
"""字段类型枚举."""
|
|
108
|
+
|
|
109
|
+
TEXT = "text"
|
|
110
|
+
NUMBER = "number"
|
|
111
|
+
DATE = "date"
|
|
112
|
+
DATETIME = "datetime"
|
|
113
|
+
SELECT = "select"
|
|
114
|
+
MULTI_SELECT = "multiSelect"
|
|
115
|
+
RELATION = "relation"
|
|
116
|
+
DICT = "dict"
|
|
117
|
+
USER = "user"
|
|
118
|
+
FILE = "file"
|
|
119
|
+
SUBTABLE = "subtable"
|
|
120
|
+
STRING = "string"
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
from typing import Annotated
|
|
2
|
+
|
|
3
|
+
from pydantic import AliasChoices, BaseModel, Field
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class GroupNode(BaseModel):
|
|
7
|
+
"""分组节点模型.
|
|
8
|
+
|
|
9
|
+
用于表示数据源目录树中的分组节点,包含节点的基本信息
|
|
10
|
+
和层级关系。
|
|
11
|
+
|
|
12
|
+
Attributes:
|
|
13
|
+
code: 节点编码/ID
|
|
14
|
+
type: 节点类型
|
|
15
|
+
subType: 子类型(可选)
|
|
16
|
+
name: 节点名称
|
|
17
|
+
label: 中文名称
|
|
18
|
+
remark: 备注信息(可选)
|
|
19
|
+
params: 扩展参数映射(可选)
|
|
20
|
+
children: 子节点列表(可选)
|
|
21
|
+
"""
|
|
22
|
+
|
|
23
|
+
code: Annotated[str, Field(description="节点", validation_alias=AliasChoices("id"))]
|
|
24
|
+
type: Annotated[str, Field(description="类型")]
|
|
25
|
+
subType: Annotated[
|
|
26
|
+
str | None,
|
|
27
|
+
Field(
|
|
28
|
+
description="子类型",
|
|
29
|
+
validation_alias=AliasChoices("subType", "sub_type"),
|
|
30
|
+
exclude=True,
|
|
31
|
+
),
|
|
32
|
+
]
|
|
33
|
+
name: Annotated[str, Field(description="名称")]
|
|
34
|
+
label: Annotated[str, Field(description="中文名称")]
|
|
35
|
+
remark: Annotated[str | None, Field(description="备注")]
|
|
36
|
+
params: Annotated[
|
|
37
|
+
dict[str, str | int | float | bool | None] | None,
|
|
38
|
+
Field(description="参数", exclude=True),
|
|
39
|
+
]
|
|
40
|
+
children: Annotated[list["GroupNode"] | None, Field(description="子节点")]
|