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,508 @@
1
+ import pandas as pd
2
+ from uuid import UUID
3
+ import sempy_labs._icons as icons
4
+ from typing import Optional, Tuple
5
+ from sempy._utils._log import log
6
+ from sempy_labs._helper_functions import (
7
+ _base_api,
8
+ _build_url,
9
+ _create_dataframe,
10
+ _update_dataframe_datatypes,
11
+ _is_valid_uuid,
12
+ get_capacity_id,
13
+ )
14
+
15
+
16
+ @log
17
+ def patch_capacity(capacity: str | UUID, tenant_key_id: UUID):
18
+ """
19
+ Changes specific capacity information. Currently, this API call only supports changing the capacity's encryption key.
20
+
21
+ This is a wrapper function for the following API: `Admin - Patch Capacity As Admin <https://learn.microsoft.com/rest/api/power-bi/admin/patch-capacity-as-admin>`_.
22
+
23
+ Parameters
24
+ ----------
25
+ capacity : str | uuid.UUID
26
+ The name or ID of the capacity.
27
+ tenant_key_id : str
28
+ The ID of the encryption key.
29
+ """
30
+
31
+ (capacity_name, capacity_id) = _resolve_capacity_name_and_id(capacity)
32
+
33
+ payload = {
34
+ "tenantKeyId": tenant_key_id,
35
+ }
36
+
37
+ _base_api(
38
+ request=f"/v1.0/myorg/admin/capacities/{capacity_id}",
39
+ method="patch",
40
+ payload=payload,
41
+ )
42
+
43
+ print(
44
+ f"{icons.green_dot} The capacity '{capacity_name}' has been successfully patched."
45
+ )
46
+
47
+
48
+ @log
49
+ def _resolve_capacity_name_and_id(
50
+ capacity: str | UUID,
51
+ ) -> Tuple[str, UUID]:
52
+
53
+ dfC = list_capacities(capacity=capacity)
54
+ if dfC.empty:
55
+ raise ValueError(f"{icons.red_dot} The '{capacity}' capacity was not found.")
56
+
57
+ capacity_name = dfC["Capacity Name"].iloc[0]
58
+ capacity_id = dfC["Capacity Id"].iloc[0]
59
+
60
+ return capacity_name, capacity_id
61
+
62
+
63
+ @log
64
+ def _resolve_capacity_id(
65
+ capacity: str | UUID,
66
+ ) -> UUID:
67
+
68
+ if _is_valid_uuid(capacity):
69
+ capacity_id = capacity
70
+ else:
71
+ dfC = list_capacities(capacity=capacity)
72
+ if dfC.empty:
73
+ raise ValueError(
74
+ f"{icons.red_dot} The '{capacity}' capacity was not found."
75
+ )
76
+
77
+ capacity_id = dfC["Capacity Id"].iloc[0]
78
+
79
+ return capacity_id
80
+
81
+
82
+ @log
83
+ def _list_capacities_meta() -> pd.DataFrame:
84
+ """
85
+ Shows the a list of capacities and their properties. This function is the admin version.
86
+
87
+ This is a wrapper function for the following API: `Admin - Get Capacities As Admin <https://learn.microsoft.com/rest/api/power-bi/admin/get-capacities-as-admin>`_.
88
+
89
+ Returns
90
+ -------
91
+ pandas.DataFrame
92
+ A pandas dataframe showing the capacities and their properties
93
+ """
94
+
95
+ columns = {
96
+ "Capacity Id": "string",
97
+ "Capacity Name": "string",
98
+ "Sku": "string",
99
+ "Region": "string",
100
+ "State": "string",
101
+ "Admins": "string",
102
+ }
103
+ df = _create_dataframe(columns=columns)
104
+
105
+ responses = _base_api(
106
+ request="/v1.0/myorg/admin/capacities", client="fabric_sp", uses_pagination=True
107
+ )
108
+
109
+ rows = []
110
+ for r in responses:
111
+ for i in r.get("value", []):
112
+ rows.append(
113
+ {
114
+ "Capacity Id": i.get("id").lower(),
115
+ "Capacity Name": i.get("displayName"),
116
+ "Sku": i.get("sku"),
117
+ "Region": i.get("region"),
118
+ "State": i.get("state"),
119
+ "Admins": [i.get("admins", [])],
120
+ }
121
+ )
122
+
123
+ if rows:
124
+ df = pd.DataFrame(rows, columns=list(columns.keys()))
125
+
126
+ return df
127
+
128
+
129
+ @log
130
+ def get_capacity_assignment_status(
131
+ workspace: Optional[str | UUID] = None,
132
+ ) -> pd.DataFrame:
133
+ """
134
+ Gets the status of the assignment-to-capacity operation for the specified workspace.
135
+
136
+ This is a wrapper function for the following API: `Capacities - Groups CapacityAssignmentStatus <https://learn.microsoft.com/rest/api/power-bi/capacities/groups-capacity-assignment-status>`_.
137
+
138
+ Service Principal Authentication is supported (see `here <https://github.com/microsoft/semantic-link-labs/blob/main/notebooks/Service%20Principal.ipynb>`_ for examples).
139
+
140
+ Parameters
141
+ ----------
142
+ workspace : str | uuid.UUID, default=None
143
+ The workspace name or ID.
144
+ Defaults to None which resolves to the workspace of the attached lakehouse
145
+ or if no lakehouse attached, resolves to the workspace of the notebook.
146
+
147
+ Returns
148
+ -------
149
+ pandas.DataFrame
150
+ A pandas dataframe showing the status of the assignment-to-capacity operation for the specified workspace.
151
+ """
152
+ from sempy_labs.admin._basic_functions import _resolve_workspace_name_and_id
153
+
154
+ (workspace_name, workspace_id) = _resolve_workspace_name_and_id(workspace)
155
+
156
+ columns = {
157
+ "Status": "string",
158
+ "Activity Id": "string",
159
+ "Start Time": "datetime",
160
+ "End Time": "datetime",
161
+ "Capacity Id": "string",
162
+ "Capacity Name": "string",
163
+ }
164
+ df = _create_dataframe(columns=columns)
165
+
166
+ response = _base_api(
167
+ request=f"/v1.0/myorg/groups/{workspace_id}/CapacityAssignmentStatus",
168
+ client="fabric_sp",
169
+ )
170
+ v = response.json()
171
+ capacity_id = v.get("capacityId")
172
+
173
+ (capacity_name, capacity_id) = _resolve_capacity_name_and_id(capacity=capacity_id)
174
+
175
+ new_data = {
176
+ "Status": v.get("status"),
177
+ "Activity Id": v.get("activityId"),
178
+ "Start Time": v.get("startTime"),
179
+ "End Time": v.get("endTime"),
180
+ "Capacity Id": capacity_id,
181
+ "Capacity Name": capacity_name,
182
+ }
183
+
184
+ df = pd.DataFrame([new_data], columns=list(columns.keys()))
185
+ _update_dataframe_datatypes(dataframe=df, column_map=columns)
186
+
187
+ return df
188
+
189
+
190
+ @log
191
+ def get_capacity_state(capacity: Optional[str | UUID] = None):
192
+ """
193
+ Gets the state of a capacity.
194
+
195
+ Service Principal Authentication is supported (see `here <https://github.com/microsoft/semantic-link-labs/blob/main/notebooks/Service%20Principal.ipynb>`_ for examples).
196
+
197
+ Parameters
198
+ ----------
199
+ capacity : str | uuid.UUID, default=None
200
+ The capacity name or ID.
201
+ Defaults to None which resolves to the capacity of the attached lakehouse
202
+ or if no lakehouse is attached, resolves to the workspace of the notebook.
203
+
204
+ Returns
205
+ -------
206
+ str
207
+ The capacity state.
208
+ """
209
+
210
+ df = list_capacities()
211
+
212
+ if capacity is None:
213
+ capacity = get_capacity_id()
214
+ if _is_valid_uuid(capacity):
215
+ df_filt = df[df["Capacity Id"] == capacity]
216
+ else:
217
+ df_filt = df[df["Capacity Name"] == capacity]
218
+
219
+ if df_filt.empty:
220
+ raise ValueError(f"{icons.red_dot} The capacity '{capacity}' was not found.")
221
+
222
+ return df_filt["State"].iloc[0]
223
+
224
+
225
+ @log
226
+ def list_capacities(
227
+ capacity: Optional[str | UUID] = None,
228
+ include_tenant_key: bool = False,
229
+ ) -> pd.DataFrame:
230
+ """
231
+ Shows the a list of capacities and their properties.
232
+
233
+ This is a wrapper function for the following API: `Admin - Get Capacities As Admin <https://learn.microsoft.com/rest/api/power-bi/admin/get-capacities-as-admin>`_.
234
+
235
+ Service Principal Authentication is supported (see `here <https://github.com/microsoft/semantic-link-labs/blob/main/notebooks/Service%20Principal.ipynb>`_ for examples).
236
+
237
+ Parameters
238
+ ----------
239
+ capacity : str | uuid.UUID, default=None
240
+ The capacity name or ID to filter. If None, all capacities are returned.
241
+ include_tenant_key : bool, default=False
242
+ If True, obtains the `tenant key <https://learn.microsoft.com/rest/api/power-bi/admin/get-capacities-as-admin#example-with-expand-on-tenant-key>`_ properties.
243
+
244
+ Returns
245
+ -------
246
+ pandas.DataFrame
247
+ A pandas dataframe showing the capacities and their properties.
248
+ """
249
+
250
+ columns = {
251
+ "Capacity Id": "string",
252
+ "Capacity Name": "string",
253
+ "Sku": "string",
254
+ "Region": "string",
255
+ "State": "string",
256
+ "Admins": "list",
257
+ "Users": "list",
258
+ }
259
+ if include_tenant_key:
260
+ columns.update(
261
+ {
262
+ "Tenant Key Id": "string",
263
+ "Tenant Key Name": "string",
264
+ }
265
+ )
266
+ df = _create_dataframe(columns=columns)
267
+
268
+ url = "/v1.0/myorg/admin/capacities"
269
+ if include_tenant_key:
270
+ url += "?$expand=tenantKey"
271
+
272
+ responses = _base_api(request=url, client="fabric_sp", uses_pagination=True)
273
+
274
+ rows = []
275
+ for r in responses:
276
+ for i in r.get("value", []):
277
+ row = {
278
+ "Capacity Id": i.get("id", "").lower(),
279
+ "Capacity Name": i.get("displayName"),
280
+ "Sku": i.get("sku"),
281
+ "Region": i.get("region"),
282
+ "State": i.get("state"),
283
+ "Admins": i.get("admins", []),
284
+ "Users": i.get("users", []),
285
+ }
286
+
287
+ if include_tenant_key:
288
+ tenant_key = i.get("tenantKey") or {}
289
+ row.update(
290
+ {
291
+ "Tenant Key Id": tenant_key.get("id"),
292
+ "Tenant Key Name": tenant_key.get("name"),
293
+ }
294
+ )
295
+
296
+ rows.append(row)
297
+
298
+ if rows:
299
+ df = pd.DataFrame(rows, columns=list(columns.keys()))
300
+
301
+ if capacity is not None:
302
+ if _is_valid_uuid(capacity):
303
+ df = df[df["Capacity Id"] == capacity.lower()]
304
+ else:
305
+ df = df[df["Capacity Name"] == capacity]
306
+
307
+ return df
308
+
309
+
310
+ @log
311
+ def list_capacity_users(capacity: str | UUID) -> pd.DataFrame:
312
+ """
313
+ Shows a list of users that have access to the specified workspace.
314
+
315
+ This is a wrapper function for the following API: `Admin - Capacities GetCapacityUsersAsAdmin <https://learn.microsoft.com/rest/api/power-bi/admin/capacities-get-capacity-users-as-admin>`_.
316
+
317
+ Service Principal Authentication is supported (see `here <https://github.com/microsoft/semantic-link-labs/blob/main/notebooks/Service%20Principal.ipynb>`_ for examples).
318
+
319
+ Parameters
320
+ ----------
321
+ capacity : str | uuid.UUID
322
+ The name or ID of the capacity.
323
+
324
+ Returns
325
+ -------
326
+ pandas.DataFrame
327
+ A pandas dataframe showing a list of users that have access to the specified workspace.
328
+ """
329
+
330
+ (_, capacity_id) = _resolve_capacity_name_and_id(capacity)
331
+
332
+ columns = {
333
+ "User Name": "string",
334
+ "Email Address": "string",
335
+ "Capacity User Access Right": "string",
336
+ "Identifier": "string",
337
+ "Graph Id": "string",
338
+ "Principal Type": "string",
339
+ "User Type": "string",
340
+ "Profile": "string",
341
+ }
342
+
343
+ df = _create_dataframe(columns=columns)
344
+
345
+ response = _base_api(
346
+ request=f"/v1.0/myorg/admin/capacities/{capacity_id}/users", client="fabric_sp"
347
+ )
348
+
349
+ rows = []
350
+ for v in response.json().get("value", []):
351
+ rows.append(
352
+ {
353
+ "User Name": v.get("displayName"),
354
+ "Email Address": v.get("emailAddress"),
355
+ "Capacity User Access Right": v.get("capacityUserAccessRight"),
356
+ "Identifier": v.get("identifier"),
357
+ "Graph Id": v.get("graphId"),
358
+ "Principal Type": v.get("principalType"),
359
+ "User Type": v.get("userType"),
360
+ "Profile": v.get("profile"),
361
+ }
362
+ )
363
+
364
+ if rows:
365
+ df = pd.DataFrame(rows, columns=list(columns.keys()))
366
+ _update_dataframe_datatypes(dataframe=df, column_map=columns)
367
+
368
+ return df
369
+
370
+
371
+ @log
372
+ def get_refreshables(
373
+ top: Optional[int] = None,
374
+ expand: Optional[str] = None,
375
+ filter: Optional[str] = None,
376
+ skip: Optional[int] = None,
377
+ capacity: Optional[str | UUID] = None,
378
+ ) -> pd.DataFrame | dict:
379
+ """
380
+ Returns a list of refreshables for the organization within a capacity.
381
+
382
+ Power BI retains a seven-day refresh history for each dataset, up to a maximum of sixty refreshes.
383
+
384
+ This is a wrapper function for the following API: `Admin - Get Refreshables <https://learn.microsoft.com/rest/api/power-bi/admin/get-refreshables>`_.
385
+
386
+ Service Principal Authentication is supported (see `here <https://github.com/microsoft/semantic-link-labs/blob/main/notebooks/Service%20Principal.ipynb>`_ for examples).
387
+
388
+ Parameters
389
+ ----------
390
+ top : int, default=None
391
+ Returns only the first n results.
392
+ expand : str, default=None
393
+ Accepts a comma-separated list of data types, which will be expanded inline in the response. Supports capacities and groups.
394
+ filter : str, default=None
395
+ Returns a subset of a results based on Odata filter query parameter condition.
396
+ skip : int, default=None
397
+ Skips the first n results. Use with top to fetch results beyond the first 1000.
398
+ capacity : str | uuid.UUID, default=None
399
+ The capacity name or ID to filter. If None, all capacities are returned.
400
+
401
+ Returns
402
+ -------
403
+ pandas.DataFrame
404
+ Returns a list of refreshables for the organization within a capacity.
405
+ """
406
+
407
+ columns = {
408
+ "Workspace Id": "string",
409
+ "Workspace Name": "string",
410
+ "Item Id": "string",
411
+ "Item Name": "string",
412
+ "Item Kind": "string",
413
+ "Capacity Id": "string",
414
+ "Capacity Name": "string",
415
+ "Capacity SKU": "string",
416
+ "Refresh Count": "int",
417
+ "Refresh Failures": "int",
418
+ "Average Duration": "float",
419
+ "Median Duration": "float",
420
+ "Refreshes Per Day": "int",
421
+ "Refresh Type": "string",
422
+ "Start Time": "string",
423
+ "End Time": "string",
424
+ "Status": "string",
425
+ "Request Id": "string",
426
+ "Service Exception Json": "string",
427
+ "Extended Status": "dict",
428
+ "Refresh Attempts": "list",
429
+ "Refresh Schedule Days": "list",
430
+ "Refresh Schedule Times": "list",
431
+ "Refresh Schedule Enabled": "bool",
432
+ "Refresh Schedule Local Timezone Id": "string",
433
+ "Refresh Schedule Notify Option": "string",
434
+ "Configured By": "list",
435
+ }
436
+
437
+ df = _create_dataframe(columns=columns)
438
+
439
+ params = {}
440
+ url = (
441
+ "/v1.0/myorg/admin/capacities/refreshables"
442
+ if capacity is None
443
+ else f"/v1.0/myorg/admin/capacities/{_resolve_capacity_id(capacity=capacity)}/refreshables"
444
+ )
445
+
446
+ if top is not None:
447
+ params["$top"] = top
448
+
449
+ if expand is not None:
450
+ params["$expand"] = expand
451
+
452
+ if filter is not None:
453
+ params["$filter"] = filter
454
+
455
+ if skip is not None:
456
+ params["$skip"] = skip
457
+
458
+ url = _build_url(url, params)
459
+
460
+ responses = _base_api(request=url, client="fabric_sp")
461
+
462
+ rows = []
463
+ for i in responses.json().get("value", []):
464
+ last_refresh = i.get("lastRefresh", {})
465
+ refresh_schedule = i.get("refreshSchedule", {})
466
+ rows.append(
467
+ {
468
+ "Workspace Id": i.get("group", {}).get("id"),
469
+ "Workspace Name": i.get("group", {}).get("name"),
470
+ "Item Id": i.get("id"),
471
+ "Item Name": i.get("name"),
472
+ "Item Kind": i.get("kind"),
473
+ "Capacity Id": (
474
+ i.get("capacity", {}).get("id").lower()
475
+ if i.get("capacity", {}).get("id")
476
+ else None
477
+ ),
478
+ "Capacity Name": i.get("capacity", {}).get("displayName"),
479
+ "Capacity SKU": i.get("capacity", {}).get("sku"),
480
+ "Refresh Count": i.get("refreshCount", 0),
481
+ "Refresh Failures": i.get("refreshFailures", 0),
482
+ "Average Duration": i.get("averageDuration", 0),
483
+ "Median Duration": i.get("medianDuration", 0),
484
+ "Refreshes Per Day": i.get("refreshesPerDay", 0),
485
+ "Refresh Type": last_refresh.get("refreshType"),
486
+ "Start Time": last_refresh.get("startTime"),
487
+ "End Time": last_refresh.get("endTime"),
488
+ "Status": last_refresh.get("status"),
489
+ "Request Id": last_refresh.get("requestId"),
490
+ "Service Exception Json": last_refresh.get("serviceExceptionJson"),
491
+ "Extended Status": last_refresh.get("extendedStatus"),
492
+ "Refresh Attempts": last_refresh.get("refreshAttempts"),
493
+ "Refresh Schedule Days": refresh_schedule.get("days"),
494
+ "Refresh Schedule Times": refresh_schedule.get("times"),
495
+ "Refresh Schedule Enabled": refresh_schedule.get("enabled"),
496
+ "Refresh Schedule Local Timezone Id": refresh_schedule.get(
497
+ "localTimeZoneId"
498
+ ),
499
+ "Refresh Schedule Notify Option": refresh_schedule.get("notifyOption"),
500
+ "Configured By": i.get("configuredBy"),
501
+ }
502
+ )
503
+
504
+ if rows:
505
+ df = pd.DataFrame(rows, columns=list(columns.keys()))
506
+ _update_dataframe_datatypes(dataframe=df, column_map=columns)
507
+
508
+ return df
@@ -0,0 +1,45 @@
1
+ from typing import Optional
2
+ from sempy_labs._helper_functions import (
3
+ _base_api,
4
+ )
5
+ from sempy_labs.admin._items import (
6
+ _resolve_item_id,
7
+ )
8
+ from uuid import UUID
9
+ from sempy._utils._log import log
10
+
11
+
12
+ @log
13
+ def export_dataflow(
14
+ dataflow: str | UUID,
15
+ workspace: Optional[str | UUID] = None,
16
+ ) -> dict:
17
+ """
18
+ Shows a list of datasets for the organization.
19
+
20
+ This is a wrapper function for the following API: `Admin - Dataflows ExportDataflowAsAdmin <https://learn.microsoft.com/rest/api/power-bi/admin/dataflows-export-dataflow-as-admin>`_.
21
+
22
+ Service Principal Authentication is supported (see `here <https://github.com/microsoft/semantic-link-labs/blob/main/notebooks/Service%20Principal.ipynb>`_ for examples).
23
+
24
+ Parameters
25
+ ----------
26
+ dataflow : str | UUID, default=None
27
+ The dataflow Name or Id.
28
+ workspace : str | uuid.UUID, default=None
29
+ The Fabric workspace name or id.
30
+ Defaults to None which resolves to the workspace of the attached lakehouse
31
+ or if no lakehouse attached, resolves to the workspace of the notebook.
32
+ Only used if given a dataflow name and not an id.
33
+
34
+ Returns
35
+ -------
36
+ dict
37
+ Exported Json file.
38
+ """
39
+ dataflow_id = _resolve_item_id(item=dataflow, type="dataflow", workspace=workspace)
40
+
41
+ url = f"/v1.0/myorg/admin/dataflows/{dataflow_id}/export"
42
+
43
+ response = _base_api(request=url, client="fabric_sp")
44
+
45
+ return response.json()