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.

Files changed (79) hide show
  1. dataops_sdk/__init__.py +84 -0
  2. dataops_sdk/constants.py +6 -0
  3. dataops_sdk/exceptions.py +31 -0
  4. dataops_sdk/runner/__init__.py +46 -0
  5. dataops_sdk/runner/datasource_factory.py +83 -0
  6. dataops_sdk/runner/schemas/nacos/__init__.py +5 -0
  7. dataops_sdk/runner/schemas/nacos/config.py +40 -0
  8. dataops_sdk/runner/schemas/nacos/constants.py +235 -0
  9. dataops_sdk/runner/schemas/nacos/instance.py +103 -0
  10. dataops_sdk/runner/schemas/nacos/nacos_exception.py +44 -0
  11. dataops_sdk/runner/schemas/nacos/naming_param.py +62 -0
  12. dataops_sdk/runner/schemas/nacos/naming_request.py +84 -0
  13. dataops_sdk/runner/schemas/nacos/naming_response.py +50 -0
  14. dataops_sdk/runner/schemas/nacos/preserved_metadata_key.py +10 -0
  15. dataops_sdk/runner/schemas/nacos/service.py +119 -0
  16. dataops_sdk/runner/utils/__init__.py +42 -0
  17. dataops_sdk/runner/utils/common.py +209 -0
  18. dataops_sdk/runner/utils/dbConn_base.py +256 -0
  19. dataops_sdk/runner/utils/dbConn_sync.py +485 -0
  20. dataops_sdk/runner/utils/duckdb_manager.py +203 -0
  21. dataops_sdk/runner/utils/file_transfer_base.py +307 -0
  22. dataops_sdk/runner/utils/ftp_file_transfer.py +242 -0
  23. dataops_sdk/runner/utils/log.py +50 -0
  24. dataops_sdk/runner/utils/nacos.py +96 -0
  25. dataops_sdk/runner/utils/neo4j_sync.py +236 -0
  26. dataops_sdk/runner/utils/queue_base.py +224 -0
  27. dataops_sdk/runner/utils/queue_kafka.py +150 -0
  28. dataops_sdk/runner/utils/sftp_file_transfer.py +243 -0
  29. dataops_sdk/schemas/__init__.py +32 -0
  30. dataops_sdk/schemas/alarm.py +38 -0
  31. dataops_sdk/schemas/api.py +37 -0
  32. dataops_sdk/schemas/data_table.py +437 -0
  33. dataops_sdk/schemas/datasource.py +26 -0
  34. dataops_sdk/schemas/dict_.py +13 -0
  35. dataops_sdk/schemas/enums.py +120 -0
  36. dataops_sdk/schemas/group.py +40 -0
  37. dataops_sdk/schemas/hazard.py +151 -0
  38. dataops_sdk/schemas/meta.py +175 -0
  39. dataops_sdk/schemas/query.py +175 -0
  40. dataops_sdk/schemas/report.py +22 -0
  41. dataops_sdk/schemas/skill.py +70 -0
  42. dataops_sdk/schemas/table.py +65 -0
  43. dataops_sdk/schemas/user.py +52 -0
  44. dataops_sdk/schemas/widget.py +651 -0
  45. dataops_sdk/schemas/workflow.py +63 -0
  46. dataops_sdk/services/__init__.py +110 -0
  47. dataops_sdk/services/alarm.py +324 -0
  48. dataops_sdk/services/api.py +28 -0
  49. dataops_sdk/services/auth.py +120 -0
  50. dataops_sdk/services/data_table.py +485 -0
  51. dataops_sdk/services/dataset.py +127 -0
  52. dataops_sdk/services/datasource.py +57 -0
  53. dataops_sdk/services/dict_.py +69 -0
  54. dataops_sdk/services/hazard.py +260 -0
  55. dataops_sdk/services/meta.py +523 -0
  56. dataops_sdk/services/metrics.py +42 -0
  57. dataops_sdk/services/ref.py +66 -0
  58. dataops_sdk/services/report.py +36 -0
  59. dataops_sdk/services/skill.py +276 -0
  60. dataops_sdk/services/table.py +340 -0
  61. dataops_sdk/services/widget.py +143 -0
  62. dataops_sdk/services/workflow.py +102 -0
  63. dataops_sdk/session.py +292 -0
  64. dataops_sdk/tiptap/__init__.py +30 -0
  65. dataops_sdk/tiptap/builder.py +75 -0
  66. dataops_sdk/tiptap/constants.py +133 -0
  67. dataops_sdk/tiptap/markdown_parser.py +294 -0
  68. dataops_sdk/tiptap/models.py +43 -0
  69. dataops_sdk/tiptap/parse_utils.py +889 -0
  70. dataops_sdk/tiptap/render_utils.py +846 -0
  71. dataops_sdk/tiptap/renderers.py +51 -0
  72. dataops_sdk/tiptap/tool.py +629 -0
  73. dataops_sdk/utils/__init__.py +15 -0
  74. dataops_sdk/utils/common.py +211 -0
  75. dataops_sdk/utils/utils.py +120 -0
  76. dataops_sdk-0.3.0.dist-info/METADATA +25 -0
  77. dataops_sdk-0.3.0.dist-info/RECORD +79 -0
  78. dataops_sdk-0.3.0.dist-info/WHEEL +5 -0
  79. 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="子节点")]