dataops-sdk 0.4.4__tar.gz → 0.5.0__tar.gz
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.
- {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/PKG-INFO +1 -1
- {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/__init__.py +3 -1
- {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/schemas/__init__.py +12 -9
- {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/schemas/data_table.py +87 -9
- {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/schemas/enums.py +3 -0
- {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/schemas/group.py +20 -7
- dataops_sdk-0.5.0/src/dataops_sdk/schemas/ontology.py +146 -0
- {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/services/__init__.py +18 -9
- {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/services/data_table.py +103 -14
- {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/services/dict_.py +0 -15
- {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/services/group.py +30 -11
- dataops_sdk-0.5.0/src/dataops_sdk/services/ontology.py +579 -0
- {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/services/report.py +6 -6
- {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/services/skill.py +15 -3
- {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/services/workflow.py +10 -4
- {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk.egg-info/PKG-INFO +1 -1
- {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk.egg-info/SOURCES.txt +2 -3
- dataops_sdk-0.4.4/src/dataops_sdk/schemas/sql_query_ast.py +0 -628
- dataops_sdk-0.4.4/src/dataops_sdk/schemas/wiki.py +0 -120
- dataops_sdk-0.4.4/src/dataops_sdk/services/wiki.py +0 -194
- {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/README.md +0 -0
- {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/pyproject.toml +0 -0
- {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/setup.cfg +0 -0
- {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/constants.py +0 -0
- {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/exceptions.py +0 -0
- {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/runner/__init__.py +0 -0
- {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/runner/datasource_factory.py +0 -0
- {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/runner/schemas/nacos/__init__.py +0 -0
- {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/runner/schemas/nacos/config.py +0 -0
- {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/runner/schemas/nacos/constants.py +0 -0
- {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/runner/schemas/nacos/instance.py +0 -0
- {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/runner/schemas/nacos/nacos_exception.py +0 -0
- {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/runner/schemas/nacos/naming_param.py +0 -0
- {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/runner/schemas/nacos/naming_request.py +0 -0
- {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/runner/schemas/nacos/naming_response.py +0 -0
- {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/runner/schemas/nacos/preserved_metadata_key.py +0 -0
- {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/runner/schemas/nacos/service.py +0 -0
- {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/runner/utils/__init__.py +0 -0
- {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/runner/utils/common.py +0 -0
- {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/runner/utils/dbConn_base.py +0 -0
- {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/runner/utils/dbConn_sync.py +0 -0
- {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/runner/utils/duckdb_manager.py +0 -0
- {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/runner/utils/file_transfer_base.py +0 -0
- {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/runner/utils/ftp_file_transfer.py +0 -0
- {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/runner/utils/nacos.py +0 -0
- {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/runner/utils/neo4j_sync.py +0 -0
- {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/runner/utils/queue_base.py +0 -0
- {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/runner/utils/queue_kafka.py +0 -0
- {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/runner/utils/sftp_file_transfer.py +0 -0
- {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/runner/utils/websocket_client.py +0 -0
- {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/schemas/alarm.py +0 -0
- {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/schemas/api.py +0 -0
- {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/schemas/common.py +0 -0
- {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/schemas/datasource.py +0 -0
- {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/schemas/dict_.py +0 -0
- {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/schemas/hazard.py +0 -0
- {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/schemas/meta.py +0 -0
- {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/schemas/query.py +0 -0
- {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/schemas/report.py +0 -0
- {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/schemas/skill.py +0 -0
- {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/schemas/table.py +0 -0
- {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/schemas/tag.py +0 -0
- {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/schemas/user.py +0 -0
- {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/schemas/widget.py +0 -0
- {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/schemas/workflow.py +0 -0
- {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/services/alarm.py +0 -0
- {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/services/api.py +0 -0
- {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/services/auth.py +0 -0
- {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/services/dataset.py +0 -0
- {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/services/datasource.py +0 -0
- {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/services/hazard.py +0 -0
- {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/services/meta.py +0 -0
- {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/services/metrics.py +0 -0
- {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/services/ref.py +0 -0
- {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/services/table.py +0 -0
- {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/services/tag.py +0 -0
- {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/services/widget.py +0 -0
- {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/session.py +0 -0
- {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/tiptap/__init__.py +0 -0
- {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/tiptap/builder.py +0 -0
- {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/tiptap/constants.py +0 -0
- {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/tiptap/markdown_parser.py +0 -0
- {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/tiptap/models.py +0 -0
- {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/tiptap/parse_utils.py +0 -0
- {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/tiptap/render_utils.py +0 -0
- {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/tiptap/renderers.py +0 -0
- {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/tiptap/tool.py +0 -0
- {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/utils/__init__.py +0 -0
- {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/utils/common.py +0 -0
- {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/utils/log.py +0 -0
- {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/utils/utils.py +0 -0
- {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk.egg-info/dependency_links.txt +0 -0
- {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk.egg-info/requires.txt +0 -0
- {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk.egg-info/top_level.txt +0 -0
- {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/tests/test_constants.py +0 -0
- {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/tests/test_exceptions.py +0 -0
- {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/tests/test_session.py +0 -0
- {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/tests/test_utils.py +0 -0
- {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/tests/test_websocket_client.py +0 -0
|
@@ -44,7 +44,9 @@ from .services import ( # noqa: F401
|
|
|
44
44
|
service_get_data_table_by_code,
|
|
45
45
|
service_get_data_table_by_name,
|
|
46
46
|
service_get_data_table_data_by_code,
|
|
47
|
+
service_get_data_table_data_ext_by_code,
|
|
47
48
|
service_get_data_table_data_by_name,
|
|
49
|
+
service_get_data_table_data_ext_by_name,
|
|
48
50
|
service_get_data_table_record_by_id,
|
|
49
51
|
service_get_data_table_reference_list,
|
|
50
52
|
service_get_data_table_total,
|
|
@@ -109,4 +111,4 @@ from .services import ( # noqa: F401
|
|
|
109
111
|
)
|
|
110
112
|
from .session import dataops_base_url_context, request_context
|
|
111
113
|
|
|
112
|
-
__version__ = "0.
|
|
114
|
+
__version__ = "0.5.0"
|
|
@@ -40,10 +40,20 @@ from .meta import (
|
|
|
40
40
|
MetaRef,
|
|
41
41
|
MetaUpdate,
|
|
42
42
|
)
|
|
43
|
+
from .ontology import (
|
|
44
|
+
OntologyConstraint,
|
|
45
|
+
OntologyMeta,
|
|
46
|
+
OntologyMetaData,
|
|
47
|
+
OntologyOnCondition,
|
|
48
|
+
OntologyOnOperand,
|
|
49
|
+
OntologyRef,
|
|
50
|
+
OntologyRelation,
|
|
51
|
+
OntologyRelationJoin,
|
|
52
|
+
OntologyScenario,
|
|
53
|
+
)
|
|
43
54
|
from .query import PageParam, SqlCondition, SqlFilter, SqlQueryParam, SqlSort
|
|
44
55
|
from .report import ReportMeta, ReportMetaData
|
|
45
56
|
from .skill import DataSkill, DataSkillSubFile, MetaSkill, SkillCallResult
|
|
46
|
-
from .tag import TagBrief, TagEntityType, TagTreeNode
|
|
47
57
|
from .table import (
|
|
48
58
|
ColumnItem,
|
|
49
59
|
DataBaseColumnDictExternal,
|
|
@@ -52,14 +62,7 @@ from .table import (
|
|
|
52
62
|
DataBaseColumnTableExternal,
|
|
53
63
|
DataDataBase,
|
|
54
64
|
)
|
|
65
|
+
from .tag import TagBrief, TagEntityType, TagTreeNode
|
|
55
66
|
from .user import Application, UserInfo
|
|
56
67
|
from .widget import WidgetMeta, WidgetMetaData
|
|
57
|
-
from .wiki import (
|
|
58
|
-
KbType,
|
|
59
|
-
KnowledgeBase,
|
|
60
|
-
KnowledgeDocument,
|
|
61
|
-
KnowledgeSearchResult,
|
|
62
|
-
WikiPage,
|
|
63
|
-
WikiPageResult,
|
|
64
|
-
)
|
|
65
68
|
from .workflow import DataWorkflow, MetaWorkflow
|
|
@@ -387,11 +387,14 @@ class DataTableField(BaseModel):
|
|
|
387
387
|
|
|
388
388
|
Attributes:
|
|
389
389
|
id: 字段唯一标识 (UUID)。
|
|
390
|
-
dbName:
|
|
391
|
-
dbType:
|
|
390
|
+
dbName: 存储在数据库中的字段/列名(主表物理列)。
|
|
391
|
+
dbType: 数据库列类型(虚拟列 lookup/rollup 可为空)。
|
|
392
392
|
title: 前端显示标题。
|
|
393
393
|
name: 前端显示的字段/列名。
|
|
394
394
|
type: 字段类型。
|
|
395
|
+
source: 字段来源(main/aux)。
|
|
396
|
+
table_alias: 附属表别名(source=aux)。
|
|
397
|
+
column_name: 附属表物理列名(source=aux,替代 dbName)。
|
|
395
398
|
pk: 是否主键。
|
|
396
399
|
label: 是否标签字段(用于卡片/记录展示)。
|
|
397
400
|
visible: 是否在表格中可见。
|
|
@@ -401,17 +404,45 @@ class DataTableField(BaseModel):
|
|
|
401
404
|
align: 文本对齐方式。
|
|
402
405
|
default_value: 新增记录时的默认值。
|
|
403
406
|
type_ext: 类型扩展配置。
|
|
407
|
+
readonly: 是否只读。
|
|
408
|
+
join_key: 是否为附属表关联键。
|
|
409
|
+
maintain_permission: 维护权限。
|
|
404
410
|
"""
|
|
405
411
|
|
|
406
412
|
id: Annotated[str | None, Field(description="字段唯一标识 (UUID)", exclude=True)] = None
|
|
407
413
|
|
|
408
|
-
dbName: Annotated[
|
|
409
|
-
|
|
414
|
+
dbName: Annotated[
|
|
415
|
+
str | None,
|
|
416
|
+
Field(description="字段名称/列名 (存储在数据库中的名称)", default=None),
|
|
417
|
+
] = None
|
|
418
|
+
dbType: Annotated[
|
|
419
|
+
ColumnType | str | None,
|
|
420
|
+
Field(description="字段类型", default=None),
|
|
421
|
+
] = None
|
|
410
422
|
|
|
411
423
|
title: Annotated[str | None, Field(description="显示标题")]
|
|
412
424
|
name: Annotated[str, Field(description="字段名称/列名 (前端显示的名称)")]
|
|
413
425
|
type: Annotated[str | None, Field(description="字段类型")] = None
|
|
414
426
|
|
|
427
|
+
source: Annotated[
|
|
428
|
+
Literal["main", "aux"] | None,
|
|
429
|
+
Field(description="字段来源"),
|
|
430
|
+
] = None
|
|
431
|
+
table_alias: Annotated[
|
|
432
|
+
str | None,
|
|
433
|
+
Field(
|
|
434
|
+
description="附属表别名",
|
|
435
|
+
validation_alias=AliasChoices("tableAlias", "table_alias"),
|
|
436
|
+
),
|
|
437
|
+
] = None
|
|
438
|
+
column_name: Annotated[
|
|
439
|
+
str | None,
|
|
440
|
+
Field(
|
|
441
|
+
description="附属表物理列名",
|
|
442
|
+
validation_alias=AliasChoices("columnName", "column_name"),
|
|
443
|
+
),
|
|
444
|
+
] = None
|
|
445
|
+
|
|
415
446
|
# 数据属性
|
|
416
447
|
pk: Annotated[bool, Field(description="是否主键")] = False
|
|
417
448
|
label: Annotated[bool, Field(description="是否标签字段 (用于卡片/记录展示)")] = False
|
|
@@ -435,7 +466,22 @@ class DataTableField(BaseModel):
|
|
|
435
466
|
Field(description="类型扩展配置", validation_alias=AliasChoices("typeExt", "type_ext")),
|
|
436
467
|
] = None
|
|
437
468
|
|
|
438
|
-
|
|
469
|
+
readonly: Annotated[bool | None, Field(description="是否只读")] = None
|
|
470
|
+
join_key: Annotated[
|
|
471
|
+
bool | None,
|
|
472
|
+
Field(
|
|
473
|
+
description="是否为附属表关联键", validation_alias=AliasChoices("joinKey", "join_key")
|
|
474
|
+
),
|
|
475
|
+
] = None
|
|
476
|
+
maintain_permission: Annotated[
|
|
477
|
+
str | None,
|
|
478
|
+
Field(
|
|
479
|
+
description="维护权限",
|
|
480
|
+
validation_alias=AliasChoices("maintainPermission", "maintain_permission"),
|
|
481
|
+
),
|
|
482
|
+
] = None
|
|
483
|
+
|
|
484
|
+
model_config = ConfigDict(extra="allow", populate_by_name=True)
|
|
439
485
|
|
|
440
486
|
|
|
441
487
|
# ---------------------------------------------------------------------------
|
|
@@ -525,6 +571,28 @@ class CustomButton(BaseModel):
|
|
|
525
571
|
# ---------------------------------------------------------------------------
|
|
526
572
|
|
|
527
573
|
|
|
574
|
+
class QueryPlugin(BaseModel):
|
|
575
|
+
"""查询组件插件配置.
|
|
576
|
+
|
|
577
|
+
Attributes:
|
|
578
|
+
type: 插件类型,如 ``field``。
|
|
579
|
+
"""
|
|
580
|
+
|
|
581
|
+
type: Annotated[str, Field(description="插件类型")] = "field"
|
|
582
|
+
|
|
583
|
+
|
|
584
|
+
class QueryConditionExpression(BaseModel):
|
|
585
|
+
"""查询条件表达式配置.
|
|
586
|
+
|
|
587
|
+
Attributes:
|
|
588
|
+
expression: 条件表达式。
|
|
589
|
+
"""
|
|
590
|
+
|
|
591
|
+
expression: Annotated[SqlExpression | None, Field(description="条件表达式")] = None
|
|
592
|
+
|
|
593
|
+
model_config = ConfigDict(extra="allow")
|
|
594
|
+
|
|
595
|
+
|
|
528
596
|
class QueryCondition(BaseModel):
|
|
529
597
|
"""查询条件 (公开级别).
|
|
530
598
|
|
|
@@ -532,15 +600,25 @@ class QueryCondition(BaseModel):
|
|
|
532
600
|
id: 条件 ID。
|
|
533
601
|
name: 字段名。
|
|
534
602
|
title: 显示标题。
|
|
535
|
-
condition:
|
|
603
|
+
condition: 条件表达式配置。
|
|
604
|
+
plugin: 查询组件插件。
|
|
605
|
+
db_type: 字段数据库类型。
|
|
536
606
|
"""
|
|
537
607
|
|
|
538
608
|
id: Annotated[str | None, Field(description="条件ID")] = None
|
|
539
609
|
name: Annotated[str, Field(description="字段名")]
|
|
540
610
|
title: Annotated[str | None, Field(description="显示标题")]
|
|
541
|
-
condition: Annotated[
|
|
542
|
-
|
|
543
|
-
|
|
611
|
+
condition: Annotated[
|
|
612
|
+
QueryConditionExpression | None,
|
|
613
|
+
Field(description="条件表达式配置"),
|
|
614
|
+
] = None
|
|
615
|
+
plugin: Annotated[QueryPlugin | None, Field(description="查询组件插件")] = None
|
|
616
|
+
db_type: Annotated[
|
|
617
|
+
ColumnType | str | None,
|
|
618
|
+
Field(description="字段数据库类型", validation_alias=AliasChoices("dbType", "db_type")),
|
|
619
|
+
] = None
|
|
620
|
+
|
|
621
|
+
model_config = ConfigDict(extra="allow", populate_by_name=True)
|
|
544
622
|
|
|
545
623
|
|
|
546
624
|
class QueryFormParams(BaseModel):
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
|
|
7
7
|
from typing import Annotated
|
|
8
8
|
|
|
9
|
-
from pydantic import AliasChoices, BaseModel, Field, JsonValue
|
|
9
|
+
from pydantic import AliasChoices, BaseModel, ConfigDict, Field, JsonValue
|
|
10
10
|
|
|
11
11
|
|
|
12
12
|
class GroupTree(BaseModel):
|
|
@@ -31,16 +31,24 @@ class GroupTree(BaseModel):
|
|
|
31
31
|
|
|
32
32
|
|
|
33
33
|
class GroupNode(BaseModel):
|
|
34
|
+
"""分组树节点.
|
|
35
|
+
|
|
36
|
+
与前端 ``addGroupNode`` 请求体对齐:``pid`` / ``parentId`` / ``digest`` 等字段可选;
|
|
37
|
+
展示名称通过 ``label`` 传入,模型内部字段名为 ``title``。
|
|
38
|
+
"""
|
|
39
|
+
|
|
40
|
+
model_config = ConfigDict(populate_by_name=True)
|
|
41
|
+
|
|
34
42
|
id: Annotated[
|
|
35
43
|
str, Field(description="元数据ID", validation_alias=AliasChoices("id", "cuid", "CUID"))
|
|
36
44
|
]
|
|
37
|
-
pid: Annotated[str | None, Field(description="父ID")]
|
|
45
|
+
pid: Annotated[str | None, Field(description="父ID")] = None
|
|
38
46
|
parentId: Annotated[
|
|
39
47
|
str | None,
|
|
40
48
|
Field(
|
|
41
49
|
description="父ID", validation_alias=AliasChoices("parentId", "parent_id", "PARENT_ID")
|
|
42
50
|
),
|
|
43
|
-
]
|
|
51
|
+
] = None
|
|
44
52
|
|
|
45
53
|
type: Annotated[str, Field(description="类型", validation_alias=AliasChoices("type", "TYPE"))]
|
|
46
54
|
subType: Annotated[
|
|
@@ -48,18 +56,23 @@ class GroupNode(BaseModel):
|
|
|
48
56
|
Field(
|
|
49
57
|
description="子类型", validation_alias=AliasChoices("subType", "sub_type", "SUB_TYPE")
|
|
50
58
|
),
|
|
51
|
-
]
|
|
59
|
+
] = None
|
|
52
60
|
|
|
53
61
|
name: Annotated[str, Field(description="名称", validation_alias=AliasChoices("name", "NAME"))]
|
|
54
62
|
title: Annotated[
|
|
55
|
-
str,
|
|
63
|
+
str,
|
|
64
|
+
Field(
|
|
65
|
+
description="中文名称",
|
|
66
|
+
validation_alias=AliasChoices("label", "title", "TITLE"),
|
|
67
|
+
serialization_alias="label",
|
|
68
|
+
),
|
|
56
69
|
]
|
|
57
70
|
digest: Annotated[
|
|
58
71
|
str | None, Field(description="摘要", validation_alias=AliasChoices("digest", "DIGEST"))
|
|
59
|
-
]
|
|
72
|
+
] = None
|
|
60
73
|
remark: Annotated[
|
|
61
74
|
str | None, Field(description="备注", validation_alias=AliasChoices("remark", "REMARK"))
|
|
62
|
-
]
|
|
75
|
+
] = None
|
|
63
76
|
|
|
64
77
|
attrs: Annotated[dict[str, JsonValue] | None, Field(description="扩展属性")] = None
|
|
65
78
|
params: Annotated[dict[str, JsonValue] | None, Field(description="参数")] = None
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
"""本体 (Ontology) Meta Schema 定义.
|
|
2
|
+
|
|
3
|
+
对应前端 ``pages/ontology/constants.js`` 中 rawData 结构:
|
|
4
|
+
``data_table`` / ``scenarios`` / ``constraints`` / ``relations`` / ``notes``。
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
from typing import Annotated, Literal
|
|
10
|
+
|
|
11
|
+
from pydantic import BaseModel, ConfigDict, Field
|
|
12
|
+
|
|
13
|
+
from .meta import Meta
|
|
14
|
+
|
|
15
|
+
RELATION_REF_TYPE_ONTOLOGY = "ontology"
|
|
16
|
+
ON_OPERAND_FIELD = "field"
|
|
17
|
+
ON_OPERAND_CONST = "const"
|
|
18
|
+
ON_TABLE_SOURCE = "source"
|
|
19
|
+
ON_TABLE_TARGET = "target"
|
|
20
|
+
JOIN_TABLE_MAIN = "main"
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class OntologyRef(BaseModel):
|
|
24
|
+
"""关联对象引用."""
|
|
25
|
+
|
|
26
|
+
model_config = ConfigDict(extra="allow")
|
|
27
|
+
|
|
28
|
+
type: Annotated[str, Field(description="引用类型,固定 ontology")] = RELATION_REF_TYPE_ONTOLOGY
|
|
29
|
+
code: Annotated[str, Field(description="关联本体编码", default="")]
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
class OntologyOnOperand(BaseModel):
|
|
33
|
+
"""ON 条件操作数.
|
|
34
|
+
|
|
35
|
+
``table`` 仅 type=field 时有意义;缺失时按位置解析(左 source / 右 target),
|
|
36
|
+
等于位置默认值时不落库。
|
|
37
|
+
"""
|
|
38
|
+
|
|
39
|
+
model_config = ConfigDict(extra="allow")
|
|
40
|
+
|
|
41
|
+
type: Annotated[
|
|
42
|
+
Literal["field", "const"],
|
|
43
|
+
Field(description="操作数类型:field / const"),
|
|
44
|
+
] = ON_OPERAND_FIELD
|
|
45
|
+
table: Annotated[
|
|
46
|
+
Literal["source", "target"] | None,
|
|
47
|
+
Field(description="表侧:source=本表 / target=目标表(默认不落库)"),
|
|
48
|
+
] = None
|
|
49
|
+
field: Annotated[str | None, Field(description="字段名(type=field)")] = None
|
|
50
|
+
value: Annotated[str | None, Field(description="常量值(type=const)")] = None
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
class OntologyOnCondition(BaseModel):
|
|
54
|
+
"""关系 ON 条件."""
|
|
55
|
+
|
|
56
|
+
model_config = ConfigDict(extra="allow")
|
|
57
|
+
|
|
58
|
+
op: Annotated[str, Field(description="运算符", default="eq")]
|
|
59
|
+
left: Annotated[OntologyOnOperand, Field(description="左操作数")]
|
|
60
|
+
right: Annotated[OntologyOnOperand, Field(description="右操作数")]
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
class OntologyRelationJoin(BaseModel):
|
|
64
|
+
"""关系 JOIN 物理表.
|
|
65
|
+
|
|
66
|
+
两侧均为 ``main`` 时不落库整个 join 对象。
|
|
67
|
+
"""
|
|
68
|
+
|
|
69
|
+
model_config = ConfigDict(extra="allow")
|
|
70
|
+
|
|
71
|
+
sourceTable: Annotated[
|
|
72
|
+
str, Field(description="本侧物理表:main 或附属表 alias", default=JOIN_TABLE_MAIN)
|
|
73
|
+
] = JOIN_TABLE_MAIN
|
|
74
|
+
targetTable: Annotated[
|
|
75
|
+
str, Field(description="目标侧物理表:main 或附属表 alias", default=JOIN_TABLE_MAIN)
|
|
76
|
+
] = JOIN_TABLE_MAIN
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
class OntologyRelation(BaseModel):
|
|
80
|
+
"""本体关联关系."""
|
|
81
|
+
|
|
82
|
+
model_config = ConfigDict(extra="allow")
|
|
83
|
+
|
|
84
|
+
id: Annotated[str, Field(description="关系项 ID")]
|
|
85
|
+
name: Annotated[str, Field(description="关系名称", default="")]
|
|
86
|
+
ref: Annotated[OntologyRef, Field(description="关联目标本体")]
|
|
87
|
+
type: Annotated[str, Field(description="关系类型", default="")]
|
|
88
|
+
cardinality: Annotated[str, Field(description="基数(1-1 / 1-N / N-1)", default="")]
|
|
89
|
+
remark: Annotated[str, Field(description="备注", default="")]
|
|
90
|
+
join: Annotated[
|
|
91
|
+
OntologyRelationJoin | None,
|
|
92
|
+
Field(description="JOIN 物理表;两侧 main 时 omit"),
|
|
93
|
+
] = None
|
|
94
|
+
on: Annotated[
|
|
95
|
+
list[OntologyOnCondition], Field(description="JOIN ON 条件", default_factory=list)
|
|
96
|
+
]
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
class OntologyScenario(BaseModel):
|
|
100
|
+
"""本体场景(绑定技能)."""
|
|
101
|
+
|
|
102
|
+
model_config = ConfigDict(extra="allow")
|
|
103
|
+
|
|
104
|
+
id: Annotated[str, Field(description="场景项 ID")]
|
|
105
|
+
name: Annotated[str, Field(description="场景名称", default="")]
|
|
106
|
+
skill: Annotated[str, Field(description="绑定技能编码", default="")]
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
class OntologyConstraint(BaseModel):
|
|
110
|
+
"""本体约束."""
|
|
111
|
+
|
|
112
|
+
model_config = ConfigDict(extra="allow")
|
|
113
|
+
|
|
114
|
+
id: Annotated[str, Field(description="约束项 ID")]
|
|
115
|
+
type: Annotated[str, Field(description="约束类型", default="")]
|
|
116
|
+
rule: Annotated[str, Field(description="约束规则", default="")]
|
|
117
|
+
|
|
118
|
+
|
|
119
|
+
class OntologyMetaData(BaseModel):
|
|
120
|
+
"""本体 rawData 配置.
|
|
121
|
+
|
|
122
|
+
Attributes:
|
|
123
|
+
data_table: 绑定的多维表格编码。
|
|
124
|
+
scenarios: 场景列表。
|
|
125
|
+
constraints: 约束列表。
|
|
126
|
+
relations: 关联关系列表。
|
|
127
|
+
notes: 其他说明。
|
|
128
|
+
"""
|
|
129
|
+
|
|
130
|
+
model_config = ConfigDict(extra="allow")
|
|
131
|
+
|
|
132
|
+
data_table: Annotated[str, Field(description="绑定的多维表格编码", default="")]
|
|
133
|
+
scenarios: Annotated[
|
|
134
|
+
list[OntologyScenario], Field(description="场景列表", default_factory=list)
|
|
135
|
+
]
|
|
136
|
+
constraints: Annotated[
|
|
137
|
+
list[OntologyConstraint], Field(description="约束列表", default_factory=list)
|
|
138
|
+
]
|
|
139
|
+
relations: Annotated[
|
|
140
|
+
list[OntologyRelation], Field(description="关联关系列表", default_factory=list)
|
|
141
|
+
]
|
|
142
|
+
notes: Annotated[str, Field(description="其他说明", default="")]
|
|
143
|
+
|
|
144
|
+
|
|
145
|
+
class OntologyMeta(Meta[OntologyMetaData]):
|
|
146
|
+
"""本体详情 Meta."""
|
|
@@ -37,7 +37,9 @@ from .data_table import (
|
|
|
37
37
|
service_get_data_table_by_code,
|
|
38
38
|
service_get_data_table_by_name,
|
|
39
39
|
service_get_data_table_data_by_code,
|
|
40
|
+
service_get_data_table_data_ext_by_code,
|
|
40
41
|
service_get_data_table_data_by_name,
|
|
42
|
+
service_get_data_table_data_ext_by_name,
|
|
41
43
|
service_get_data_table_record_by_id,
|
|
42
44
|
service_get_data_table_reference_list,
|
|
43
45
|
service_get_data_table_total,
|
|
@@ -93,6 +95,21 @@ from .metrics import (
|
|
|
93
95
|
service_get_metrics_data_by_code,
|
|
94
96
|
service_list_metrics,
|
|
95
97
|
)
|
|
98
|
+
from .ontology import (
|
|
99
|
+
normalize_ontology_meta,
|
|
100
|
+
service_get_ontology_by_code,
|
|
101
|
+
service_get_ontology_by_name,
|
|
102
|
+
service_list_ontologies,
|
|
103
|
+
service_resolve_ontology,
|
|
104
|
+
service_tree_ontology,
|
|
105
|
+
service_update_ontology,
|
|
106
|
+
service_update_ontology_basic,
|
|
107
|
+
service_update_ontology_constraints,
|
|
108
|
+
service_update_ontology_notes,
|
|
109
|
+
service_update_ontology_relations,
|
|
110
|
+
validate_ontology_name,
|
|
111
|
+
validate_ontology_relations,
|
|
112
|
+
)
|
|
96
113
|
from .ref import service_ref_backward, service_ref_forward
|
|
97
114
|
from .report import service_get_report, service_list_reports, servive_tree_report
|
|
98
115
|
from .skill import (
|
|
@@ -107,9 +124,9 @@ from .skill import (
|
|
|
107
124
|
service_skill_call_by_name,
|
|
108
125
|
service_skill_delete_sub_file,
|
|
109
126
|
service_skill_download,
|
|
127
|
+
service_skill_update,
|
|
110
128
|
service_skill_get_subfile_by_code,
|
|
111
129
|
service_skill_get_subfile_by_name,
|
|
112
|
-
service_skill_update,
|
|
113
130
|
service_skill_upload,
|
|
114
131
|
service_skill_upload_sub_file,
|
|
115
132
|
)
|
|
@@ -150,14 +167,6 @@ from .widget import (
|
|
|
150
167
|
service_update_widget,
|
|
151
168
|
servive_tree_widget,
|
|
152
169
|
)
|
|
153
|
-
from .wiki import (
|
|
154
|
-
service_get_knowledge_base,
|
|
155
|
-
service_list_knowledge_bases,
|
|
156
|
-
service_list_knowledge_documents,
|
|
157
|
-
service_search_knowledge,
|
|
158
|
-
service_search_wiki_pages,
|
|
159
|
-
service_upload_knowledge_file,
|
|
160
|
-
)
|
|
161
170
|
from .workflow import (
|
|
162
171
|
service_get_workflow_by_code,
|
|
163
172
|
service_get_workflow_by_name,
|
|
@@ -29,7 +29,9 @@ __all__ = [
|
|
|
29
29
|
"service_get_data_table_by_code",
|
|
30
30
|
"service_create_data_table",
|
|
31
31
|
"service_get_data_table_data_by_code",
|
|
32
|
+
"service_get_data_table_data_ext_by_code",
|
|
32
33
|
"service_get_data_table_data_by_name",
|
|
34
|
+
"service_get_data_table_data_ext_by_name",
|
|
33
35
|
"service_get_data_table_total",
|
|
34
36
|
"service_get_data_table_reference_list",
|
|
35
37
|
"service_get_data_table_record_by_id",
|
|
@@ -99,6 +101,49 @@ def service_create_data_table(meta: MetaCreate[DataTableData]) -> Meta[DataTable
|
|
|
99
101
|
|
|
100
102
|
|
|
101
103
|
def service_get_data_table_data_by_code(
|
|
104
|
+
code: str,
|
|
105
|
+
page_param: PageParam | None = None,
|
|
106
|
+
query_param: SqlQueryParam | None = None,
|
|
107
|
+
*,
|
|
108
|
+
meta: Meta[DataTableData] | None = None,
|
|
109
|
+
) -> list[Mapping[str, JsonValue]]:
|
|
110
|
+
"""根据编码查询多维表格数据(原始字段名,无额外转换).
|
|
111
|
+
|
|
112
|
+
Args:
|
|
113
|
+
code: 数据表编码
|
|
114
|
+
page_param: 分页参数,默认为 PageParam()(第一页,每页 20 条)
|
|
115
|
+
query_param: 查询过滤条件,默认为 SqlQueryParam()
|
|
116
|
+
meta: 多维表格元数据(可选,用于获取 subSystem)
|
|
117
|
+
|
|
118
|
+
Returns:
|
|
119
|
+
字典列表,key 为后端返回的原始字段名
|
|
120
|
+
|
|
121
|
+
Raises:
|
|
122
|
+
NotFoundError: 找不到对应多维表格时
|
|
123
|
+
DataOpsError: API 返回错误时
|
|
124
|
+
AuthenticationError: 未认证或认证失败时
|
|
125
|
+
"""
|
|
126
|
+
if page_param is None:
|
|
127
|
+
page_param = PageParam()
|
|
128
|
+
if query_param is None:
|
|
129
|
+
query_param = SqlQueryParam()
|
|
130
|
+
|
|
131
|
+
meta = meta or service_get_data_table_by_code(code)
|
|
132
|
+
|
|
133
|
+
with get_session(timeout=15, sub_system=meta.subSystem) as session:
|
|
134
|
+
resp = session.post(
|
|
135
|
+
f"/data/table/list/{code}",
|
|
136
|
+
content=to_json(
|
|
137
|
+
encrypt_body(dict(pageParam=page_param, queryParam=query_param, code=code))
|
|
138
|
+
),
|
|
139
|
+
)
|
|
140
|
+
body = vaild_respone(resp, True)
|
|
141
|
+
|
|
142
|
+
adapter = TypeAdapter(list[Mapping[str, JsonValue]])
|
|
143
|
+
return adapter.validate_python(body.data or [])
|
|
144
|
+
|
|
145
|
+
|
|
146
|
+
def service_get_data_table_data_ext_by_code(
|
|
102
147
|
code: str,
|
|
103
148
|
page_param: PageParam | None = None,
|
|
104
149
|
query_param: SqlQueryParam | None = None,
|
|
@@ -107,7 +152,7 @@ def service_get_data_table_data_by_code(
|
|
|
107
152
|
*,
|
|
108
153
|
meta: Meta[DataTableData] | None = None,
|
|
109
154
|
) -> list[Mapping[str, JsonValue]]:
|
|
110
|
-
"""
|
|
155
|
+
"""根据编码获取多维表格数据(拓展:字段标题映射、字典翻译、可见性过滤).
|
|
111
156
|
|
|
112
157
|
Args:
|
|
113
158
|
code: 数据表编码
|
|
@@ -115,6 +160,7 @@ def service_get_data_table_data_by_code(
|
|
|
115
160
|
query_param: 查询过滤条件,默认为 SqlQueryParam()
|
|
116
161
|
show_invisible: 是否显示未标记 visible 的字段,默认为 False
|
|
117
162
|
translate: 是否对 DICT 类型字段进行值翻译,默认为 True
|
|
163
|
+
meta: 多维表格元数据(可选)
|
|
118
164
|
|
|
119
165
|
Returns:
|
|
120
166
|
字典列表,每条记录 key 为中文字段标题,value 已做字典翻译
|
|
@@ -150,10 +196,15 @@ def service_get_data_table_data_by_code(
|
|
|
150
196
|
else:
|
|
151
197
|
datas = adapter.validate_python(body.data or [])
|
|
152
198
|
|
|
153
|
-
#
|
|
199
|
+
# 过滤不需要显示的字段,建立字段名映射(附属表/虚拟列可能无 dbName,回退到 name)
|
|
154
200
|
all_fields = meta.data.fields
|
|
155
201
|
show_fields = all_fields if show_invisible else [f for f in all_fields if f.visible]
|
|
156
|
-
|
|
202
|
+
|
|
203
|
+
def _field_db_key(field) -> str | None:
|
|
204
|
+
key = field.dbName or field.name
|
|
205
|
+
return key.lower() if key else None
|
|
206
|
+
|
|
207
|
+
field_name_map = {key: f.title for f in show_fields if (key := _field_db_key(f)) is not None}
|
|
157
208
|
show_db_names = frozenset(field_name_map.keys())
|
|
158
209
|
|
|
159
210
|
# 预处理字典字段映射(只执行一次过滤)
|
|
@@ -171,14 +222,17 @@ def service_get_data_table_data_by_code(
|
|
|
171
222
|
None,
|
|
172
223
|
)
|
|
173
224
|
if field and isinstance(relation, Mapping):
|
|
174
|
-
|
|
225
|
+
field_key = _field_db_key(field)
|
|
226
|
+
if field_key is None:
|
|
227
|
+
continue
|
|
228
|
+
dict_field_map[field_key] = {
|
|
175
229
|
str(relation_key): str(relation_value)
|
|
176
230
|
for relation_key, relation_value in relation.items()
|
|
177
231
|
}
|
|
178
|
-
dict_fields_name.add(
|
|
232
|
+
dict_fields_name.add(field_key)
|
|
179
233
|
|
|
180
234
|
# 单次遍历完成所有转换
|
|
181
|
-
|
|
235
|
+
return [
|
|
182
236
|
{
|
|
183
237
|
field_name_map[k_lower]: (
|
|
184
238
|
dict_field_map[k_lower][str(v)]["_LABEL"] if k_lower in dict_fields_name else v
|
|
@@ -189,18 +243,52 @@ def service_get_data_table_data_by_code(
|
|
|
189
243
|
for data in datas
|
|
190
244
|
]
|
|
191
245
|
|
|
192
|
-
return datas
|
|
193
|
-
|
|
194
246
|
|
|
195
247
|
def service_get_data_table_data_by_name(
|
|
248
|
+
datasource: str,
|
|
249
|
+
name: str,
|
|
250
|
+
page_param: PageParam | None = None,
|
|
251
|
+
query_param: SqlQueryParam | None = None,
|
|
252
|
+
*,
|
|
253
|
+
meta: Meta[DataTableData] | None = None,
|
|
254
|
+
) -> list[Mapping[str, JsonValue]]:
|
|
255
|
+
"""按数据源与名称查询多维表格数据(原始字段名,无额外转换).
|
|
256
|
+
|
|
257
|
+
Args:
|
|
258
|
+
datasource: 数据源.
|
|
259
|
+
name: 多维表格名称.
|
|
260
|
+
page_param: 分页参数,默认为 ``PageParam()``.
|
|
261
|
+
query_param: 查询过滤条件,默认为 ``SqlQueryParam()``.
|
|
262
|
+
meta: 多维表格元数据(可选).
|
|
263
|
+
|
|
264
|
+
Returns:
|
|
265
|
+
字典列表,key 为后端返回的原始字段名.
|
|
266
|
+
|
|
267
|
+
Raises:
|
|
268
|
+
NotFoundError: 找不到对应多维表格时.
|
|
269
|
+
DataOpsError: API 返回错误时.
|
|
270
|
+
AuthenticationError: 未认证或认证失败时.
|
|
271
|
+
"""
|
|
272
|
+
resolved_meta = meta or service_get_data_table_by_name(datasource, name)
|
|
273
|
+
return service_get_data_table_data_by_code(
|
|
274
|
+
resolved_meta.code,
|
|
275
|
+
page_param=page_param,
|
|
276
|
+
query_param=query_param,
|
|
277
|
+
meta=resolved_meta,
|
|
278
|
+
)
|
|
279
|
+
|
|
280
|
+
|
|
281
|
+
def service_get_data_table_data_ext_by_name(
|
|
196
282
|
datasource: str,
|
|
197
283
|
name: str,
|
|
198
284
|
page_param: PageParam | None = None,
|
|
199
285
|
query_param: SqlQueryParam | None = None,
|
|
200
286
|
show_invisible: bool = False,
|
|
201
287
|
translate: bool = True,
|
|
202
|
-
|
|
203
|
-
|
|
288
|
+
*,
|
|
289
|
+
meta: Meta[DataTableData] | None = None,
|
|
290
|
+
) -> list[Mapping[str, JsonValue]]:
|
|
291
|
+
"""按数据源与名称获取多维表格数据(拓展:字段标题映射、字典翻译、可见性过滤).
|
|
204
292
|
|
|
205
293
|
Args:
|
|
206
294
|
datasource: 数据源.
|
|
@@ -209,6 +297,7 @@ def service_get_data_table_data_by_name(
|
|
|
209
297
|
query_param: 查询过滤条件,默认为 ``SqlQueryParam()``.
|
|
210
298
|
show_invisible: 是否显示未标记 visible 的字段.
|
|
211
299
|
translate: 是否对 DICT 字段进行值翻译.
|
|
300
|
+
meta: 多维表格元数据(可选).
|
|
212
301
|
|
|
213
302
|
Returns:
|
|
214
303
|
字典列表,每条记录 key 为中文字段标题,value 已做字典翻译.
|
|
@@ -218,14 +307,14 @@ def service_get_data_table_data_by_name(
|
|
|
218
307
|
DataOpsError: API 返回错误时.
|
|
219
308
|
AuthenticationError: 未认证或认证失败时.
|
|
220
309
|
"""
|
|
221
|
-
|
|
222
|
-
return
|
|
223
|
-
|
|
310
|
+
resolved_meta = meta or service_get_data_table_by_name(datasource, name)
|
|
311
|
+
return service_get_data_table_data_ext_by_code(
|
|
312
|
+
resolved_meta.code,
|
|
224
313
|
page_param=page_param,
|
|
225
314
|
query_param=query_param,
|
|
226
315
|
show_invisible=show_invisible,
|
|
227
316
|
translate=translate,
|
|
228
|
-
meta=
|
|
317
|
+
meta=resolved_meta,
|
|
229
318
|
)
|
|
230
319
|
|
|
231
320
|
|