pyegeria 5.3.9.9.3__py3-none-any.whl → 5.5.3.3__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 pyegeria might be problematic. Click here for more details.

Files changed (272) hide show
  1. commands/__init__.py +24 -0
  2. commands/cat/Dr-Egeria_md-orig.py +2 -2
  3. commands/cat/__init__.py +1 -17
  4. commands/cat/collection_actions.py +197 -0
  5. commands/cat/dr_egeria_command_help.py +372 -0
  6. commands/cat/dr_egeria_jupyter.py +7 -7
  7. commands/cat/dr_egeria_md.py +27 -182
  8. commands/cat/exp_list_glossaries.py +11 -14
  9. commands/cat/get_asset_graph.py +37 -267
  10. commands/cat/{get_collection.py → get_collection_tree.py} +10 -18
  11. commands/cat/get_project_dependencies.py +14 -14
  12. commands/cat/get_project_structure.py +15 -14
  13. commands/cat/get_tech_type_elements.py +16 -116
  14. commands/cat/glossary_actions.py +145 -298
  15. commands/cat/list_assets.py +3 -11
  16. commands/cat/list_cert_types.py +17 -63
  17. commands/cat/list_collections.py +46 -138
  18. commands/cat/list_deployed_catalogs.py +15 -27
  19. commands/cat/list_deployed_database_schemas.py +27 -43
  20. commands/cat/list_deployed_databases.py +16 -31
  21. commands/cat/list_deployed_servers.py +35 -54
  22. commands/cat/list_glossaries.py +18 -17
  23. commands/cat/list_projects.py +10 -12
  24. commands/cat/list_tech_type_elements.py +21 -37
  25. commands/cat/list_tech_types.py +13 -25
  26. commands/cat/list_terms.py +38 -79
  27. commands/cat/list_todos.py +4 -11
  28. commands/cat/list_user_ids.py +3 -10
  29. commands/cat/my_reports.py +559 -0
  30. commands/cat/run_report.py +394 -0
  31. commands/cat/run_report_orig.py +528 -0
  32. commands/cli/egeria.py +222 -247
  33. commands/cli/egeria_cat.py +68 -81
  34. commands/cli/egeria_my.py +13 -0
  35. commands/cli/egeria_ops.py +69 -74
  36. commands/cli/egeria_tech.py +17 -93
  37. commands/cli/ops_config.py +3 -6
  38. commands/{cat/list_categories.py → deprecated/list_data_designer.py} +53 -64
  39. commands/{cat/list_data_structures.py → deprecated/list_data_structures_full.py} +3 -6
  40. commands/deprecated/old_get_asset_graph.py +315 -0
  41. commands/my/__init__.py +0 -2
  42. commands/my/list_my_profile.py +27 -34
  43. commands/my/list_my_roles.py +1 -7
  44. commands/my/monitor_my_todos.py +1 -7
  45. commands/my/monitor_open_todos.py +6 -7
  46. commands/my/todo_actions.py +4 -5
  47. commands/ops/__init__.py +0 -2
  48. commands/ops/gov_server_actions.py +17 -21
  49. commands/ops/list_archives.py +17 -38
  50. commands/ops/list_catalog_targets.py +33 -40
  51. commands/ops/load_archive.py +35 -26
  52. commands/ops/{monitor_engine_activity_c.py → monitor_active_engine_activity.py} +51 -82
  53. commands/ops/{monitor_integ_daemon_status.py → monitor_daemon_status.py} +35 -55
  54. commands/ops/monitor_engine_activity.py +79 -77
  55. commands/ops/{monitor_gov_eng_status.py → monitor_engine_status.py} +10 -7
  56. commands/ops/monitor_platform_status.py +38 -50
  57. commands/ops/monitor_server_startup.py +6 -11
  58. commands/ops/monitor_server_status.py +7 -11
  59. commands/ops/orig_monitor_server_list.py +8 -8
  60. commands/ops/orig_monitor_server_status.py +1 -5
  61. commands/ops/refresh_integration_daemon.py +5 -5
  62. commands/ops/restart_integration_daemon.py +5 -5
  63. commands/ops/table_integ_daemon_status.py +6 -6
  64. commands/ops/x_engine_actions.py +7 -7
  65. commands/tech/__init__.py +0 -2
  66. commands/tech/{generic_actions.py → element_actions.py} +6 -11
  67. commands/tech/get_element_info.py +20 -29
  68. commands/tech/get_guid_info.py +23 -42
  69. commands/tech/get_tech_details.py +20 -35
  70. commands/tech/get_tech_type_template.py +28 -39
  71. commands/tech/list_all_om_type_elements.py +24 -30
  72. commands/tech/list_all_om_type_elements_x.py +22 -28
  73. commands/tech/list_all_related_elements.py +19 -28
  74. commands/tech/list_anchored_elements.py +22 -30
  75. commands/tech/list_asset_types.py +19 -24
  76. commands/tech/list_elements_by_classification_by_property_value.py +26 -32
  77. commands/tech/list_elements_by_property_value.py +19 -25
  78. commands/tech/list_elements_by_property_value_x.py +20 -28
  79. commands/tech/list_elements_for_classification.py +28 -41
  80. commands/tech/list_gov_action_processes.py +16 -27
  81. commands/tech/list_information_supply_chains.py +22 -30
  82. commands/tech/list_registered_services.py +14 -26
  83. commands/tech/list_related_elements_with_prop_value.py +15 -25
  84. commands/tech/list_related_specification.py +1 -4
  85. commands/tech/list_relationship_types.py +15 -25
  86. commands/tech/list_relationships.py +20 -36
  87. commands/tech/list_solution_blueprints.py +28 -33
  88. commands/tech/list_solution_components.py +23 -29
  89. commands/tech/list_solution_roles.py +21 -32
  90. commands/tech/list_tech_templates.py +51 -54
  91. commands/tech/list_valid_metadata_values.py +5 -9
  92. commands/tech/table_tech_templates.py +2 -6
  93. commands/tech/x_list_related_elements.py +1 -4
  94. examples/GeoSpatial Products Example.py +524 -0
  95. examples/Jupyter Notebooks/P-egeria-server-config.ipynb +2137 -0
  96. examples/Jupyter Notebooks/README.md +2 -0
  97. examples/Jupyter Notebooks/common/P-environment-check.ipynb +115 -0
  98. examples/Jupyter Notebooks/common/__init__.py +14 -0
  99. examples/Jupyter Notebooks/common/common-functions.ipynb +4694 -0
  100. examples/Jupyter Notebooks/common/environment-check.ipynb +52 -0
  101. examples/Jupyter Notebooks/common/globals.ipynb +184 -0
  102. examples/Jupyter Notebooks/common/globals.py +154 -0
  103. examples/Jupyter Notebooks/common/orig_globals.py +152 -0
  104. examples/format_sets/all_format_sets.json +910 -0
  105. examples/format_sets/custom_format_sets.json +268 -0
  106. examples/format_sets/subset_format_sets.json +187 -0
  107. examples/format_sets_save_load_example.py +291 -0
  108. examples/jacquard_data_sets.py +129 -0
  109. examples/output_formats_example.py +193 -0
  110. examples/test_jacquard_data_sets.py +54 -0
  111. examples/test_jacquard_data_sets_scenarios.py +94 -0
  112. md_processing/__init__.py +90 -0
  113. md_processing/command_dispatcher.py +33 -0
  114. md_processing/command_mapping.py +221 -0
  115. md_processing/data/commands/commands_data_designer.json +537 -0
  116. md_processing/data/commands/commands_external_reference.json +733 -0
  117. md_processing/data/commands/commands_feedback.json +155 -0
  118. md_processing/data/commands/commands_general.json +204 -0
  119. md_processing/data/commands/commands_glossary.json +218 -0
  120. md_processing/data/commands/commands_governance.json +3678 -0
  121. md_processing/data/commands/commands_product_manager.json +865 -0
  122. md_processing/data/commands/commands_project.json +642 -0
  123. md_processing/data/commands/commands_solution_architect.json +366 -0
  124. md_processing/data/commands.json +17568 -0
  125. md_processing/data/commands_working.json +30641 -0
  126. md_processing/data/gened_report_specs.py +6584 -0
  127. md_processing/data/generated_format_sets.json +6533 -0
  128. md_processing/data/generated_format_sets_old.json +4137 -0
  129. md_processing/data/generated_format_sets_old.py +45 -0
  130. md_processing/dr_egeria.py +182 -0
  131. md_processing/md_commands/__init__.py +3 -0
  132. md_processing/md_commands/data_designer_commands.py +1276 -0
  133. md_processing/md_commands/ext_ref_commands.py +530 -0
  134. md_processing/md_commands/feedback_commands.py +726 -0
  135. md_processing/md_commands/glossary_commands.py +684 -0
  136. md_processing/md_commands/governance_officer_commands.py +600 -0
  137. md_processing/md_commands/product_manager_commands.py +1266 -0
  138. md_processing/md_commands/project_commands.py +383 -0
  139. md_processing/md_commands/solution_architect_commands.py +1184 -0
  140. md_processing/md_commands/view_commands.py +295 -0
  141. md_processing/md_processing_utils/__init__.py +4 -0
  142. md_processing/md_processing_utils/common_md_proc_utils.py +1249 -0
  143. md_processing/md_processing_utils/common_md_utils.py +578 -0
  144. md_processing/md_processing_utils/determine_width.py +103 -0
  145. md_processing/md_processing_utils/extraction_utils.py +547 -0
  146. md_processing/md_processing_utils/gen_report_specs.py +643 -0
  147. md_processing/md_processing_utils/generate_dr_help.py +193 -0
  148. md_processing/md_processing_utils/generate_md_cmd_templates.py +144 -0
  149. md_processing/md_processing_utils/generate_md_templates.py +83 -0
  150. md_processing/md_processing_utils/md_processing_constants.py +1228 -0
  151. md_processing/md_processing_utils/message_constants.py +19 -0
  152. pyegeria/__init__.py +201 -443
  153. pyegeria/core/__init__.py +40 -0
  154. pyegeria/core/_base_platform_client.py +574 -0
  155. pyegeria/core/_base_server_client.py +573 -0
  156. pyegeria/core/_exceptions.py +457 -0
  157. pyegeria/core/_globals.py +60 -0
  158. pyegeria/core/_server_client.py +6073 -0
  159. pyegeria/core/_validators.py +257 -0
  160. pyegeria/core/config.py +654 -0
  161. pyegeria/{create_tech_guid_lists.py → core/create_tech_guid_lists.py} +0 -1
  162. pyegeria/core/load_config.py +37 -0
  163. pyegeria/core/logging_configuration.py +207 -0
  164. pyegeria/core/mcp_adapter.py +144 -0
  165. pyegeria/core/mcp_server.py +212 -0
  166. pyegeria/core/utils.py +405 -0
  167. pyegeria/deprecated/__init__.py +0 -0
  168. pyegeria/{_client.py → deprecated/_client.py} +62 -24
  169. pyegeria/{_deprecated_gov_engine.py → deprecated/_deprecated_gov_engine.py} +16 -16
  170. pyegeria/{classification_manager_omvs.py → deprecated/classification_manager_omvs.py} +1988 -1878
  171. pyegeria/deprecated/output_formatter_with_machine_keys.py +1127 -0
  172. pyegeria/{runtime_manager_omvs.py → deprecated/runtime_manager_omvs.py} +216 -229
  173. pyegeria/{valid_metadata_omvs.py → deprecated/valid_metadata_omvs.py} +93 -93
  174. pyegeria/{x_action_author_omvs.py → deprecated/x_action_author_omvs.py} +2 -3
  175. pyegeria/egeria_cat_client.py +25 -51
  176. pyegeria/egeria_client.py +140 -98
  177. pyegeria/egeria_config_client.py +48 -24
  178. pyegeria/egeria_tech_client.py +170 -83
  179. pyegeria/models/__init__.py +150 -0
  180. pyegeria/models/collection_models.py +168 -0
  181. pyegeria/models/models.py +654 -0
  182. pyegeria/omvs/__init__.py +84 -0
  183. pyegeria/omvs/action_author.py +342 -0
  184. pyegeria/omvs/actor_manager.py +5980 -0
  185. pyegeria/omvs/asset_catalog.py +842 -0
  186. pyegeria/omvs/asset_maker.py +2736 -0
  187. pyegeria/omvs/automated_curation.py +4403 -0
  188. pyegeria/omvs/classification_manager.py +11213 -0
  189. pyegeria/omvs/collection_manager.py +5780 -0
  190. pyegeria/omvs/community_matters_omvs.py +468 -0
  191. pyegeria/{core_omag_server_config.py → omvs/core_omag_server_config.py} +157 -157
  192. pyegeria/{data_designer_omvs.py → omvs/data_designer.py} +1991 -1691
  193. pyegeria/omvs/data_discovery.py +869 -0
  194. pyegeria/omvs/data_engineer.py +372 -0
  195. pyegeria/omvs/digital_business.py +1133 -0
  196. pyegeria/omvs/external_links.py +1752 -0
  197. pyegeria/omvs/feedback_manager.py +834 -0
  198. pyegeria/{full_omag_server_config.py → omvs/full_omag_server_config.py} +73 -69
  199. pyegeria/omvs/glossary_manager.py +3231 -0
  200. pyegeria/omvs/governance_officer.py +3009 -0
  201. pyegeria/omvs/lineage_linker.py +314 -0
  202. pyegeria/omvs/location_arena.py +1525 -0
  203. pyegeria/omvs/metadata_expert.py +668 -0
  204. pyegeria/omvs/metadata_explorer_omvs.py +2943 -0
  205. pyegeria/omvs/my_profile.py +1042 -0
  206. pyegeria/omvs/notification_manager.py +358 -0
  207. pyegeria/omvs/people_organizer.py +394 -0
  208. pyegeria/{platform_services.py → omvs/platform_services.py} +113 -193
  209. pyegeria/omvs/product_manager.py +1825 -0
  210. pyegeria/omvs/project_manager.py +1907 -0
  211. pyegeria/omvs/reference_data.py +1140 -0
  212. pyegeria/omvs/registered_info.py +334 -0
  213. pyegeria/omvs/runtime_manager.py +2817 -0
  214. pyegeria/omvs/schema_maker.py +446 -0
  215. pyegeria/{server_operations.py → omvs/server_operations.py} +27 -26
  216. pyegeria/omvs/solution_architect.py +6490 -0
  217. pyegeria/omvs/specification_properties.py +37 -0
  218. pyegeria/omvs/subject_area.py +1042 -0
  219. pyegeria/omvs/template_manager_omvs.py +236 -0
  220. pyegeria/omvs/time_keeper.py +1761 -0
  221. pyegeria/omvs/valid_metadata.py +3221 -0
  222. pyegeria/omvs/valid_metadata_lists.py +37 -0
  223. pyegeria/omvs/valid_type_lists.py +37 -0
  224. pyegeria/view/__init__.py +28 -0
  225. pyegeria/view/_output_format_models.py +514 -0
  226. pyegeria/view/_output_formats.py +14 -0
  227. pyegeria/view/base_report_formats.py +2719 -0
  228. pyegeria/view/dr_egeria_reports.py +56 -0
  229. pyegeria/view/format_set_executor.py +397 -0
  230. pyegeria/{md_processing_utils.py → view/md_processing_utils.py} +5 -5
  231. pyegeria/{mermaid_utilities.py → view/mermaid_utilities.py} +2 -154
  232. pyegeria/view/output_formatter.py +1297 -0
  233. pyegeria-5.5.3.3.dist-info/METADATA +218 -0
  234. pyegeria-5.5.3.3.dist-info/RECORD +241 -0
  235. {pyegeria-5.3.9.9.3.dist-info → pyegeria-5.5.3.3.dist-info}/WHEEL +2 -1
  236. pyegeria-5.5.3.3.dist-info/entry_points.txt +103 -0
  237. pyegeria-5.5.3.3.dist-info/top_level.txt +4 -0
  238. commands/cat/.DS_Store +0 -0
  239. commands/cat/README.md +0 -16
  240. commands/cli/txt_custom_v2.tcss +0 -19
  241. commands/my/README.md +0 -17
  242. commands/ops/README.md +0 -24
  243. commands/ops/monitor_asset_events.py +0 -108
  244. commands/tech/README.md +0 -24
  245. pyegeria/.DS_Store +0 -0
  246. pyegeria/README.md +0 -35
  247. pyegeria/_globals.py +0 -47
  248. pyegeria/_validators.py +0 -385
  249. pyegeria/asset_catalog_omvs.py +0 -864
  250. pyegeria/automated_curation_omvs.py +0 -3765
  251. pyegeria/collection_manager_omvs.py +0 -2744
  252. pyegeria/dr.egeria spec.md +0 -9
  253. pyegeria/egeria_my_client.py +0 -56
  254. pyegeria/feedback_manager_omvs.py +0 -4573
  255. pyegeria/glossary_browser_omvs.py +0 -3728
  256. pyegeria/glossary_manager_omvs.py +0 -2440
  257. pyegeria/m_test.py +0 -118
  258. pyegeria/md_processing_helpers.py +0 -58
  259. pyegeria/md_processing_utils_orig.py +0 -1103
  260. pyegeria/metadata_explorer_omvs.py +0 -2326
  261. pyegeria/my_profile_omvs.py +0 -1022
  262. pyegeria/output_formatter.py +0 -389
  263. pyegeria/project_manager_omvs.py +0 -1933
  264. pyegeria/registered_info.py +0 -167
  265. pyegeria/solution_architect_omvs.py +0 -2156
  266. pyegeria/template_manager_omvs.py +0 -1414
  267. pyegeria/utils.py +0 -197
  268. pyegeria-5.3.9.9.3.dist-info/METADATA +0 -72
  269. pyegeria-5.3.9.9.3.dist-info/RECORD +0 -143
  270. pyegeria-5.3.9.9.3.dist-info/entry_points.txt +0 -99
  271. /pyegeria/{_exceptions.py → deprecated/_exceptions.py} +0 -0
  272. {pyegeria-5.3.9.9.3.dist-info → pyegeria-5.5.3.3.dist-info/licenses}/LICENSE +0 -0
@@ -0,0 +1,236 @@
1
+ """
2
+ SPDX-License-Identifier: Apache-2.0
3
+ Copyright Contributors to the ODPi Egeria project.
4
+
5
+ The Template Manager OMVS provides APIs for managing metadata templates.
6
+ Metadata templates are used to simplify the cataloguing of new metadata elements.
7
+
8
+ """
9
+
10
+ import asyncio
11
+ from typing import Any, Optional
12
+ from pyegeria.core._server_client import ServerClient
13
+ from pyegeria.core._globals import default_time_out
14
+ from pyegeria.core.utils import dynamic_catch
15
+ from pyegeria.models import (NewRelationshipRequestBody, DeleteRelationshipRequestBody,
16
+ NewClassificationRequestBody, DeleteClassificationRequestBody)
17
+
18
+
19
+ class TemplateManager(ServerClient):
20
+ """Client to issue Template Manager requests.
21
+
22
+ Attributes:
23
+
24
+ view_server : str
25
+ Name of the server to use.
26
+ platform_url : str
27
+ URL of the server platform to connect to
28
+ user_id : str
29
+ The identity of the user calling the method - this sets a default optionally used by the methods
30
+ when the user doesn't pass the user_id on a method call.
31
+ user_pwd: str
32
+ The password associated with the user_id. Defaults to None
33
+ token: str, optional
34
+ Bearer token
35
+
36
+ Methods:
37
+
38
+ """
39
+
40
+ def __init__(
41
+ self,
42
+ view_server: str,
43
+ platform_url: str,
44
+ user_id: str,
45
+ user_pwd: Optional[str] = None,
46
+ token: Optional[str] = None,
47
+ time_out: int = default_time_out,
48
+ ):
49
+ self.view_server = view_server
50
+ self.time_out = time_out
51
+ ServerClient.__init__(self, view_server, platform_url, user_id, user_pwd, token=token)
52
+ self.command_root = f"{self.platform_url}/servers/{self.view_server}/api/open-metadata/template-manager"
53
+
54
+ @dynamic_catch
55
+ async def _async_link_sourced_from(self, element_guid: str, template_guid: str, body: Optional[dict | NewRelationshipRequestBody] = None) -> None:
56
+ """Attach a template to an element that was created from it.
57
+ Async version.
58
+
59
+ Parameters
60
+ ----------
61
+ element_guid : str
62
+ Unique identifier of the element created from the template.
63
+ template_guid : str
64
+ Unique identifier of the source template.
65
+ body : dict | NewRelationshipRequestBody, optional
66
+ Relationship details.
67
+
68
+ Notes
69
+ -----
70
+ Sample JSON body:
71
+ {
72
+ "class" : "NewRelationshipRequestBody",
73
+ "relationshipProperties" : {
74
+ "class": "SourceFromProperties",
75
+ "sourceVersionNumber" : 0
76
+ },
77
+ "externalSourceGUID": "Add guid here",
78
+ "externalSourceName": "Add qualified name here",
79
+ "forLineage": false,
80
+ "forDuplicateProcessing": false,
81
+ "effectiveTime" : "2024-01-01T00:00:00.000+00:00"
82
+ }
83
+ """
84
+ url = f"{self.command_root}/elements/{element_guid}/sourced-from/{template_guid}/attach"
85
+ await self._async_new_relationship_request(url, body=body)
86
+
87
+ @dynamic_catch
88
+ def link_sourced_from(self, element_guid: str, template_guid: str, body: Optional[dict | NewRelationshipRequestBody] = None) -> None:
89
+ """Attach a template to an element that was created from it."""
90
+ return asyncio.get_event_loop().run_until_complete(self._async_link_sourced_from(element_guid, template_guid, body))
91
+
92
+ @dynamic_catch
93
+ async def _async_detach_sourced_from(self, element_guid: str, template_guid: str, body: Optional[dict | DeleteRelationshipRequestBody] = None) -> None:
94
+ """Detach the source template for an element.
95
+ Async version.
96
+
97
+ Parameters
98
+ ----------
99
+ element_guid : str
100
+ Unique identifier of the element.
101
+ template_guid : str
102
+ Unique identifier of the source template.
103
+ body : dict | DeleteRelationshipRequestBody, optional
104
+ Detachment details.
105
+ """
106
+ url = f"{self.command_root}/elements/{element_guid}/sourced-from/{template_guid}/detach"
107
+ await self._async_delete_relationship_request(url, body=body)
108
+
109
+ @dynamic_catch
110
+ def detach_sourced_from(self, element_guid: str, template_guid: str, body: Optional[dict | DeleteRelationshipRequestBody] = None) -> None:
111
+ """Detach the source template for an element."""
112
+ return asyncio.get_event_loop().run_until_complete(self._async_detach_sourced_from(element_guid, template_guid, body))
113
+
114
+ @dynamic_catch
115
+ async def _async_link_catalog_template(self, element_guid: str, template_guid: str, body: Optional[dict | NewRelationshipRequestBody] = None) -> None:
116
+ """Attach a template to an element that was created from it.
117
+ Async version.
118
+
119
+ Parameters
120
+ ----------
121
+ element_guid : str
122
+ Unique identifier of the parent element.
123
+ template_guid : str
124
+ Unique identifier of the catalog template.
125
+ body : dict | NewRelationshipRequestBody, optional
126
+ Relationship details.
127
+ """
128
+ url = f"{self.command_root}/elements/{element_guid}/catalog-template/{template_guid}/attach"
129
+ await self._async_new_relationship_request(url, body=body)
130
+
131
+ @dynamic_catch
132
+ def link_catalog_template(self, element_guid: str, template_guid: str, body: Optional[dict | NewRelationshipRequestBody] = None) -> None:
133
+ """Attach a template to an element that was created from it."""
134
+ return asyncio.get_event_loop().run_until_complete(self._async_link_catalog_template(element_guid, template_guid, body))
135
+
136
+ @dynamic_catch
137
+ async def _async_detach_catalog_template(self, element_guid: str, template_guid: str, body: Optional[dict | DeleteRelationshipRequestBody] = None) -> None:
138
+ """Detach a template for an element that this template is relevant to.
139
+ Async version.
140
+
141
+ Parameters
142
+ ----------
143
+ element_guid : str
144
+ Unique identifier of the parent element.
145
+ template_guid : str
146
+ Unique identifier of the template.
147
+ body : dict | DeleteRelationshipRequestBody, optional
148
+ Detachment details.
149
+ """
150
+ url = f"{self.command_root}/elements/{element_guid}/catalog-template/{template_guid}/detach"
151
+ await self._async_delete_relationship_request(url, body=body)
152
+
153
+ @dynamic_catch
154
+ def detach_catalog_template(self, element_guid: str, template_guid: str, body: Optional[dict | DeleteRelationshipRequestBody] = None) -> None:
155
+ """Detach a template for an element that this template is relevant to."""
156
+ return asyncio.get_event_loop().run_until_complete(self._async_detach_catalog_template(element_guid, template_guid, body))
157
+
158
+ @dynamic_catch
159
+ async def _async_add_template_classification(self, element_guid: str, body: Optional[dict | NewClassificationRequestBody] = None) -> None:
160
+ """Classify an element as suitable to be used as a template for cataloguing elements of similar types.
161
+ Async version.
162
+
163
+ Parameters
164
+ ----------
165
+ element_guid : str
166
+ Unique identifier of the element to classify.
167
+ body : dict | NewClassificationRequestBody, optional
168
+ Classification details.
169
+ """
170
+ url = f"{self.command_root}/elements/{element_guid}/template"
171
+ await self._async_new_classification_request(url, body=body)
172
+
173
+ @dynamic_catch
174
+ def add_template_classification(self, element_guid: str, body: Optional[dict | NewClassificationRequestBody] = None) -> None:
175
+ """Classify an element as suitable to be used as a template for cataloguing elements of similar types."""
176
+ return asyncio.get_event_loop().run_until_complete(self._async_add_template_classification(element_guid, body))
177
+
178
+ @dynamic_catch
179
+ async def _async_remove_template_classification(self, element_guid: str, body: Optional[dict | DeleteClassificationRequestBody] = None) -> None:
180
+ """Remove the Template classification from the element.
181
+ Async version.
182
+
183
+ Parameters
184
+ ----------
185
+ element_guid : str
186
+ Unique identifier of the element.
187
+ body : dict | DeleteClassificationRequestBody, optional
188
+ Declassification details.
189
+ """
190
+ url = f"{self.command_root}/elements/{element_guid}/template/remove"
191
+ await self._async_delete_classification_request(url, body=body)
192
+
193
+ @dynamic_catch
194
+ def remove_template_classification(self, element_guid: str, body: Optional[dict | DeleteClassificationRequestBody] = None) -> None:
195
+ """Remove the Template classification from the element."""
196
+ return asyncio.get_event_loop().run_until_complete(self._async_remove_template_classification(element_guid, body))
197
+
198
+ @dynamic_catch
199
+ async def _async_add_template_substitute_classification(self, element_guid: str, body: Optional[dict | NewClassificationRequestBody] = None) -> None:
200
+ """Classify an element as suitable to be used as a template substitute for cataloguing elements of similar types.
201
+ Async version.
202
+
203
+ Parameters
204
+ ----------
205
+ element_guid : str
206
+ Unique identifier of the element to classify.
207
+ body : dict | NewClassificationRequestBody, optional
208
+ Classification details.
209
+ """
210
+ url = f"{self.command_root}/elements/{element_guid}/template-substitute"
211
+ await self._async_new_classification_request(url, body=body)
212
+
213
+ @dynamic_catch
214
+ def add_template_substitute_classification(self, element_guid: str, body: Optional[dict | NewClassificationRequestBody] = None) -> None:
215
+ """Classify an element as suitable to be used as a template substitute for cataloguing elements of similar types."""
216
+ return asyncio.get_event_loop().run_until_complete(self._async_add_template_substitute_classification(element_guid, body))
217
+
218
+ @dynamic_catch
219
+ async def _async_remove_template_substitute_classification(self, element_guid: str, body: Optional[dict | DeleteClassificationRequestBody] = None) -> None:
220
+ """Remove the TemplateSubstitute classification from the element.
221
+ Async version.
222
+
223
+ Parameters
224
+ ----------
225
+ element_guid : str
226
+ Unique identifier of the element.
227
+ body : dict | DeleteClassificationRequestBody, optional
228
+ Declassification details.
229
+ """
230
+ url = f"{self.command_root}/elements/{element_guid}/template-substitute/remove"
231
+ await self._async_delete_classification_request(url, body=body)
232
+
233
+ @dynamic_catch
234
+ def remove_template_substitute_classification(self, element_guid: str, body: Optional[dict | DeleteClassificationRequestBody] = None) -> None:
235
+ """Remove the TemplateSubstitute classification from the element."""
236
+ return asyncio.get_event_loop().run_until_complete(self._async_remove_template_substitute_classification(element_guid, body))