semantic-link-labs 0.12.8__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.
Files changed (243) hide show
  1. semantic_link_labs-0.12.8.dist-info/METADATA +354 -0
  2. semantic_link_labs-0.12.8.dist-info/RECORD +243 -0
  3. semantic_link_labs-0.12.8.dist-info/WHEEL +5 -0
  4. semantic_link_labs-0.12.8.dist-info/licenses/LICENSE +21 -0
  5. semantic_link_labs-0.12.8.dist-info/top_level.txt +1 -0
  6. sempy_labs/__init__.py +606 -0
  7. sempy_labs/_a_lib_info.py +2 -0
  8. sempy_labs/_ai.py +437 -0
  9. sempy_labs/_authentication.py +264 -0
  10. sempy_labs/_bpa_translation/_model/_translations_am-ET.po +869 -0
  11. sempy_labs/_bpa_translation/_model/_translations_ar-AE.po +908 -0
  12. sempy_labs/_bpa_translation/_model/_translations_bg-BG.po +968 -0
  13. sempy_labs/_bpa_translation/_model/_translations_ca-ES.po +963 -0
  14. sempy_labs/_bpa_translation/_model/_translations_cs-CZ.po +943 -0
  15. sempy_labs/_bpa_translation/_model/_translations_da-DK.po +945 -0
  16. sempy_labs/_bpa_translation/_model/_translations_de-DE.po +988 -0
  17. sempy_labs/_bpa_translation/_model/_translations_el-GR.po +993 -0
  18. sempy_labs/_bpa_translation/_model/_translations_es-ES.po +971 -0
  19. sempy_labs/_bpa_translation/_model/_translations_fa-IR.po +933 -0
  20. sempy_labs/_bpa_translation/_model/_translations_fi-FI.po +942 -0
  21. sempy_labs/_bpa_translation/_model/_translations_fr-FR.po +994 -0
  22. sempy_labs/_bpa_translation/_model/_translations_ga-IE.po +967 -0
  23. sempy_labs/_bpa_translation/_model/_translations_he-IL.po +902 -0
  24. sempy_labs/_bpa_translation/_model/_translations_hi-IN.po +944 -0
  25. sempy_labs/_bpa_translation/_model/_translations_hu-HU.po +963 -0
  26. sempy_labs/_bpa_translation/_model/_translations_id-ID.po +946 -0
  27. sempy_labs/_bpa_translation/_model/_translations_is-IS.po +939 -0
  28. sempy_labs/_bpa_translation/_model/_translations_it-IT.po +986 -0
  29. sempy_labs/_bpa_translation/_model/_translations_ja-JP.po +846 -0
  30. sempy_labs/_bpa_translation/_model/_translations_ko-KR.po +839 -0
  31. sempy_labs/_bpa_translation/_model/_translations_mt-MT.po +967 -0
  32. sempy_labs/_bpa_translation/_model/_translations_nl-NL.po +978 -0
  33. sempy_labs/_bpa_translation/_model/_translations_pl-PL.po +962 -0
  34. sempy_labs/_bpa_translation/_model/_translations_pt-BR.po +962 -0
  35. sempy_labs/_bpa_translation/_model/_translations_pt-PT.po +957 -0
  36. sempy_labs/_bpa_translation/_model/_translations_ro-RO.po +968 -0
  37. sempy_labs/_bpa_translation/_model/_translations_ru-RU.po +964 -0
  38. sempy_labs/_bpa_translation/_model/_translations_sk-SK.po +952 -0
  39. sempy_labs/_bpa_translation/_model/_translations_sl-SL.po +950 -0
  40. sempy_labs/_bpa_translation/_model/_translations_sv-SE.po +942 -0
  41. sempy_labs/_bpa_translation/_model/_translations_ta-IN.po +976 -0
  42. sempy_labs/_bpa_translation/_model/_translations_te-IN.po +947 -0
  43. sempy_labs/_bpa_translation/_model/_translations_th-TH.po +924 -0
  44. sempy_labs/_bpa_translation/_model/_translations_tr-TR.po +953 -0
  45. sempy_labs/_bpa_translation/_model/_translations_uk-UA.po +961 -0
  46. sempy_labs/_bpa_translation/_model/_translations_zh-CN.po +804 -0
  47. sempy_labs/_bpa_translation/_model/_translations_zu-ZA.po +969 -0
  48. sempy_labs/_capacities.py +1198 -0
  49. sempy_labs/_capacity_migration.py +660 -0
  50. sempy_labs/_clear_cache.py +351 -0
  51. sempy_labs/_connections.py +610 -0
  52. sempy_labs/_dashboards.py +69 -0
  53. sempy_labs/_data_access_security.py +98 -0
  54. sempy_labs/_data_pipelines.py +162 -0
  55. sempy_labs/_dataflows.py +668 -0
  56. sempy_labs/_dax.py +501 -0
  57. sempy_labs/_daxformatter.py +80 -0
  58. sempy_labs/_delta_analyzer.py +467 -0
  59. sempy_labs/_delta_analyzer_history.py +301 -0
  60. sempy_labs/_dictionary_diffs.py +221 -0
  61. sempy_labs/_documentation.py +147 -0
  62. sempy_labs/_domains.py +51 -0
  63. sempy_labs/_eventhouses.py +182 -0
  64. sempy_labs/_external_data_shares.py +230 -0
  65. sempy_labs/_gateways.py +521 -0
  66. sempy_labs/_generate_semantic_model.py +521 -0
  67. sempy_labs/_get_connection_string.py +84 -0
  68. sempy_labs/_git.py +543 -0
  69. sempy_labs/_graphQL.py +90 -0
  70. sempy_labs/_helper_functions.py +2833 -0
  71. sempy_labs/_icons.py +149 -0
  72. sempy_labs/_job_scheduler.py +609 -0
  73. sempy_labs/_kql_databases.py +149 -0
  74. sempy_labs/_kql_querysets.py +124 -0
  75. sempy_labs/_kusto.py +137 -0
  76. sempy_labs/_labels.py +124 -0
  77. sempy_labs/_list_functions.py +1720 -0
  78. sempy_labs/_managed_private_endpoints.py +253 -0
  79. sempy_labs/_mirrored_databases.py +416 -0
  80. sempy_labs/_mirrored_warehouses.py +60 -0
  81. sempy_labs/_ml_experiments.py +113 -0
  82. sempy_labs/_model_auto_build.py +140 -0
  83. sempy_labs/_model_bpa.py +557 -0
  84. sempy_labs/_model_bpa_bulk.py +378 -0
  85. sempy_labs/_model_bpa_rules.py +859 -0
  86. sempy_labs/_model_dependencies.py +343 -0
  87. sempy_labs/_mounted_data_factories.py +123 -0
  88. sempy_labs/_notebooks.py +441 -0
  89. sempy_labs/_one_lake_integration.py +151 -0
  90. sempy_labs/_onelake.py +131 -0
  91. sempy_labs/_query_scale_out.py +433 -0
  92. sempy_labs/_refresh_semantic_model.py +435 -0
  93. sempy_labs/_semantic_models.py +468 -0
  94. sempy_labs/_spark.py +455 -0
  95. sempy_labs/_sql.py +241 -0
  96. sempy_labs/_sql_audit_settings.py +207 -0
  97. sempy_labs/_sql_endpoints.py +214 -0
  98. sempy_labs/_tags.py +201 -0
  99. sempy_labs/_translations.py +43 -0
  100. sempy_labs/_user_delegation_key.py +44 -0
  101. sempy_labs/_utils.py +79 -0
  102. sempy_labs/_vertipaq.py +1021 -0
  103. sempy_labs/_vpax.py +388 -0
  104. sempy_labs/_warehouses.py +234 -0
  105. sempy_labs/_workloads.py +140 -0
  106. sempy_labs/_workspace_identity.py +72 -0
  107. sempy_labs/_workspaces.py +595 -0
  108. sempy_labs/admin/__init__.py +170 -0
  109. sempy_labs/admin/_activities.py +167 -0
  110. sempy_labs/admin/_apps.py +145 -0
  111. sempy_labs/admin/_artifacts.py +65 -0
  112. sempy_labs/admin/_basic_functions.py +463 -0
  113. sempy_labs/admin/_capacities.py +508 -0
  114. sempy_labs/admin/_dataflows.py +45 -0
  115. sempy_labs/admin/_datasets.py +186 -0
  116. sempy_labs/admin/_domains.py +522 -0
  117. sempy_labs/admin/_external_data_share.py +100 -0
  118. sempy_labs/admin/_git.py +72 -0
  119. sempy_labs/admin/_items.py +265 -0
  120. sempy_labs/admin/_labels.py +211 -0
  121. sempy_labs/admin/_reports.py +241 -0
  122. sempy_labs/admin/_scanner.py +118 -0
  123. sempy_labs/admin/_shared.py +82 -0
  124. sempy_labs/admin/_sharing_links.py +110 -0
  125. sempy_labs/admin/_tags.py +131 -0
  126. sempy_labs/admin/_tenant.py +503 -0
  127. sempy_labs/admin/_tenant_keys.py +89 -0
  128. sempy_labs/admin/_users.py +140 -0
  129. sempy_labs/admin/_workspaces.py +236 -0
  130. sempy_labs/deployment_pipeline/__init__.py +23 -0
  131. sempy_labs/deployment_pipeline/_items.py +580 -0
  132. sempy_labs/directlake/__init__.py +57 -0
  133. sempy_labs/directlake/_autosync.py +58 -0
  134. sempy_labs/directlake/_directlake_schema_compare.py +120 -0
  135. sempy_labs/directlake/_directlake_schema_sync.py +161 -0
  136. sempy_labs/directlake/_dl_helper.py +274 -0
  137. sempy_labs/directlake/_generate_shared_expression.py +94 -0
  138. sempy_labs/directlake/_get_directlake_lakehouse.py +62 -0
  139. sempy_labs/directlake/_get_shared_expression.py +34 -0
  140. sempy_labs/directlake/_guardrails.py +96 -0
  141. sempy_labs/directlake/_list_directlake_model_calc_tables.py +70 -0
  142. sempy_labs/directlake/_show_unsupported_directlake_objects.py +90 -0
  143. sempy_labs/directlake/_update_directlake_model_lakehouse_connection.py +239 -0
  144. sempy_labs/directlake/_update_directlake_partition_entity.py +259 -0
  145. sempy_labs/directlake/_warm_cache.py +236 -0
  146. sempy_labs/dotnet_lib/dotnet.runtime.config.json +10 -0
  147. sempy_labs/environment/__init__.py +23 -0
  148. sempy_labs/environment/_items.py +212 -0
  149. sempy_labs/environment/_pubstage.py +223 -0
  150. sempy_labs/eventstream/__init__.py +37 -0
  151. sempy_labs/eventstream/_items.py +263 -0
  152. sempy_labs/eventstream/_topology.py +652 -0
  153. sempy_labs/graph/__init__.py +59 -0
  154. sempy_labs/graph/_groups.py +651 -0
  155. sempy_labs/graph/_sensitivity_labels.py +120 -0
  156. sempy_labs/graph/_teams.py +125 -0
  157. sempy_labs/graph/_user_licenses.py +96 -0
  158. sempy_labs/graph/_users.py +516 -0
  159. sempy_labs/graph_model/__init__.py +15 -0
  160. sempy_labs/graph_model/_background_jobs.py +63 -0
  161. sempy_labs/graph_model/_items.py +149 -0
  162. sempy_labs/lakehouse/__init__.py +67 -0
  163. sempy_labs/lakehouse/_blobs.py +247 -0
  164. sempy_labs/lakehouse/_get_lakehouse_columns.py +102 -0
  165. sempy_labs/lakehouse/_get_lakehouse_tables.py +274 -0
  166. sempy_labs/lakehouse/_helper.py +250 -0
  167. sempy_labs/lakehouse/_lakehouse.py +351 -0
  168. sempy_labs/lakehouse/_livy_sessions.py +143 -0
  169. sempy_labs/lakehouse/_materialized_lake_views.py +157 -0
  170. sempy_labs/lakehouse/_partitioning.py +165 -0
  171. sempy_labs/lakehouse/_schemas.py +217 -0
  172. sempy_labs/lakehouse/_shortcuts.py +440 -0
  173. sempy_labs/migration/__init__.py +35 -0
  174. sempy_labs/migration/_create_pqt_file.py +238 -0
  175. sempy_labs/migration/_direct_lake_to_import.py +105 -0
  176. sempy_labs/migration/_migrate_calctables_to_lakehouse.py +398 -0
  177. sempy_labs/migration/_migrate_calctables_to_semantic_model.py +148 -0
  178. sempy_labs/migration/_migrate_model_objects_to_semantic_model.py +533 -0
  179. sempy_labs/migration/_migrate_tables_columns_to_semantic_model.py +172 -0
  180. sempy_labs/migration/_migration_validation.py +71 -0
  181. sempy_labs/migration/_refresh_calc_tables.py +131 -0
  182. sempy_labs/mirrored_azure_databricks_catalog/__init__.py +15 -0
  183. sempy_labs/mirrored_azure_databricks_catalog/_discover.py +213 -0
  184. sempy_labs/mirrored_azure_databricks_catalog/_refresh_catalog_metadata.py +45 -0
  185. sempy_labs/ml_model/__init__.py +23 -0
  186. sempy_labs/ml_model/_functions.py +427 -0
  187. sempy_labs/report/_BPAReportTemplate.json +232 -0
  188. sempy_labs/report/__init__.py +55 -0
  189. sempy_labs/report/_bpareporttemplate/.pbi/localSettings.json +9 -0
  190. sempy_labs/report/_bpareporttemplate/.platform +11 -0
  191. sempy_labs/report/_bpareporttemplate/StaticResources/SharedResources/BaseThemes/CY24SU06.json +710 -0
  192. sempy_labs/report/_bpareporttemplate/definition/pages/01d72098bda5055bd500/page.json +11 -0
  193. sempy_labs/report/_bpareporttemplate/definition/pages/01d72098bda5055bd500/visuals/1b08bce3bebabb0a27a8/visual.json +191 -0
  194. sempy_labs/report/_bpareporttemplate/definition/pages/01d72098bda5055bd500/visuals/2f22ddb70c301693c165/visual.json +438 -0
  195. sempy_labs/report/_bpareporttemplate/definition/pages/01d72098bda5055bd500/visuals/3b1182230aa6c600b43a/visual.json +127 -0
  196. sempy_labs/report/_bpareporttemplate/definition/pages/01d72098bda5055bd500/visuals/58577ba6380c69891500/visual.json +576 -0
  197. sempy_labs/report/_bpareporttemplate/definition/pages/01d72098bda5055bd500/visuals/a2a8fa5028b3b776c96c/visual.json +207 -0
  198. sempy_labs/report/_bpareporttemplate/definition/pages/01d72098bda5055bd500/visuals/adfd47ef30652707b987/visual.json +506 -0
  199. sempy_labs/report/_bpareporttemplate/definition/pages/01d72098bda5055bd500/visuals/b6a80ee459e716e170b1/visual.json +127 -0
  200. sempy_labs/report/_bpareporttemplate/definition/pages/01d72098bda5055bd500/visuals/ce3130a721c020cc3d81/visual.json +513 -0
  201. sempy_labs/report/_bpareporttemplate/definition/pages/92735ae19b31712208ad/page.json +8 -0
  202. sempy_labs/report/_bpareporttemplate/definition/pages/92735ae19b31712208ad/visuals/66e60dfb526437cd78d1/visual.json +112 -0
  203. sempy_labs/report/_bpareporttemplate/definition/pages/c597da16dc7e63222a82/page.json +11 -0
  204. sempy_labs/report/_bpareporttemplate/definition/pages/c597da16dc7e63222a82/visuals/07deb8bce824e1be37d7/visual.json +513 -0
  205. sempy_labs/report/_bpareporttemplate/definition/pages/c597da16dc7e63222a82/visuals/0b1c68838818b32ad03b/visual.json +352 -0
  206. sempy_labs/report/_bpareporttemplate/definition/pages/c597da16dc7e63222a82/visuals/0c171de9d2683d10b930/visual.json +37 -0
  207. sempy_labs/report/_bpareporttemplate/definition/pages/c597da16dc7e63222a82/visuals/0efa01be0510e40a645e/visual.json +542 -0
  208. sempy_labs/report/_bpareporttemplate/definition/pages/c597da16dc7e63222a82/visuals/6bf2f0eb830ab53cc668/visual.json +221 -0
  209. sempy_labs/report/_bpareporttemplate/definition/pages/c597da16dc7e63222a82/visuals/88d8141cb8500b60030c/visual.json +127 -0
  210. sempy_labs/report/_bpareporttemplate/definition/pages/c597da16dc7e63222a82/visuals/a753273590beed656a03/visual.json +576 -0
  211. sempy_labs/report/_bpareporttemplate/definition/pages/c597da16dc7e63222a82/visuals/b8fdc82cddd61ac447bc/visual.json +127 -0
  212. sempy_labs/report/_bpareporttemplate/definition/pages/d37dce724a0ccc30044b/page.json +9 -0
  213. sempy_labs/report/_bpareporttemplate/definition/pages/d37dce724a0ccc30044b/visuals/ce8532a7e25020271077/visual.json +38 -0
  214. sempy_labs/report/_bpareporttemplate/definition/pages/pages.json +10 -0
  215. sempy_labs/report/_bpareporttemplate/definition/report.json +176 -0
  216. sempy_labs/report/_bpareporttemplate/definition/version.json +4 -0
  217. sempy_labs/report/_bpareporttemplate/definition.pbir +14 -0
  218. sempy_labs/report/_download_report.py +76 -0
  219. sempy_labs/report/_export_report.py +257 -0
  220. sempy_labs/report/_generate_report.py +427 -0
  221. sempy_labs/report/_paginated.py +76 -0
  222. sempy_labs/report/_report_bpa.py +354 -0
  223. sempy_labs/report/_report_bpa_rules.py +115 -0
  224. sempy_labs/report/_report_functions.py +581 -0
  225. sempy_labs/report/_report_helper.py +227 -0
  226. sempy_labs/report/_report_list_functions.py +110 -0
  227. sempy_labs/report/_report_rebind.py +149 -0
  228. sempy_labs/report/_reportwrapper.py +3100 -0
  229. sempy_labs/report/_save_report.py +147 -0
  230. sempy_labs/snowflake_database/__init__.py +10 -0
  231. sempy_labs/snowflake_database/_items.py +105 -0
  232. sempy_labs/sql_database/__init__.py +21 -0
  233. sempy_labs/sql_database/_items.py +201 -0
  234. sempy_labs/sql_database/_mirroring.py +79 -0
  235. sempy_labs/theme/__init__.py +12 -0
  236. sempy_labs/theme/_org_themes.py +129 -0
  237. sempy_labs/tom/__init__.py +3 -0
  238. sempy_labs/tom/_model.py +5977 -0
  239. sempy_labs/variable_library/__init__.py +19 -0
  240. sempy_labs/variable_library/_functions.py +403 -0
  241. sempy_labs/warehouse/__init__.py +28 -0
  242. sempy_labs/warehouse/_items.py +234 -0
  243. sempy_labs/warehouse/_restore_points.py +309 -0
@@ -0,0 +1,595 @@
1
+ import pandas as pd
2
+ import sempy_labs._icons as icons
3
+ from typing import Optional, Literal
4
+ from sempy_labs._helper_functions import (
5
+ resolve_workspace_id,
6
+ resolve_workspace_name_and_id,
7
+ resolve_capacity_id,
8
+ _base_api,
9
+ _create_dataframe,
10
+ )
11
+ from uuid import UUID
12
+ from sempy._utils._log import log
13
+
14
+
15
+ @log
16
+ def delete_user_from_workspace(
17
+ email_address: str, workspace: Optional[str | UUID] = None
18
+ ):
19
+ """
20
+ Removes a user from a workspace.
21
+
22
+ This is a wrapper function for the following API: `Groups - Delete User In Group <https://learn.microsoft.com/rest/api/power-bi/groups/delete-user-in-group>`_.
23
+
24
+ Service Principal Authentication is supported (see `here <https://github.com/microsoft/semantic-link-labs/blob/main/notebooks/Service%20Principal.ipynb>`_ for examples).
25
+
26
+ Parameters
27
+ ----------
28
+ email_address : str
29
+ The email address of the user.
30
+ workspace : str | uuid.UUID, default=None
31
+ The name or ID of the workspace.
32
+ Defaults to None which resolves to the workspace of the attached lakehouse
33
+ or if no lakehouse attached, resolves to the workspace of the notebook.
34
+ """
35
+
36
+ (workspace_name, workspace_id) = resolve_workspace_name_and_id(workspace)
37
+
38
+ _base_api(
39
+ request=f"/v1.0/myorg/groups/{workspace_id}/users/{email_address}",
40
+ method="delete",
41
+ client="fabric_sp",
42
+ )
43
+ print(
44
+ f"{icons.green_dot} The '{email_address}' user has been removed from accessing the '{workspace_name}' workspace."
45
+ )
46
+
47
+
48
+ @log
49
+ def update_workspace_user(
50
+ email_address: str,
51
+ role_name: str,
52
+ principal_type: Optional[str] = "User",
53
+ workspace: Optional[str | UUID] = None,
54
+ ):
55
+ """
56
+ Updates a user's role within a workspace.
57
+
58
+ This is a wrapper function for the following API: `Groups - Update Group User <https://learn.microsoft.com/rest/api/power-bi/groups/update-group-user>`_.
59
+
60
+ Service Principal Authentication is supported (see `here <https://github.com/microsoft/semantic-link-labs/blob/main/notebooks/Service%20Principal.ipynb>`_ for examples).
61
+
62
+ Parameters
63
+ ----------
64
+ email_address : str
65
+ The email address of the user.
66
+ role_name : str
67
+ The `role <https://learn.microsoft.com/rest/api/power-bi/groups/add-group-user#groupuseraccessright>`_ of the user within the workspace.
68
+ principal_type : str, default='User'
69
+ The `principal type <https://learn.microsoft.com/rest/api/power-bi/groups/add-group-user#principaltype>`_.
70
+ workspace : str | uuid.UUID, default=None
71
+ The name or ID of the workspace.
72
+ Defaults to None which resolves to the workspace of the attached lakehouse
73
+ or if no lakehouse attached, resolves to the workspace of the notebook.
74
+ """
75
+
76
+ (workspace_name, workspace_id) = resolve_workspace_name_and_id(workspace)
77
+
78
+ role_names = icons.workspace_roles
79
+ role_name = role_name.capitalize()
80
+ if role_name not in role_names:
81
+ raise ValueError(
82
+ f"{icons.red_dot} Invalid role. The 'role_name' parameter must be one of the following: {role_names}."
83
+ )
84
+ principal_types = icons.principal_types
85
+ principal_type = principal_type.capitalize()
86
+ if principal_type not in principal_types:
87
+ raise ValueError(
88
+ f"{icons.red_dot} Invalid princpal type. Valid options: {principal_types}."
89
+ )
90
+
91
+ payload = {
92
+ "emailAddress": email_address,
93
+ "groupUserAccessRight": role_name,
94
+ "principalType": principal_type,
95
+ "identifier": email_address,
96
+ }
97
+
98
+ _base_api(
99
+ request=f"/v1.0/myorg/groups/{workspace_id}/users",
100
+ method="put",
101
+ payload=payload,
102
+ client="fabric_sp",
103
+ )
104
+ print(
105
+ f"{icons.green_dot} The '{email_address}' user has been updated to a '{role_name}' within the '{workspace_name}' workspace."
106
+ )
107
+
108
+
109
+ @log
110
+ def list_workspace_users(workspace: Optional[str | UUID] = None) -> pd.DataFrame:
111
+ """
112
+ A list of all the users of a workspace and their roles.
113
+
114
+ This is a wrapper function for the following API: `Workspaces - List Workspace Role Assignments <https://learn.microsoft.com/rest/api/fabric/core/workspaces/list-workspace-role-assignments>`_.
115
+
116
+ Service Principal Authentication is supported (see `here <https://github.com/microsoft/semantic-link-labs/blob/main/notebooks/Service%20Principal.ipynb>`_ for examples).
117
+
118
+ Parameters
119
+ ----------
120
+ workspace : str | uuid.UUID, default=None
121
+ The name or ID of the workspace.
122
+ Defaults to None which resolves to the workspace of the attached lakehouse
123
+ or if no lakehouse attached, resolves to the workspace of the notebook.
124
+
125
+ Returns
126
+ -------
127
+ pandas.DataFrame
128
+ A pandas dataframe the users of a workspace and their properties.
129
+ """
130
+
131
+ workspace_id = resolve_workspace_id(workspace)
132
+
133
+ columns = {
134
+ "User Name": "string",
135
+ "Email Address": "string",
136
+ "Role": "string",
137
+ "Type": "string",
138
+ "User ID": "string",
139
+ }
140
+ df = _create_dataframe(columns=columns)
141
+
142
+ responses = _base_api(
143
+ request=f"v1/workspaces/{workspace_id}/roleAssignments",
144
+ uses_pagination=True,
145
+ client="fabric_sp",
146
+ )
147
+
148
+ rows = []
149
+ for r in responses:
150
+ for v in r.get("value", []):
151
+ p = v.get("principal", {})
152
+ rows.append(
153
+ {
154
+ "User Name": p.get("displayName"),
155
+ "User ID": p.get("id"),
156
+ "Type": p.get("type"),
157
+ "Role": v.get("role"),
158
+ "Email Address": p.get("userDetails", {}).get("userPrincipalName"),
159
+ }
160
+ )
161
+
162
+ if rows:
163
+ df = pd.DataFrame(rows, columns=list(columns.keys()))
164
+
165
+ return df
166
+
167
+
168
+ @log
169
+ def add_user_to_workspace(
170
+ email_address: str,
171
+ role_name: str,
172
+ principal_type: Optional[str] = "User",
173
+ workspace: Optional[str | UUID] = None,
174
+ ):
175
+ """
176
+ Adds a user to a workspace.
177
+
178
+ This is a wrapper function for the following API: `Groups - Add Group User <https://learn.microsoft.com/rest/api/power-bi/groups/add-group-user>`_.
179
+
180
+ Service Principal Authentication is supported (see `here <https://github.com/microsoft/semantic-link-labs/blob/main/notebooks/Service%20Principal.ipynb>`_ for examples).
181
+
182
+ Parameters
183
+ ----------
184
+ email_address : str
185
+ The email address of the user. Also accepts the user identifier.
186
+ role_name : str
187
+ The `role <https://learn.microsoft.com/rest/api/power-bi/groups/add-group-user#groupuseraccessright>`_ of the user within the workspace.
188
+ principal_type : str, default='User'
189
+ The `principal type <https://learn.microsoft.com/rest/api/power-bi/groups/add-group-user#principaltype>`_.
190
+ workspace : str | uuid.UUID, default=None
191
+ The name or ID of the workspace.
192
+ Defaults to None which resolves to the workspace of the attached lakehouse
193
+ or if no lakehouse attached, resolves to the workspace of the notebook.
194
+ """
195
+
196
+ (workspace_name, workspace_id) = resolve_workspace_name_and_id(workspace)
197
+
198
+ role_names = icons.workspace_roles
199
+ role_name = role_name.capitalize()
200
+ if role_name not in role_names:
201
+ raise ValueError(
202
+ f"{icons.red_dot} Invalid role. The 'role_name' parameter must be one of the following: {role_names}."
203
+ )
204
+ plural = "n" if role_name == "Admin" else ""
205
+ principal_types = icons.principal_types
206
+ principal_type = principal_type.capitalize()
207
+ if principal_type not in principal_types:
208
+ raise ValueError(
209
+ f"{icons.red_dot} Invalid princpal type. Valid options: {principal_types}."
210
+ )
211
+
212
+ payload = {
213
+ "emailAddress": email_address,
214
+ "groupUserAccessRight": role_name,
215
+ "principalType": principal_type,
216
+ "identifier": email_address,
217
+ }
218
+
219
+ _base_api(
220
+ request=f"/v1.0/myorg/groups/{workspace_id}/users",
221
+ method="post",
222
+ payload=payload,
223
+ client="fabric_sp",
224
+ )
225
+ print(
226
+ f"{icons.green_dot} The '{email_address}' user has been added as a{plural} '{role_name}' within the '{workspace_name}' workspace."
227
+ )
228
+
229
+
230
+ @log
231
+ def assign_workspace_to_capacity(
232
+ capacity: str | UUID,
233
+ workspace: Optional[str | UUID] = None,
234
+ **kwargs,
235
+ ):
236
+ """
237
+ Assigns a workspace to a capacity.
238
+
239
+ This is a wrapper function for the following API: `Workspaces - Assign To Capacity <https://learn.microsoft.com/rest/api/fabric/core/workspaces/assign-to-capacity>`_.
240
+
241
+ Service Principal Authentication is supported (see `here <https://github.com/microsoft/semantic-link-labs/blob/main/notebooks/Service%20Principal.ipynb>`_ for examples).
242
+
243
+ Parameters
244
+ ----------
245
+ capacity : str | uuid.UUID
246
+ The name or ID of the capacity.
247
+ workspace : str | uuid.UUID, default=None
248
+ The name or ID of the Fabric workspace.
249
+ Defaults to None which resolves to the workspace of the attached lakehouse
250
+ or if no lakehouse attached, resolves to the workspace of the notebook.
251
+ """
252
+
253
+ if "capacity_name" in kwargs:
254
+ capacity = kwargs["capacity_name"]
255
+ print(
256
+ f"{icons.warning} The 'capacity_name' parameter is deprecated. Please use 'capacity' instead."
257
+ )
258
+
259
+ (workspace_name, workspace_id) = resolve_workspace_name_and_id(workspace)
260
+ capacity_id = resolve_capacity_id(capacity=capacity)
261
+
262
+ payload = {"capacityId": capacity_id}
263
+
264
+ _base_api(
265
+ request=f"/v1/workspaces/{workspace_id}/assignToCapacity",
266
+ method="post",
267
+ payload=payload,
268
+ status_codes=[200, 202],
269
+ client="fabric_sp",
270
+ )
271
+ print(
272
+ f"{icons.green_dot} The '{workspace_name}' workspace has been assigned to the '{capacity}' capacity."
273
+ )
274
+
275
+
276
+ @log
277
+ def unassign_workspace_from_capacity(workspace: Optional[str | UUID] = None):
278
+ """
279
+ Unassigns a workspace from its assigned capacity.
280
+
281
+ This is a wrapper function for the following API: `Workspaces - Unassign From Capacity <https://learn.microsoft.com/rest/api/fabric/core/workspaces/unassign-from-capacity>`_.
282
+
283
+ Service Principal Authentication is supported (see `here <https://github.com/microsoft/semantic-link-labs/blob/main/notebooks/Service%20Principal.ipynb>`_ for examples).
284
+
285
+ Parameters
286
+ ----------
287
+ workspace : str | uuid.UUID, default=None
288
+ The name or ID of the Fabric workspace.
289
+ Defaults to None which resolves to the workspace of the attached lakehouse
290
+ or if no lakehouse attached, resolves to the workspace of the notebook.
291
+ """
292
+
293
+ (workspace_name, workspace_id) = resolve_workspace_name_and_id(workspace)
294
+
295
+ _base_api(
296
+ request=f"/v1/workspaces/{workspace_id}/unassignFromCapacity",
297
+ method="post",
298
+ status_codes=[200, 202],
299
+ client="fabric_sp",
300
+ )
301
+ print(
302
+ f"{icons.green_dot} The '{workspace_name}' workspace has been unassigned from its capacity."
303
+ )
304
+
305
+
306
+ @log
307
+ def list_workspace_role_assignments(
308
+ workspace: Optional[str | UUID] = None,
309
+ ) -> pd.DataFrame:
310
+ """
311
+ Shows the members of a given workspace.
312
+
313
+ This is a wrapper function for the following API: `Workspaces - List Workspace Role Assignments <https://learn.microsoft.com/rest/api/fabric/core/workspaces/list-workspace-role-assignments>`_.
314
+
315
+ Service Principal Authentication is supported (see `here <https://github.com/microsoft/semantic-link-labs/blob/main/notebooks/Service%20Principal.ipynb>`_ for examples).
316
+
317
+ Parameters
318
+ ----------
319
+ workspace : str | uuid.UUID, default=None
320
+ The Fabric workspace name or ID.
321
+ Defaults to None which resolves to the workspace of the attached lakehouse
322
+ or if no lakehouse attached, resolves to the workspace of the notebook.
323
+
324
+ Returns
325
+ -------
326
+ pandas.DataFrame
327
+ A pandas dataframe showing the members of a given workspace and their roles.
328
+ """
329
+
330
+ workspace_id = resolve_workspace_id(workspace)
331
+
332
+ columns = {
333
+ "User Name": "string",
334
+ "User Email": "string",
335
+ "Role Name": "string",
336
+ "Type": "string",
337
+ }
338
+ df = _create_dataframe(columns=columns)
339
+
340
+ responses = _base_api(
341
+ request=f"v1/workspaces/{workspace_id}/roleAssignments",
342
+ uses_pagination=True,
343
+ client="fabric_sp",
344
+ )
345
+
346
+ rows = []
347
+ for r in responses:
348
+ for i in r.get("value", []):
349
+ principal = i.get("principal", {})
350
+ rows.append(
351
+ {
352
+ "User Name": principal.get("displayName"),
353
+ "Role Name": i.get("role"),
354
+ "Type": principal.get("type"),
355
+ "User Email": principal.get("userDetails", {}).get(
356
+ "userPrincipalName"
357
+ ),
358
+ }
359
+ )
360
+
361
+ if rows:
362
+ df = pd.DataFrame(rows, columns=list(columns.keys()))
363
+
364
+ return df
365
+
366
+
367
+ @log
368
+ def delete_workspace(workspace: Optional[str | UUID] = None):
369
+ """
370
+ Deletes a workspace.
371
+
372
+ This is a wrapper function for the following API: `Workspaces - Delete Workspace <https://learn.microsoft.com/rest/api/fabric/core/workspaces/delete-workspace>`_.
373
+
374
+ Service Principal Authentication is supported (see `here <https://github.com/microsoft/semantic-link-labs/blob/main/notebooks/Service%20Principal.ipynb>`_ for examples).
375
+
376
+ Parameters
377
+ ----------
378
+ workspace : str | uuid.UUID, default=None
379
+ The Fabric workspace name or ID.
380
+ Defaults to None which resolves to the workspace of the attached lakehouse
381
+ or if no lakehouse attached, resolves to the workspace of the notebook.
382
+ """
383
+
384
+ (workspace_name, workspace_id) = resolve_workspace_name_and_id(workspace)
385
+
386
+ _base_api(
387
+ request=f"v1/workspaces/{workspace_id}", method="delete", client="fabric_sp"
388
+ )
389
+
390
+ print(f"{icons.green_dot} The '{workspace_name}' workspace has been deleted.")
391
+
392
+
393
+ @log
394
+ def get_workspace_network_communication_policy(
395
+ workspace: Optional[str | UUID] = None,
396
+ ) -> pd.DataFrame:
397
+ """
398
+ Returns networking communication policy for the specified workspace. This feature is currently in preview.
399
+
400
+ This is a wrapper function for the following API: `Workspaces - Get Network Communication Policy <https://learn.microsoft.com/rest/api/fabric/core/workspaces/get-network-communication-policy>`_.
401
+
402
+ Service Principal Authentication is supported (see `here <https://github.com/microsoft/semantic-link-labs/blob/main/notebooks/Service%20Principal.ipynb>`_ for examples).
403
+
404
+ Parameters
405
+ ----------
406
+ workspace : str | uuid.UUID, default=None
407
+ The workspace name or ID.
408
+ Defaults to None which resolves to the workspace of the attached lakehouse
409
+ or if no lakehouse attached, resolves to the workspace of the notebook.
410
+
411
+ Returns
412
+ -------
413
+ pandas.DataFrame
414
+ A pandas dataframe showing the networking communication policy for the specified workspace.
415
+ """
416
+
417
+ workspace_id = resolve_workspace_id(workspace)
418
+
419
+ columns = {
420
+ "Inbound Public Access Rules": "string",
421
+ "Outbound Public Access Rules": "string",
422
+ }
423
+
424
+ df = _create_dataframe(columns=columns)
425
+
426
+ data = _base_api(
427
+ request=f"/v1/workspaces/{workspace_id}/networking/communicationPolicy",
428
+ client="fabric_sp",
429
+ ).json()
430
+
431
+ if data:
432
+ df = pd.DataFrame(
433
+ [
434
+ {
435
+ "Inbound Public Access Rules": data.get("inbound", {})
436
+ .get("publicAccessRules", {})
437
+ .get("defaultAction"),
438
+ "Outbound Public Access Rules": data.get("outbound", {})
439
+ .get("publicAccessRules", {})
440
+ .get("defaultAction"),
441
+ }
442
+ ]
443
+ )
444
+
445
+ return df
446
+
447
+
448
+ @log
449
+ def set_workspace_network_communication_policy(
450
+ inbound_policy: Literal["Allow", "Deny"],
451
+ outbound_policy: Literal["Allow", "Deny"],
452
+ workspace: Optional[str | UUID] = None,
453
+ ):
454
+ """
455
+ Sets networking communication policy for the specified workspace. This API uses the PUT method and will overwrite all settings. Remaining policy will be set to default value if only partial policy is provided in the request body. Always run Get Network Communication Policy first and provide full policy in the request body. This feature is currently in preview.
456
+
457
+ This is a wrapper function for the following API: `Workspaces - Set Network Communication Policy <https://learn.microsoft.com/rest/api/fabric/core/workspaces/set-network-communication-policy>`_.
458
+
459
+ Service Principal Authentication is supported (see `here <https://github.com/microsoft/semantic-link-labs/blob/main/notebooks/Service%20Principal.ipynb>`_ for examples).
460
+
461
+ Parameters
462
+ ----------
463
+ inbound_policy : Literal['Allow', 'Deny']
464
+ The policy for all inbound communications to a workspace.
465
+ outbound_policy : Literal['Allow', 'Deny']
466
+ The policy for all outbound communications to a workspace.
467
+ workspace : str | uuid.UUID, default=None
468
+ The workspace name or ID.
469
+ Defaults to None which resolves to the workspace of the attached lakehouse
470
+ or if no lakehouse attached, resolves to the workspace of the notebook.
471
+ """
472
+
473
+ (workspace_name, workspace_id) = resolve_workspace_name_and_id(workspace)
474
+
475
+ inbound_policy = inbound_policy.capitalize()
476
+ outbound_policy = outbound_policy.capitalize()
477
+
478
+ if inbound_policy not in ["Allow", "Deny"]:
479
+ raise ValueError(
480
+ f"{icons.red_dot} The 'inbound_policy' must be either 'Allow' or 'Deny'."
481
+ )
482
+ if outbound_policy not in ["Allow", "Deny"]:
483
+ raise ValueError(
484
+ f"{icons.red_dot} The 'outbound_policy' must be either 'Allow' or 'Deny'."
485
+ )
486
+
487
+ payload = {
488
+ "inbound": {
489
+ "publicAccessRules": {
490
+ "defaultAction": inbound_policy,
491
+ }
492
+ },
493
+ "outbound": {
494
+ "publicAccessRules": {
495
+ "defaultAction": outbound_policy,
496
+ }
497
+ },
498
+ }
499
+ _base_api(
500
+ request=f"/v1/workspaces/{workspace_id}/networking/communicationPolicy",
501
+ client="fabric_sp",
502
+ payload=payload,
503
+ method="put",
504
+ )
505
+
506
+ print(
507
+ f"{icons.green_dot} The networking communication policy has been updated for the '{workspace_name}' workspace."
508
+ )
509
+
510
+
511
+ @log
512
+ def get_workspace_git_outbound_policy(workspace: Optional[str | UUID] = None) -> str:
513
+ """
514
+ Returns Git Outbound policy for the specified workspace.
515
+ In cases the workspace restricts outbound policy, a workspace admin needs to allow the use of Git integration on the specified workspace.
516
+
517
+ This is a wrapper function for the following API: `Workspaces - Get Git Outbound Policy <https://learn.microsoft.com/rest/api/fabric/core/workspaces/get-git-outbound-policy>`_.
518
+
519
+ Service Principal Authentication is supported (see `here <https://github.com/microsoft/semantic-link-labs/blob/main/notebooks/Service%20Principal.ipynb>`_ for examples).
520
+
521
+ Parameters
522
+ ----------
523
+ workspace : str | uuid.UUID, default=None
524
+ The workspace name or ID.
525
+ Defaults to None which resolves to the workspace of the attached lakehouse
526
+ or if no lakehouse attached, resolves to the workspace of the notebook.
527
+
528
+ Returns
529
+ -------
530
+ str
531
+ The Git outbound policy for the specified workspace.
532
+ """
533
+
534
+ workspace_id = resolve_workspace_id(workspace)
535
+ response = _base_api(
536
+ request=f"/v1/workspaces/{workspace_id}/networking/communicationPolicy/outbound/git",
537
+ client="fabric_sp",
538
+ )
539
+
540
+ return response.json().get("defaultAction", {})
541
+
542
+
543
+ @log
544
+ def set_workspace_git_outbound_policy(
545
+ policy: Literal["Allow", "Deny"],
546
+ workspace: Optional[str | UUID] = None,
547
+ ):
548
+ """
549
+ Sets Git Outbound policy for the specified workspace, when Outbound policy is set to 'Deny'.
550
+
551
+ This is a wrapper function for the following API: `Workspaces - Set Git Outbound Policy <https://learn.microsoft.com/rest/api/fabric/core/workspaces/set-git-outbound-policy>`_.
552
+
553
+ Service Principal Authentication is supported (see `here <https://github.com/microsoft/semantic-link-labs/blob/main/notebooks/Service%20Principal.ipynb>`_ for examples).
554
+
555
+ Parameters
556
+ ----------
557
+ policy : Literal['Allow', 'Deny']
558
+ The policy for all Git outbound communications from a workspace.
559
+ workspace : str | uuid.UUID, default=None
560
+ The workspace name or ID.
561
+ Defaults to None which resolves to the workspace of the attached lakehouse
562
+ or if no lakehouse attached, resolves to the workspace of the notebook.
563
+ """
564
+
565
+ (workspace_name, workspace_id) = resolve_workspace_name_and_id(workspace)
566
+
567
+ policy = policy.capitalize()
568
+
569
+ if policy not in ["Allow", "Deny"]:
570
+ raise ValueError(
571
+ f"{icons.red_dot} The 'policy' must be either 'Allow' or 'Deny'."
572
+ )
573
+
574
+ payload = {
575
+ "defaultAction": policy,
576
+ }
577
+
578
+ # Check current policy
579
+ p = get_workspace_git_outbound_policy(workspace=workspace_id)
580
+ if p == policy:
581
+ print(
582
+ f"{icons.info} The Git outbound policy for the '{workspace_name}' workspace is already set to '{policy}'. No changes made."
583
+ )
584
+ return
585
+
586
+ _base_api(
587
+ request=f"/v1/workspaces/{workspace_id}/networking/communicationPolicy/outbound/git",
588
+ client="fabric_sp",
589
+ payload=payload,
590
+ method="put",
591
+ )
592
+
593
+ print(
594
+ f"{icons.green_dot} The Git outbound policy has been updated for the '{workspace_name}' workspace."
595
+ )