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,151 @@
|
|
|
1
|
+
from datetime import datetime
|
|
2
|
+
from typing import Annotated
|
|
3
|
+
|
|
4
|
+
from pydantic import AliasChoices, BaseModel, ConfigDict, Field
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class HazardRecordDTO(BaseModel):
|
|
8
|
+
"""隐患记录 DTO,对应 Java ``HazardRecordDTO``.
|
|
9
|
+
|
|
10
|
+
注意:list/his-list 接口实际返回 ``DbRecord``(key 全部大写下划线),
|
|
11
|
+
本模型供用户在已知单条记录结构时构造/校验对象使用。
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
model_config = ConfigDict(populate_by_name=True, extra="ignore")
|
|
15
|
+
|
|
16
|
+
cuid: Annotated[str, Field(description="隐患记录主键 ID")]
|
|
17
|
+
rule_code: Annotated[
|
|
18
|
+
str | None,
|
|
19
|
+
Field(description="所属规则编码", validation_alias=AliasChoices("ruleCode", "rule_code")),
|
|
20
|
+
] = None
|
|
21
|
+
rule_name: Annotated[
|
|
22
|
+
str | None,
|
|
23
|
+
Field(description="所属规则名称", validation_alias=AliasChoices("ruleName", "rule_name")),
|
|
24
|
+
] = None
|
|
25
|
+
hazard_no: Annotated[
|
|
26
|
+
str | None,
|
|
27
|
+
Field(description="隐患编号", validation_alias=AliasChoices("hazardNo", "hazard_no")),
|
|
28
|
+
] = None
|
|
29
|
+
hazard_title: Annotated[
|
|
30
|
+
str | None,
|
|
31
|
+
Field(description="隐患标题", validation_alias=AliasChoices("hazardTitle", "hazard_title")),
|
|
32
|
+
] = None
|
|
33
|
+
hazard_desc: Annotated[
|
|
34
|
+
str | None,
|
|
35
|
+
Field(description="隐患描述", validation_alias=AliasChoices("hazardDesc", "hazard_desc")),
|
|
36
|
+
] = None
|
|
37
|
+
hazard_level: Annotated[
|
|
38
|
+
str | None,
|
|
39
|
+
Field(description="隐患等级", validation_alias=AliasChoices("hazardLevel", "hazard_level")),
|
|
40
|
+
] = None
|
|
41
|
+
object_type: Annotated[
|
|
42
|
+
str | None,
|
|
43
|
+
Field(
|
|
44
|
+
description="隐患对象类型", validation_alias=AliasChoices("objectType", "object_type")
|
|
45
|
+
),
|
|
46
|
+
] = None
|
|
47
|
+
object_type_name: Annotated[
|
|
48
|
+
str | None,
|
|
49
|
+
Field(
|
|
50
|
+
description="隐患对象类型名",
|
|
51
|
+
validation_alias=AliasChoices("objectTypeName", "object_type_name"),
|
|
52
|
+
),
|
|
53
|
+
] = None
|
|
54
|
+
object_id: Annotated[
|
|
55
|
+
str | None,
|
|
56
|
+
Field(description="隐患对象 ID", validation_alias=AliasChoices("objectId", "object_id")),
|
|
57
|
+
] = None
|
|
58
|
+
object_name: Annotated[
|
|
59
|
+
str | None,
|
|
60
|
+
Field(
|
|
61
|
+
description="隐患对象名称", validation_alias=AliasChoices("objectName", "object_name")
|
|
62
|
+
),
|
|
63
|
+
] = None
|
|
64
|
+
status: Annotated[int | None, Field(description="隐患状态码")] = None
|
|
65
|
+
clear_time: Annotated[
|
|
66
|
+
datetime | None,
|
|
67
|
+
Field(description="清除时间", validation_alias=AliasChoices("clearTime", "clear_time")),
|
|
68
|
+
] = None
|
|
69
|
+
order_no: Annotated[
|
|
70
|
+
str | None,
|
|
71
|
+
Field(description="外部工单号", validation_alias=AliasChoices("orderNo", "order_no")),
|
|
72
|
+
] = None
|
|
73
|
+
clear_notify_status: Annotated[
|
|
74
|
+
int | None,
|
|
75
|
+
Field(
|
|
76
|
+
description="清除通知状态",
|
|
77
|
+
validation_alias=AliasChoices("clearNotifyStatus", "clear_notify_status"),
|
|
78
|
+
),
|
|
79
|
+
] = None
|
|
80
|
+
need_dispatch: Annotated[
|
|
81
|
+
bool | None,
|
|
82
|
+
Field(
|
|
83
|
+
description="是否需要派遣",
|
|
84
|
+
validation_alias=AliasChoices("needDispatch", "need_dispatch"),
|
|
85
|
+
),
|
|
86
|
+
] = None
|
|
87
|
+
check_start_time: Annotated[
|
|
88
|
+
datetime | None,
|
|
89
|
+
Field(
|
|
90
|
+
description="检查开始时间",
|
|
91
|
+
validation_alias=AliasChoices("checkStartTime", "check_start_time"),
|
|
92
|
+
),
|
|
93
|
+
] = None
|
|
94
|
+
check_end_time: Annotated[
|
|
95
|
+
datetime | None,
|
|
96
|
+
Field(
|
|
97
|
+
description="检查结束时间",
|
|
98
|
+
validation_alias=AliasChoices("checkEndTime", "check_end_time"),
|
|
99
|
+
),
|
|
100
|
+
] = None
|
|
101
|
+
create_time: Annotated[
|
|
102
|
+
datetime | None,
|
|
103
|
+
Field(description="创建时间", validation_alias=AliasChoices("createTime", "create_time")),
|
|
104
|
+
] = None
|
|
105
|
+
last_modify_time: Annotated[
|
|
106
|
+
datetime | None,
|
|
107
|
+
Field(
|
|
108
|
+
description="最后修改时间",
|
|
109
|
+
validation_alias=AliasChoices("lastModifyTime", "last_modify_time"),
|
|
110
|
+
),
|
|
111
|
+
] = None
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
class HazardTaskDTO(BaseModel):
|
|
115
|
+
"""隐患任务 DTO,对应 Java ``HazardTaskDTO``.
|
|
116
|
+
|
|
117
|
+
主要在 ``/hazard/task/trigger/{code}`` 触发后由后端异步生成实例并写入日志;
|
|
118
|
+
SDK 不直接查询该 DTO,保留供用户在构造/序列化场景下使用。
|
|
119
|
+
"""
|
|
120
|
+
|
|
121
|
+
model_config = ConfigDict(populate_by_name=True, extra="ignore")
|
|
122
|
+
|
|
123
|
+
code: Annotated[str | None, Field(description="任务编码")] = None
|
|
124
|
+
name: Annotated[str | None, Field(description="任务名称")] = None
|
|
125
|
+
title: Annotated[str | None, Field(description="任务中文名")] = None
|
|
126
|
+
hazard_code: Annotated[
|
|
127
|
+
str | None,
|
|
128
|
+
Field(description="隐患编码", validation_alias=AliasChoices("hazardCode", "hazard_code")),
|
|
129
|
+
] = None
|
|
130
|
+
check_object: Annotated[
|
|
131
|
+
dict | None,
|
|
132
|
+
Field(
|
|
133
|
+
description="检查对象配置",
|
|
134
|
+
validation_alias=AliasChoices("checkObject", "check_object"),
|
|
135
|
+
),
|
|
136
|
+
] = None
|
|
137
|
+
job_setting: Annotated[
|
|
138
|
+
dict | None,
|
|
139
|
+
Field(
|
|
140
|
+
description="任务调度配置",
|
|
141
|
+
validation_alias=AliasChoices("jobSetting", "job_setting"),
|
|
142
|
+
),
|
|
143
|
+
] = None
|
|
144
|
+
enabled: Annotated[bool | None, Field(description="是否启用")] = None
|
|
145
|
+
need_dispatch: Annotated[
|
|
146
|
+
bool | None,
|
|
147
|
+
Field(
|
|
148
|
+
description="是否需要派遣",
|
|
149
|
+
validation_alias=AliasChoices("needDispatch", "need_dispatch"),
|
|
150
|
+
),
|
|
151
|
+
] = None
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
from collections.abc import Mapping
|
|
2
|
+
from datetime import datetime
|
|
3
|
+
from typing import Annotated, Generic, TypeVar
|
|
4
|
+
|
|
5
|
+
from pydantic import (
|
|
6
|
+
AliasChoices,
|
|
7
|
+
BaseModel,
|
|
8
|
+
ConfigDict,
|
|
9
|
+
Field,
|
|
10
|
+
JsonValue,
|
|
11
|
+
model_validator,
|
|
12
|
+
)
|
|
13
|
+
from pydantic_core import from_json
|
|
14
|
+
|
|
15
|
+
DEFAULT_META_DATA_TYPE = Mapping[str, JsonValue]
|
|
16
|
+
META_DATA_BOUND_TYPE = DEFAULT_META_DATA_TYPE | BaseModel
|
|
17
|
+
|
|
18
|
+
META_DATA_TYPE = TypeVar("META_DATA_TYPE", bound=META_DATA_BOUND_TYPE)
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class MetaRelease(BaseModel):
|
|
22
|
+
CUID: Annotated[str, Field(description="元数据ID")]
|
|
23
|
+
TENANT_ID: Annotated[str, Field(description="租户ID")]
|
|
24
|
+
PROD_CODE: Annotated[str, Field(description="产品编码")]
|
|
25
|
+
RELEASE: Annotated[str, Field(description="版本")] = "1.0.0"
|
|
26
|
+
|
|
27
|
+
CODE: Annotated[str, Field(description="编码")]
|
|
28
|
+
TYPE: Annotated[str, Field(description="类型")]
|
|
29
|
+
SUB_TYPE: Annotated[str | None, Field(description="子类型")]
|
|
30
|
+
NAME: Annotated[str, Field(description="名称")]
|
|
31
|
+
TITLE: Annotated[str, Field(description="中文名称")]
|
|
32
|
+
REMARK: Annotated[str | None, Field(description="备注")]
|
|
33
|
+
DIGEST: Annotated[str | None, Field(description="摘要")]
|
|
34
|
+
|
|
35
|
+
CREATE_TIME: Annotated[datetime, Field(description="创建时间")]
|
|
36
|
+
CREATE_USER: Annotated[str, Field(description="创建人")]
|
|
37
|
+
LAST_MODIFY_TIME: Annotated[datetime, Field(description="最后修改时间")]
|
|
38
|
+
LAST_MODIFY_USER: Annotated[str, Field(description="最后修改人")]
|
|
39
|
+
|
|
40
|
+
model_config = ConfigDict(extra="allow", str_to_lower=True)
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
class MetaBase(BaseModel):
|
|
44
|
+
id: Annotated[str, Field(description="元数据ID", validation_alias=AliasChoices("id", "cuid"))]
|
|
45
|
+
parentId: Annotated[
|
|
46
|
+
str | None,
|
|
47
|
+
Field(description="父ID", validation_alias=AliasChoices("parentId", "parent_id")),
|
|
48
|
+
]
|
|
49
|
+
code: Annotated[str, Field(description="编码")]
|
|
50
|
+
|
|
51
|
+
groupCode: Annotated[
|
|
52
|
+
str | None,
|
|
53
|
+
Field(description="组编码", validation_alias=AliasChoices("groupCode", "group_code")),
|
|
54
|
+
]
|
|
55
|
+
groupName: Annotated[str | None, Field(description="组名称")] = None
|
|
56
|
+
spaceName: Annotated[str | None, Field(description="空间名称")] = None
|
|
57
|
+
|
|
58
|
+
subSystem: Annotated[
|
|
59
|
+
str, Field(description="子系统", validation_alias=AliasChoices("subSystem", "sub_system"))
|
|
60
|
+
]
|
|
61
|
+
|
|
62
|
+
type: Annotated[str, Field(description="类型")]
|
|
63
|
+
subType: Annotated[
|
|
64
|
+
str | None,
|
|
65
|
+
Field(description="子类型", validation_alias=AliasChoices("subType", "sub_type")),
|
|
66
|
+
]
|
|
67
|
+
|
|
68
|
+
name: Annotated[str, Field(description="名称")]
|
|
69
|
+
title: Annotated[str, Field(description="中文名称")]
|
|
70
|
+
digest: Annotated[str | None, Field(description="摘要")]
|
|
71
|
+
|
|
72
|
+
remark: Annotated[str | None, Field(description="备注")]
|
|
73
|
+
|
|
74
|
+
createUser: Annotated[
|
|
75
|
+
str, Field(description="创建人", validation_alias=AliasChoices("createUser", "create_user"))
|
|
76
|
+
]
|
|
77
|
+
createTime: Annotated[
|
|
78
|
+
datetime,
|
|
79
|
+
Field(description="创建时间", validation_alias=AliasChoices("createTime", "create_time")),
|
|
80
|
+
]
|
|
81
|
+
lastModifyUser: Annotated[
|
|
82
|
+
str,
|
|
83
|
+
Field(
|
|
84
|
+
description="最后修改人",
|
|
85
|
+
validation_alias=AliasChoices("lastModifyUser", "last_modify_user"),
|
|
86
|
+
),
|
|
87
|
+
]
|
|
88
|
+
lastModifyTime: Annotated[
|
|
89
|
+
datetime,
|
|
90
|
+
Field(
|
|
91
|
+
description="最后修改时间",
|
|
92
|
+
validation_alias=AliasChoices("lastModifyTime", "last_modify_time"),
|
|
93
|
+
),
|
|
94
|
+
]
|
|
95
|
+
|
|
96
|
+
tenantId: Annotated[
|
|
97
|
+
str, Field(description="租户ID", validation_alias=AliasChoices("tenantId", "tenant_id"))
|
|
98
|
+
]
|
|
99
|
+
prodCode: Annotated[
|
|
100
|
+
str, Field(description="产品编码", validation_alias=AliasChoices("prodCode", "prod_code"))
|
|
101
|
+
]
|
|
102
|
+
release: Annotated[str, Field(description="版本")]
|
|
103
|
+
|
|
104
|
+
action: Annotated[str, Field(description="操作")]
|
|
105
|
+
version: Annotated[str, Field(description="版本")]
|
|
106
|
+
|
|
107
|
+
model_config = ConfigDict(extra="allow")
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
class Meta(MetaBase, Generic[META_DATA_TYPE]):
|
|
111
|
+
data: Annotated[META_DATA_TYPE | None, Field(description="元数据")]
|
|
112
|
+
|
|
113
|
+
@model_validator(mode="before")
|
|
114
|
+
@classmethod
|
|
115
|
+
def parse_raw_data(cls, values):
|
|
116
|
+
raw = values.get("rawData")
|
|
117
|
+
if raw:
|
|
118
|
+
values["data"] = from_json(raw)
|
|
119
|
+
return values
|
|
120
|
+
|
|
121
|
+
model_config = ConfigDict(extra="ignore")
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
class MetaRef(BaseModel):
|
|
125
|
+
"""引用元数据"""
|
|
126
|
+
|
|
127
|
+
cuid: Annotated[str, Field(description="元数据ID", exclude=True)]
|
|
128
|
+
type: Annotated[str, Field(description="类型")]
|
|
129
|
+
code: Annotated[str, Field(description="编码")]
|
|
130
|
+
name: Annotated[str, Field(description="名称")]
|
|
131
|
+
title: Annotated[str, Field(description="中文名称")]
|
|
132
|
+
|
|
133
|
+
refType: Annotated[str, Field(description="引用类型")]
|
|
134
|
+
refCode: Annotated[str, Field(description="引用编码")]
|
|
135
|
+
refName: Annotated[str, Field(description="引用名称")]
|
|
136
|
+
refTitle: Annotated[str, Field(description="引用中文名称")]
|
|
137
|
+
refSubtype: Annotated[str | None, Field(description="引用子类型")]
|
|
138
|
+
refSubcode: Annotated[str | None, Field(description="引用子编码")] = None
|
|
139
|
+
|
|
140
|
+
valid: Annotated[bool, Field(description="是否有效")] = False
|
|
141
|
+
|
|
142
|
+
|
|
143
|
+
class MetaCreate(BaseModel, Generic[META_DATA_TYPE]):
|
|
144
|
+
code: Annotated[str | None, Field(description="编码")] = None
|
|
145
|
+
|
|
146
|
+
type: Annotated[str, Field(description="类型")]
|
|
147
|
+
subType: Annotated[
|
|
148
|
+
str | None,
|
|
149
|
+
Field(description="子类型", validation_alias=AliasChoices("subType", "sub_type")),
|
|
150
|
+
] = None
|
|
151
|
+
|
|
152
|
+
name: Annotated[str, Field(description="名称")]
|
|
153
|
+
title: Annotated[str, Field(description="中文名称")]
|
|
154
|
+
# digest: Annotated[str | None, Field(description="摘要")] = None
|
|
155
|
+
|
|
156
|
+
remark: Annotated[str | None, Field(description="备注")] = None
|
|
157
|
+
|
|
158
|
+
data: Annotated[META_DATA_TYPE, Field(description="元数据")]
|
|
159
|
+
|
|
160
|
+
groupCode: Annotated[
|
|
161
|
+
str | None,
|
|
162
|
+
Field(description="分组编码", validation_alias=AliasChoices("groupCode", "group_code")),
|
|
163
|
+
] = None
|
|
164
|
+
|
|
165
|
+
|
|
166
|
+
class MetaUpdate(BaseModel, Generic[META_DATA_TYPE]):
|
|
167
|
+
code: Annotated[str | None, Field(description="编码")] = None
|
|
168
|
+
|
|
169
|
+
name: Annotated[str | None, Field(description="名称")] = None
|
|
170
|
+
title: Annotated[str | None, Field(description="中文名称")] = None
|
|
171
|
+
remark: Annotated[str | None, Field(description="备注")] = None
|
|
172
|
+
|
|
173
|
+
data: Annotated[
|
|
174
|
+
META_DATA_TYPE | None, Field(description="元数据", exclude_if=lambda x: x is None)
|
|
175
|
+
] = None
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
from typing import Annotated, Any, Literal
|
|
2
|
+
|
|
3
|
+
from pydantic import BaseModel, Field, JsonValue
|
|
4
|
+
|
|
5
|
+
from dataops_sdk.schemas.enums import SqlExpression
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class PageParam(BaseModel):
|
|
9
|
+
start: Annotated[int, Field(description="起始位置")] = 0
|
|
10
|
+
limit: Annotated[int, Field(description="每页条数")] = 20
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class SqlConditionBase(BaseModel):
|
|
14
|
+
name: Annotated[str, Field(description="字段名")]
|
|
15
|
+
value: Annotated[Any, Field(description="字段值")]
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class SqlCondition(SqlConditionBase):
|
|
19
|
+
alias: Annotated[str | None, Field(description="表别名")] = None
|
|
20
|
+
expression: Annotated[SqlExpression, Field(description="条件表达式")]
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class SqlSort(BaseModel):
|
|
24
|
+
alias: Annotated[str | None, Field(description="表别名")] = None
|
|
25
|
+
name: Annotated[str, Field(description="字段名")]
|
|
26
|
+
asc: Annotated[bool, Field(description="是否ASE")] = True
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
class SqlFilter(BaseModel):
|
|
30
|
+
condition: Annotated[SqlConditionBase, Field(description="条件")]
|
|
31
|
+
|
|
32
|
+
@classmethod
|
|
33
|
+
def eq(cls, name: str, value: Any):
|
|
34
|
+
return cls(condition=SqlConditionBase(name=name, value=value))
|
|
35
|
+
|
|
36
|
+
@classmethod
|
|
37
|
+
def ne(cls, name: str, value: Any):
|
|
38
|
+
return cls(condition=SqlConditionBase(name=name, value=value, expression=SqlExpression.NE))
|
|
39
|
+
|
|
40
|
+
@classmethod
|
|
41
|
+
def gt(cls, name: str, value: Any):
|
|
42
|
+
return cls(condition=SqlConditionBase(name=name, value=value, expression=SqlExpression.GT))
|
|
43
|
+
|
|
44
|
+
@classmethod
|
|
45
|
+
def ge(cls, name: str, value: Any):
|
|
46
|
+
return cls(condition=SqlConditionBase(name=name, value=value, expression=SqlExpression.GE))
|
|
47
|
+
|
|
48
|
+
@classmethod
|
|
49
|
+
def lt(cls, name: str, value: Any):
|
|
50
|
+
return cls(condition=SqlConditionBase(name=name, value=value, expression=SqlExpression.LT))
|
|
51
|
+
|
|
52
|
+
@classmethod
|
|
53
|
+
def le(cls, name: str, value: Any):
|
|
54
|
+
return cls(condition=SqlConditionBase(name=name, value=value, expression=SqlExpression.LE))
|
|
55
|
+
|
|
56
|
+
@classmethod
|
|
57
|
+
def in_(cls, name: str, value: list):
|
|
58
|
+
return cls(condition=SqlConditionBase(name=name, value=value, expression=SqlExpression.IN))
|
|
59
|
+
|
|
60
|
+
@classmethod
|
|
61
|
+
def not_in(cls, name: str, value: list):
|
|
62
|
+
return cls(
|
|
63
|
+
condition=SqlConditionBase(name=name, value=value, expression=SqlExpression.NOT_IN)
|
|
64
|
+
)
|
|
65
|
+
|
|
66
|
+
@classmethod
|
|
67
|
+
def like(cls, name: str, value: str):
|
|
68
|
+
return cls(
|
|
69
|
+
condition=SqlConditionBase(name=name, value=value, expression=SqlExpression.LIKE)
|
|
70
|
+
)
|
|
71
|
+
|
|
72
|
+
@classmethod
|
|
73
|
+
def not_like(cls, name: str, value: str):
|
|
74
|
+
return cls(
|
|
75
|
+
condition=SqlConditionBase(name=name, value=value, expression=SqlExpression.NOT_LIKE)
|
|
76
|
+
)
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
class SqlQueryParam(BaseModel):
|
|
80
|
+
conjunction: Annotated[Literal["and", "or"], Field(description="条件连接符")] = "and"
|
|
81
|
+
conditionList: Annotated[
|
|
82
|
+
list[SqlCondition], Field(description="条件列表", default_factory=list)
|
|
83
|
+
]
|
|
84
|
+
sorts: Annotated[list[SqlSort], Field(description="排序列表", default_factory=list)]
|
|
85
|
+
varMap: Annotated[dict[str, JsonValue], Field(description="变量映射", default_factory=dict)]
|
|
86
|
+
|
|
87
|
+
def add_eq(self, name: str, value: Any, alias: str | None = None):
|
|
88
|
+
self.conditionList.append(
|
|
89
|
+
SqlCondition(alias=alias, name=name, value=value, expression=SqlExpression.EQ)
|
|
90
|
+
)
|
|
91
|
+
return self
|
|
92
|
+
|
|
93
|
+
def add_ne(self, name: str, value: Any, alias: str | None = None):
|
|
94
|
+
self.conditionList.append(
|
|
95
|
+
SqlCondition(alias=alias, name=name, value=value, expression=SqlExpression.NE)
|
|
96
|
+
)
|
|
97
|
+
return self
|
|
98
|
+
|
|
99
|
+
def add_gt(self, name: str, value: Any, alias: str | None = None):
|
|
100
|
+
self.conditionList.append(
|
|
101
|
+
SqlCondition(alias=alias, name=name, value=value, expression=SqlExpression.GT)
|
|
102
|
+
)
|
|
103
|
+
return self
|
|
104
|
+
|
|
105
|
+
def add_ge(self, name: str, value: Any, alias: str | None = None):
|
|
106
|
+
self.conditionList.append(
|
|
107
|
+
SqlCondition(alias=alias, name=name, value=value, expression=SqlExpression.GE)
|
|
108
|
+
)
|
|
109
|
+
return self
|
|
110
|
+
|
|
111
|
+
def add_lt(self, name: str, value: Any, alias: str | None = None):
|
|
112
|
+
self.conditionList.append(
|
|
113
|
+
SqlCondition(alias=alias, name=name, value=value, expression=SqlExpression.LT)
|
|
114
|
+
)
|
|
115
|
+
return self
|
|
116
|
+
|
|
117
|
+
def add_le(self, name: str, value: Any, alias: str | None = None):
|
|
118
|
+
self.conditionList.append(
|
|
119
|
+
SqlCondition(alias=alias, name=name, value=value, expression=SqlExpression.LE)
|
|
120
|
+
)
|
|
121
|
+
return self
|
|
122
|
+
|
|
123
|
+
def add_in(self, name: str, value: list, alias: str | None = None):
|
|
124
|
+
self.conditionList.append(
|
|
125
|
+
SqlCondition(alias=alias, name=name, value=value, expression=SqlExpression.IN)
|
|
126
|
+
)
|
|
127
|
+
return self
|
|
128
|
+
|
|
129
|
+
def add_not_in(self, name: str, value: list, alias: str | None = None):
|
|
130
|
+
self.conditionList.append(
|
|
131
|
+
SqlCondition(alias=alias, name=name, value=value, expression=SqlExpression.NOT_IN)
|
|
132
|
+
)
|
|
133
|
+
return self
|
|
134
|
+
|
|
135
|
+
def add_like(self, name: str, value: str, alias: str | None = None):
|
|
136
|
+
self.conditionList.append(
|
|
137
|
+
SqlCondition(alias=alias, name=name, value=value, expression=SqlExpression.LIKE)
|
|
138
|
+
)
|
|
139
|
+
return self
|
|
140
|
+
|
|
141
|
+
def add_not_like(self, name: str, value: str, alias: str | None = None):
|
|
142
|
+
self.conditionList.append(
|
|
143
|
+
SqlCondition(alias=alias, name=name, value=value, expression=SqlExpression.NOT_LIKE)
|
|
144
|
+
)
|
|
145
|
+
return self
|
|
146
|
+
|
|
147
|
+
def add_between(self, name: str, value: tuple[Any, Any], alias: str | None = None):
|
|
148
|
+
self.conditionList.append(
|
|
149
|
+
SqlCondition(alias=alias, name=name, value=value, expression=SqlExpression.BETWEEN)
|
|
150
|
+
)
|
|
151
|
+
return self
|
|
152
|
+
|
|
153
|
+
def add_not_between(self, name: str, value: tuple[Any, Any], alias: str | None = None):
|
|
154
|
+
self.conditionList.append(
|
|
155
|
+
SqlCondition(alias=alias, name=name, value=value, expression=SqlExpression.NOT_BETWEEN)
|
|
156
|
+
)
|
|
157
|
+
return self
|
|
158
|
+
|
|
159
|
+
def add_is_null(self, name: str, alias: str | None = None):
|
|
160
|
+
self.conditionList.append(
|
|
161
|
+
SqlCondition(alias=alias, name=name, value=None, expression=SqlExpression.IS_NULL)
|
|
162
|
+
)
|
|
163
|
+
return self
|
|
164
|
+
|
|
165
|
+
def add_is_not_null(self, name: str, alias: str | None = None):
|
|
166
|
+
self.conditionList.append(
|
|
167
|
+
SqlCondition(alias=alias, name=name, value=None, expression=SqlExpression.IS_NOT_NULL)
|
|
168
|
+
)
|
|
169
|
+
return self
|
|
170
|
+
|
|
171
|
+
def add_exists(self, name: str, value: Any, alias: str | None = None):
|
|
172
|
+
self.conditionList.append(
|
|
173
|
+
SqlCondition(alias=alias, name=name, value=value, expression=SqlExpression.EXISTS)
|
|
174
|
+
)
|
|
175
|
+
return self
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
from collections.abc import Mapping
|
|
2
|
+
from typing import Annotated
|
|
3
|
+
|
|
4
|
+
from pydantic import BaseModel, Field, JsonValue
|
|
5
|
+
|
|
6
|
+
from dataops_sdk.tiptap import TipTapBuilder
|
|
7
|
+
|
|
8
|
+
from .meta import Meta
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class ReportMetaData(BaseModel):
|
|
12
|
+
"""Report metadata"""
|
|
13
|
+
|
|
14
|
+
editor: Annotated[Mapping[str, JsonValue], Field(description="tiptap 原始文档")]
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class ReportMeta(Meta[ReportMetaData]):
|
|
18
|
+
"""文档 Meta"""
|
|
19
|
+
|
|
20
|
+
@property
|
|
21
|
+
def content(self) -> str:
|
|
22
|
+
return TipTapBuilder().build().serialize(self.data.editor).strip()
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
from collections.abc import Mapping
|
|
2
|
+
from typing import Annotated, Any
|
|
3
|
+
|
|
4
|
+
from pydantic import AliasChoices, BaseModel, Field, JsonValue
|
|
5
|
+
|
|
6
|
+
from dataops_sdk.schemas.meta import Meta
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class DataSkill(BaseModel):
|
|
10
|
+
"""skill 实体 rawData 私有字段.
|
|
11
|
+
|
|
12
|
+
字段命名参考前端 ``SkillFile.vue`` 与后端 ``SkillService`` 的约定:
|
|
13
|
+
- ``markdown``: SKILL.md 的 Markdown 正文(用于 LLM 子类型技能)
|
|
14
|
+
- ``editor``: TipTap JSON 文档结构(用于编辑器渲染)
|
|
15
|
+
- ``args``: 技能对外入参定义列表
|
|
16
|
+
- ``input_json_schema``: JSON Schema 格式的入参约束
|
|
17
|
+
"""
|
|
18
|
+
|
|
19
|
+
markdown: Annotated[str | None, Field(description="SKILL.md Markdown 内容")] = None
|
|
20
|
+
editor: Annotated[Mapping[str, JsonValue] | None, Field(description="TipTap JSON 文档结构")] = (
|
|
21
|
+
None
|
|
22
|
+
)
|
|
23
|
+
args: Annotated[
|
|
24
|
+
list[Mapping[str, JsonValue]] | None,
|
|
25
|
+
Field(description="技能对外入参定义"),
|
|
26
|
+
] = None
|
|
27
|
+
input_json_schema: Annotated[
|
|
28
|
+
Mapping[str, JsonValue] | None, Field(description="JSON Schema 入参约束")
|
|
29
|
+
] = None
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
class MetaSkill(Meta[DataSkill]):
|
|
33
|
+
"""skill 实体详情,继承通用 Meta 字段并附加 DataSkill data."""
|
|
34
|
+
|
|
35
|
+
@property
|
|
36
|
+
def content(self) -> str:
|
|
37
|
+
"""便利访问:返回 markdown 文本(若存在)."""
|
|
38
|
+
if self.data is None:
|
|
39
|
+
return ""
|
|
40
|
+
return self.data.markdown or ""
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
class SkillCallResult(BaseModel):
|
|
44
|
+
"""调用 skill 后的返回结果,对应 Java ``SkillResult``.
|
|
45
|
+
|
|
46
|
+
字段使用 snake_case,通过 ``validation_alias`` 兼容后端驼峰返回.
|
|
47
|
+
"""
|
|
48
|
+
|
|
49
|
+
inst_id: Annotated[
|
|
50
|
+
str,
|
|
51
|
+
Field(
|
|
52
|
+
description="调用实例 ID",
|
|
53
|
+
validation_alias=AliasChoices("instId", "inst_id"),
|
|
54
|
+
),
|
|
55
|
+
]
|
|
56
|
+
status: Annotated[str, Field(description="执行状态 success/failure")]
|
|
57
|
+
output_data: Annotated[
|
|
58
|
+
Any,
|
|
59
|
+
Field(
|
|
60
|
+
description="Python 容器返回的业务数据",
|
|
61
|
+
validation_alias=AliasChoices("outputData", "output_data"),
|
|
62
|
+
),
|
|
63
|
+
] = None
|
|
64
|
+
error_message: Annotated[
|
|
65
|
+
str | None,
|
|
66
|
+
Field(
|
|
67
|
+
description="失败时的错误信息",
|
|
68
|
+
validation_alias=AliasChoices("errorMessage", "error_message"),
|
|
69
|
+
),
|
|
70
|
+
] = None
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
from typing import Annotated
|
|
2
|
+
|
|
3
|
+
from pydantic import BaseModel, Field
|
|
4
|
+
|
|
5
|
+
from dataops_sdk.schemas.enums import ColumnType
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class DataBaseColumnReference(BaseModel):
|
|
9
|
+
type: Annotated[str, Field(description="引用类型")]
|
|
10
|
+
code: Annotated[str, Field(description="引用编码")]
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class DataBaseColumnReferenceValue(DataBaseColumnReference):
|
|
14
|
+
subtype: Annotated[str | None, Field(description="引用子类型")]
|
|
15
|
+
subcode: Annotated[str, Field(description="引用子编码")]
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class DataBaseColumnDictExternal(BaseModel):
|
|
19
|
+
ref__dict: Annotated[DataBaseColumnReference, Field(description="外部类型映射")]
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class DataBaseColumnTableExternal(BaseModel):
|
|
23
|
+
ref__table: Annotated[DataBaseColumnReference, Field(description="外部类型表")]
|
|
24
|
+
ref__valueField: Annotated[DataBaseColumnReferenceValue, Field(description="外部类型值字段")]
|
|
25
|
+
ref__displayField: Annotated[
|
|
26
|
+
DataBaseColumnReferenceValue | None,
|
|
27
|
+
Field(description="外部类型显示字段"),
|
|
28
|
+
] = None
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
class ColumnItem(BaseModel):
|
|
32
|
+
id: Annotated[str, Field(description="id")]
|
|
33
|
+
name: Annotated[str, Field(description="列名")]
|
|
34
|
+
title: Annotated[str, Field(description="列中文名")]
|
|
35
|
+
dbType: Annotated[ColumnType, Field(description="数据库类型")]
|
|
36
|
+
nullable: Annotated[bool, Field(description="是否可为空")] = True
|
|
37
|
+
|
|
38
|
+
length: Annotated[int | None, Field(description="长度")] = None
|
|
39
|
+
decimalPlace: Annotated[int | None, Field(description="小数位")] = None
|
|
40
|
+
|
|
41
|
+
type: Annotated[str | None, Field(description="类型")] = None
|
|
42
|
+
|
|
43
|
+
typeExt: Annotated[
|
|
44
|
+
DataBaseColumnDictExternal | DataBaseColumnTableExternal | None,
|
|
45
|
+
Field(description="类型扩展"),
|
|
46
|
+
] = None
|
|
47
|
+
|
|
48
|
+
pk: Annotated[bool | None, Field(description="是否为主键")] = None
|
|
49
|
+
labelKey: Annotated[bool | None, Field(description="是否作为标签")] = None
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
class IndexColumnItem(BaseModel):
|
|
53
|
+
column: Annotated[str, Field(description="列名")]
|
|
54
|
+
sort: Annotated[str | None, Field(description="排序方式")] = None
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
class IndexItem(BaseModel):
|
|
58
|
+
id: Annotated[str, Field(description="id")]
|
|
59
|
+
name: Annotated[str, Field(description="索引名")]
|
|
60
|
+
columns: Annotated[list[IndexColumnItem], Field(description="索引列")]
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
class DataDataBase(BaseModel):
|
|
64
|
+
columns: Annotated[list[ColumnItem], Field(description="列数据", default_factory=list)]
|
|
65
|
+
indexes: Annotated[list[IndexItem], Field(description="索引数据", default_factory=list)]
|