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,358 @@
1
+ """
2
+ PDX-License-Identifier: Apache-2.0
3
+ Copyright Contributors to the ODPi Egeria project.
4
+
5
+ This module provides access to the Notification Manager OMVS module.
6
+
7
+ The Notification Manager OMVS provides APIs for managing notification types and their
8
+ relationships to monitored resources and subscribers.
9
+ """
10
+
11
+ import asyncio
12
+ from typing import Optional
13
+
14
+ from pyegeria.core._server_client import ServerClient
15
+ from pyegeria.core.config import settings as app_settings
16
+ from pyegeria.models import (
17
+ NewRelationshipRequestBody,
18
+ DeleteRelationshipRequestBody,
19
+ )
20
+ from pyegeria.core.utils import dynamic_catch, body_slimmer
21
+
22
+ EGERIA_LOCAL_QUALIFIER = app_settings.User_Profile.egeria_local_qualifier
23
+
24
+
25
+ class NotificationManager(ServerClient):
26
+ """
27
+ Manage notification types and their relationships to monitored resources and subscribers.
28
+
29
+ This client provides methods to link notification types with monitored resources
30
+ and notification subscribers.
31
+
32
+ Attributes
33
+ ----------
34
+ view_server : str
35
+ The name of the View Server to connect to.
36
+ platform_url : str
37
+ URL of the server platform to connect to.
38
+ user_id : str
39
+ The identity of the user calling the method - this sets a default optionally
40
+ used by the methods when the user doesn't pass the user_id on a method call.
41
+ user_pwd : str, optional
42
+ The password associated with the user_id. Defaults to None.
43
+ token : str, optional
44
+ An optional bearer token for authentication.
45
+
46
+ Methods
47
+ -------
48
+ link_monitored_resource(notification_type_guid, monitored_resource_guid, body)
49
+ Attach a monitored resource to a notification type.
50
+ detach_monitored_resource(notification_type_guid, monitored_resource_guid, body)
51
+ Detach a monitored resource from a notification type.
52
+ link_notification_subscriber(notification_type_guid, subscriber_guid, body)
53
+ Attach a subscriber to a notification type.
54
+ detach_notification_subscriber(notification_type_guid, subscriber_guid, body)
55
+ Detach a subscriber from a notification type.
56
+ """
57
+
58
+ def __init__(
59
+ self,
60
+ view_server: str,
61
+ platform_url: str,
62
+ user_id: str,
63
+ user_pwd: Optional[str] = None,
64
+ token: Optional[str] = None,
65
+ ):
66
+ self.view_server = view_server
67
+ self.platform_url = platform_url
68
+ self.user_id = user_id
69
+ self.user_pwd = user_pwd
70
+ self.notification_manager_command_root: str = (
71
+ f"{self.platform_url}/servers/{self.view_server}/api/open-metadata/notification-manager"
72
+ )
73
+ ServerClient.__init__(self, view_server, platform_url, user_id, user_pwd, token)
74
+
75
+ def _prepare_body(self, body: Optional[dict | NewRelationshipRequestBody | DeleteRelationshipRequestBody]) -> dict:
76
+ """Convert Pydantic models to dict and slim the body."""
77
+ if body is None:
78
+ return {}
79
+ if isinstance(body, dict):
80
+ return body_slimmer(body)
81
+ # It's a Pydantic model
82
+ return body_slimmer(body.model_dump(mode='json', by_alias=True, exclude_none=True))
83
+
84
+ #
85
+ # Monitored Resource Management
86
+ #
87
+
88
+ @dynamic_catch
89
+ async def _async_link_monitored_resource(
90
+ self,
91
+ notification_type_guid: str,
92
+ monitored_resource_guid: str,
93
+ body: Optional[dict | NewRelationshipRequestBody] = None,
94
+ ) -> None:
95
+ """Attach a monitored resource to a notification type. Async version.
96
+
97
+ Parameters
98
+ ----------
99
+ notification_type_guid : str
100
+ The GUID of the notification type.
101
+ monitored_resource_guid : str
102
+ The GUID of the monitored resource.
103
+ body : dict | NewRelationshipRequestBody, optional
104
+ Request body containing relationship properties.
105
+
106
+ Returns
107
+ -------
108
+ None
109
+
110
+ Raises
111
+ ------
112
+ PyegeriaException
113
+ If there are issues in communications, message format, or Egeria errors.
114
+ ValidationError
115
+ If the body does not conform to NewRelationshipRequestBody.
116
+ PyegeriaNotAuthorizedException
117
+ If the user is not authorized for the requested action.
118
+ """
119
+ url = (
120
+ f"{self.notification_manager_command_root}/notification-types/"
121
+ f"{notification_type_guid}/monitored-resources/{monitored_resource_guid}/attach"
122
+ )
123
+ await self._async_make_request("POST", url, self._prepare_body(body))
124
+
125
+ def link_monitored_resource(
126
+ self,
127
+ notification_type_guid: str,
128
+ monitored_resource_guid: str,
129
+ body: Optional[dict | NewRelationshipRequestBody] = None,
130
+ ) -> None:
131
+ """Attach a monitored resource to a notification type. Sync version.
132
+
133
+ Parameters
134
+ ----------
135
+ notification_type_guid : str
136
+ The GUID of the notification type.
137
+ monitored_resource_guid : str
138
+ The GUID of the monitored resource.
139
+ body : dict | NewRelationshipRequestBody, optional
140
+ Request body containing relationship properties.
141
+
142
+ Returns
143
+ -------
144
+ None
145
+
146
+ Raises
147
+ ------
148
+ PyegeriaException
149
+ If there are issues in communications, message format, or Egeria errors.
150
+ """
151
+ loop = asyncio.get_event_loop()
152
+ loop.run_until_complete(
153
+ self._async_link_monitored_resource(
154
+ notification_type_guid, monitored_resource_guid, body
155
+ )
156
+ )
157
+
158
+ @dynamic_catch
159
+ async def _async_detach_monitored_resource(
160
+ self,
161
+ notification_type_guid: str,
162
+ monitored_resource_guid: str,
163
+ body: Optional[dict | DeleteRelationshipRequestBody] = None,
164
+ ) -> None:
165
+ """Detach a monitored resource from a notification type. Async version.
166
+
167
+ Parameters
168
+ ----------
169
+ notification_type_guid : str
170
+ The GUID of the notification type.
171
+ monitored_resource_guid : str
172
+ The GUID of the monitored resource to detach.
173
+ body : dict | DeleteRelationshipRequestBody, optional
174
+ Request body for deletion.
175
+
176
+ Returns
177
+ -------
178
+ None
179
+
180
+ Raises
181
+ ------
182
+ PyegeriaException
183
+ If there are issues in communications, message format, or Egeria errors.
184
+ """
185
+ url = (
186
+ f"{self.notification_manager_command_root}/notification-types/"
187
+ f"{notification_type_guid}/monitored-resources/{monitored_resource_guid}/detach"
188
+ )
189
+ await self._async_make_request("POST", url, self._prepare_body(body))
190
+
191
+ def detach_monitored_resource(
192
+ self,
193
+ notification_type_guid: str,
194
+ monitored_resource_guid: str,
195
+ body: Optional[dict | DeleteRelationshipRequestBody] = None,
196
+ ) -> None:
197
+ """Detach a monitored resource from a notification type. Sync version.
198
+
199
+ Parameters
200
+ ----------
201
+ notification_type_guid : str
202
+ The GUID of the notification type.
203
+ monitored_resource_guid : str
204
+ The GUID of the monitored resource to detach.
205
+ body : dict | DeleteRelationshipRequestBody, optional
206
+ Request body for deletion.
207
+
208
+ Returns
209
+ -------
210
+ None
211
+
212
+ Raises
213
+ ------
214
+ PyegeriaException
215
+ If there are issues in communications, message format, or Egeria errors.
216
+ """
217
+ loop = asyncio.get_event_loop()
218
+ loop.run_until_complete(
219
+ self._async_detach_monitored_resource(
220
+ notification_type_guid, monitored_resource_guid, body
221
+ )
222
+ )
223
+
224
+ #
225
+ # Notification Subscriber Management
226
+ #
227
+
228
+ @dynamic_catch
229
+ async def _async_link_notification_subscriber(
230
+ self,
231
+ notification_type_guid: str,
232
+ subscriber_guid: str,
233
+ body: Optional[dict | NewRelationshipRequestBody] = None,
234
+ ) -> None:
235
+ """Attach a subscriber to a notification type. Async version.
236
+
237
+ Parameters
238
+ ----------
239
+ notification_type_guid : str
240
+ The GUID of the notification type.
241
+ subscriber_guid : str
242
+ The GUID of the subscriber.
243
+ body : dict | NewRelationshipRequestBody, optional
244
+ Request body containing relationship properties.
245
+
246
+ Returns
247
+ -------
248
+ None
249
+
250
+ Raises
251
+ ------
252
+ PyegeriaException
253
+ If there are issues in communications, message format, or Egeria errors.
254
+ """
255
+ url = (
256
+ f"{self.notification_manager_command_root}/notification-types/"
257
+ f"{notification_type_guid}/notification-subscribers/{subscriber_guid}/attach"
258
+ )
259
+ await self._async_make_request("POST", url, self._prepare_body(body))
260
+
261
+ def link_notification_subscriber(
262
+ self,
263
+ notification_type_guid: str,
264
+ subscriber_guid: str,
265
+ body: Optional[dict | NewRelationshipRequestBody] = None,
266
+ ) -> None:
267
+ """Attach a subscriber to a notification type. Sync version.
268
+
269
+ Parameters
270
+ ----------
271
+ notification_type_guid : str
272
+ The GUID of the notification type.
273
+ subscriber_guid : str
274
+ The GUID of the subscriber.
275
+ body : dict | NewRelationshipRequestBody, optional
276
+ Request body containing relationship properties.
277
+
278
+ Returns
279
+ -------
280
+ None
281
+
282
+ Raises
283
+ ------
284
+ PyegeriaException
285
+ If there are issues in communications, message format, or Egeria errors.
286
+ """
287
+ loop = asyncio.get_event_loop()
288
+ loop.run_until_complete(
289
+ self._async_link_notification_subscriber(
290
+ notification_type_guid, subscriber_guid, body
291
+ )
292
+ )
293
+
294
+ @dynamic_catch
295
+ async def _async_detach_notification_subscriber(
296
+ self,
297
+ notification_type_guid: str,
298
+ subscriber_guid: str,
299
+ body: Optional[dict | DeleteRelationshipRequestBody] = None,
300
+ ) -> None:
301
+ """Detach a subscriber from a notification type. Async version.
302
+
303
+ Parameters
304
+ ----------
305
+ notification_type_guid : str
306
+ The GUID of the notification type.
307
+ subscriber_guid : str
308
+ The GUID of the subscriber to detach.
309
+ body : dict | DeleteRelationshipRequestBody, optional
310
+ Request body for deletion.
311
+
312
+ Returns
313
+ -------
314
+ None
315
+
316
+ Raises
317
+ ------
318
+ PyegeriaException
319
+ If there are issues in communications, message format, or Egeria errors.
320
+ """
321
+ url = (
322
+ f"{self.notification_manager_command_root}/notification-types/"
323
+ f"{notification_type_guid}/notification-subscribers/{subscriber_guid}/detach"
324
+ )
325
+ await self._async_make_request("POST", url, self._prepare_body(body))
326
+
327
+ def detach_notification_subscriber(
328
+ self,
329
+ notification_type_guid: str,
330
+ subscriber_guid: str,
331
+ body: Optional[dict | DeleteRelationshipRequestBody] = None,
332
+ ) -> None:
333
+ """Detach a subscriber from a notification type. Sync version.
334
+
335
+ Parameters
336
+ ----------
337
+ notification_type_guid : str
338
+ The GUID of the notification type.
339
+ subscriber_guid : str
340
+ The GUID of the subscriber to detach.
341
+ body : dict | DeleteRelationshipRequestBody, optional
342
+ Request body for deletion.
343
+
344
+ Returns
345
+ -------
346
+ None
347
+
348
+ Raises
349
+ ------
350
+ PyegeriaException
351
+ If there are issues in communications, message format, or Egeria errors.
352
+ """
353
+ loop = asyncio.get_event_loop()
354
+ loop.run_until_complete(
355
+ self._async_detach_notification_subscriber(
356
+ notification_type_guid, subscriber_guid, body
357
+ )
358
+ )