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.
Files changed (99) hide show
  1. {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/PKG-INFO +1 -1
  2. {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/__init__.py +3 -1
  3. {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/schemas/__init__.py +12 -9
  4. {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/schemas/data_table.py +87 -9
  5. {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/schemas/enums.py +3 -0
  6. {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/schemas/group.py +20 -7
  7. dataops_sdk-0.5.0/src/dataops_sdk/schemas/ontology.py +146 -0
  8. {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/services/__init__.py +18 -9
  9. {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/services/data_table.py +103 -14
  10. {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/services/dict_.py +0 -15
  11. {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/services/group.py +30 -11
  12. dataops_sdk-0.5.0/src/dataops_sdk/services/ontology.py +579 -0
  13. {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/services/report.py +6 -6
  14. {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/services/skill.py +15 -3
  15. {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/services/workflow.py +10 -4
  16. {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk.egg-info/PKG-INFO +1 -1
  17. {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk.egg-info/SOURCES.txt +2 -3
  18. dataops_sdk-0.4.4/src/dataops_sdk/schemas/sql_query_ast.py +0 -628
  19. dataops_sdk-0.4.4/src/dataops_sdk/schemas/wiki.py +0 -120
  20. dataops_sdk-0.4.4/src/dataops_sdk/services/wiki.py +0 -194
  21. {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/README.md +0 -0
  22. {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/pyproject.toml +0 -0
  23. {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/setup.cfg +0 -0
  24. {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/constants.py +0 -0
  25. {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/exceptions.py +0 -0
  26. {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/runner/__init__.py +0 -0
  27. {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/runner/datasource_factory.py +0 -0
  28. {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/runner/schemas/nacos/__init__.py +0 -0
  29. {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/runner/schemas/nacos/config.py +0 -0
  30. {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/runner/schemas/nacos/constants.py +0 -0
  31. {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/runner/schemas/nacos/instance.py +0 -0
  32. {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/runner/schemas/nacos/nacos_exception.py +0 -0
  33. {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/runner/schemas/nacos/naming_param.py +0 -0
  34. {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/runner/schemas/nacos/naming_request.py +0 -0
  35. {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/runner/schemas/nacos/naming_response.py +0 -0
  36. {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/runner/schemas/nacos/preserved_metadata_key.py +0 -0
  37. {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/runner/schemas/nacos/service.py +0 -0
  38. {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/runner/utils/__init__.py +0 -0
  39. {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/runner/utils/common.py +0 -0
  40. {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/runner/utils/dbConn_base.py +0 -0
  41. {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/runner/utils/dbConn_sync.py +0 -0
  42. {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/runner/utils/duckdb_manager.py +0 -0
  43. {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/runner/utils/file_transfer_base.py +0 -0
  44. {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/runner/utils/ftp_file_transfer.py +0 -0
  45. {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/runner/utils/nacos.py +0 -0
  46. {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/runner/utils/neo4j_sync.py +0 -0
  47. {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/runner/utils/queue_base.py +0 -0
  48. {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/runner/utils/queue_kafka.py +0 -0
  49. {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/runner/utils/sftp_file_transfer.py +0 -0
  50. {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/runner/utils/websocket_client.py +0 -0
  51. {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/schemas/alarm.py +0 -0
  52. {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/schemas/api.py +0 -0
  53. {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/schemas/common.py +0 -0
  54. {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/schemas/datasource.py +0 -0
  55. {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/schemas/dict_.py +0 -0
  56. {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/schemas/hazard.py +0 -0
  57. {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/schemas/meta.py +0 -0
  58. {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/schemas/query.py +0 -0
  59. {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/schemas/report.py +0 -0
  60. {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/schemas/skill.py +0 -0
  61. {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/schemas/table.py +0 -0
  62. {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/schemas/tag.py +0 -0
  63. {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/schemas/user.py +0 -0
  64. {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/schemas/widget.py +0 -0
  65. {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/schemas/workflow.py +0 -0
  66. {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/services/alarm.py +0 -0
  67. {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/services/api.py +0 -0
  68. {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/services/auth.py +0 -0
  69. {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/services/dataset.py +0 -0
  70. {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/services/datasource.py +0 -0
  71. {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/services/hazard.py +0 -0
  72. {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/services/meta.py +0 -0
  73. {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/services/metrics.py +0 -0
  74. {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/services/ref.py +0 -0
  75. {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/services/table.py +0 -0
  76. {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/services/tag.py +0 -0
  77. {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/services/widget.py +0 -0
  78. {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/session.py +0 -0
  79. {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/tiptap/__init__.py +0 -0
  80. {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/tiptap/builder.py +0 -0
  81. {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/tiptap/constants.py +0 -0
  82. {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/tiptap/markdown_parser.py +0 -0
  83. {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/tiptap/models.py +0 -0
  84. {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/tiptap/parse_utils.py +0 -0
  85. {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/tiptap/render_utils.py +0 -0
  86. {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/tiptap/renderers.py +0 -0
  87. {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/tiptap/tool.py +0 -0
  88. {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/utils/__init__.py +0 -0
  89. {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/utils/common.py +0 -0
  90. {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/utils/log.py +0 -0
  91. {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk/utils/utils.py +0 -0
  92. {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk.egg-info/dependency_links.txt +0 -0
  93. {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk.egg-info/requires.txt +0 -0
  94. {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/src/dataops_sdk.egg-info/top_level.txt +0 -0
  95. {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/tests/test_constants.py +0 -0
  96. {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/tests/test_exceptions.py +0 -0
  97. {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/tests/test_session.py +0 -0
  98. {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/tests/test_utils.py +0 -0
  99. {dataops_sdk-0.4.4 → dataops_sdk-0.5.0}/tests/test_websocket_client.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dataops-sdk
3
- Version: 0.4.4
3
+ Version: 0.5.0
4
4
  Summary: Python SDK for the DataOps platform.
5
5
  Requires-Python: >=3.11
6
6
  Description-Content-Type: text/markdown
@@ -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.4.4"
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[str, Field(description="字段名称/列名 (存储在数据库中的名称)")]
409
- dbType: Annotated[ColumnType, Field(description="字段类型")]
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
- model_config = ConfigDict(extra="allow")
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[dict[SqlExpression, Any], Field(description="条件表达式和值")] = Field(
542
- default_factory=dict
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):
@@ -76,6 +76,9 @@ class MetaType(StrEnum):
76
76
  # 字典
77
77
  DICT = "dict"
78
78
  """字典。"""
79
+ # 本体
80
+ ONTOLOGY = "ontology"
81
+ """本体。"""
79
82
 
80
83
  def __repr__(self):
81
84
  return self.value
@@ -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, Field(description="中文名称", validation_alias=AliasChoices("label", "title", "TITLE"))
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
- field_name_map = {f.dbName: f.title for f in show_fields}
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
- dict_field_map[field.dbName] = {
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(field.dbName)
232
+ dict_fields_name.add(field_key)
179
233
 
180
234
  # 单次遍历完成所有转换
181
- datas = [
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
- meta = service_get_data_table_by_name(datasource, name)
222
- return service_get_data_table_data_by_code(
223
- meta.code,
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=meta,
317
+ meta=resolved_meta,
229
318
  )
230
319
 
231
320