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.
- semantic_link_labs-0.12.8.dist-info/METADATA +354 -0
- semantic_link_labs-0.12.8.dist-info/RECORD +243 -0
- semantic_link_labs-0.12.8.dist-info/WHEEL +5 -0
- semantic_link_labs-0.12.8.dist-info/licenses/LICENSE +21 -0
- semantic_link_labs-0.12.8.dist-info/top_level.txt +1 -0
- sempy_labs/__init__.py +606 -0
- sempy_labs/_a_lib_info.py +2 -0
- sempy_labs/_ai.py +437 -0
- sempy_labs/_authentication.py +264 -0
- sempy_labs/_bpa_translation/_model/_translations_am-ET.po +869 -0
- sempy_labs/_bpa_translation/_model/_translations_ar-AE.po +908 -0
- sempy_labs/_bpa_translation/_model/_translations_bg-BG.po +968 -0
- sempy_labs/_bpa_translation/_model/_translations_ca-ES.po +963 -0
- sempy_labs/_bpa_translation/_model/_translations_cs-CZ.po +943 -0
- sempy_labs/_bpa_translation/_model/_translations_da-DK.po +945 -0
- sempy_labs/_bpa_translation/_model/_translations_de-DE.po +988 -0
- sempy_labs/_bpa_translation/_model/_translations_el-GR.po +993 -0
- sempy_labs/_bpa_translation/_model/_translations_es-ES.po +971 -0
- sempy_labs/_bpa_translation/_model/_translations_fa-IR.po +933 -0
- sempy_labs/_bpa_translation/_model/_translations_fi-FI.po +942 -0
- sempy_labs/_bpa_translation/_model/_translations_fr-FR.po +994 -0
- sempy_labs/_bpa_translation/_model/_translations_ga-IE.po +967 -0
- sempy_labs/_bpa_translation/_model/_translations_he-IL.po +902 -0
- sempy_labs/_bpa_translation/_model/_translations_hi-IN.po +944 -0
- sempy_labs/_bpa_translation/_model/_translations_hu-HU.po +963 -0
- sempy_labs/_bpa_translation/_model/_translations_id-ID.po +946 -0
- sempy_labs/_bpa_translation/_model/_translations_is-IS.po +939 -0
- sempy_labs/_bpa_translation/_model/_translations_it-IT.po +986 -0
- sempy_labs/_bpa_translation/_model/_translations_ja-JP.po +846 -0
- sempy_labs/_bpa_translation/_model/_translations_ko-KR.po +839 -0
- sempy_labs/_bpa_translation/_model/_translations_mt-MT.po +967 -0
- sempy_labs/_bpa_translation/_model/_translations_nl-NL.po +978 -0
- sempy_labs/_bpa_translation/_model/_translations_pl-PL.po +962 -0
- sempy_labs/_bpa_translation/_model/_translations_pt-BR.po +962 -0
- sempy_labs/_bpa_translation/_model/_translations_pt-PT.po +957 -0
- sempy_labs/_bpa_translation/_model/_translations_ro-RO.po +968 -0
- sempy_labs/_bpa_translation/_model/_translations_ru-RU.po +964 -0
- sempy_labs/_bpa_translation/_model/_translations_sk-SK.po +952 -0
- sempy_labs/_bpa_translation/_model/_translations_sl-SL.po +950 -0
- sempy_labs/_bpa_translation/_model/_translations_sv-SE.po +942 -0
- sempy_labs/_bpa_translation/_model/_translations_ta-IN.po +976 -0
- sempy_labs/_bpa_translation/_model/_translations_te-IN.po +947 -0
- sempy_labs/_bpa_translation/_model/_translations_th-TH.po +924 -0
- sempy_labs/_bpa_translation/_model/_translations_tr-TR.po +953 -0
- sempy_labs/_bpa_translation/_model/_translations_uk-UA.po +961 -0
- sempy_labs/_bpa_translation/_model/_translations_zh-CN.po +804 -0
- sempy_labs/_bpa_translation/_model/_translations_zu-ZA.po +969 -0
- sempy_labs/_capacities.py +1198 -0
- sempy_labs/_capacity_migration.py +660 -0
- sempy_labs/_clear_cache.py +351 -0
- sempy_labs/_connections.py +610 -0
- sempy_labs/_dashboards.py +69 -0
- sempy_labs/_data_access_security.py +98 -0
- sempy_labs/_data_pipelines.py +162 -0
- sempy_labs/_dataflows.py +668 -0
- sempy_labs/_dax.py +501 -0
- sempy_labs/_daxformatter.py +80 -0
- sempy_labs/_delta_analyzer.py +467 -0
- sempy_labs/_delta_analyzer_history.py +301 -0
- sempy_labs/_dictionary_diffs.py +221 -0
- sempy_labs/_documentation.py +147 -0
- sempy_labs/_domains.py +51 -0
- sempy_labs/_eventhouses.py +182 -0
- sempy_labs/_external_data_shares.py +230 -0
- sempy_labs/_gateways.py +521 -0
- sempy_labs/_generate_semantic_model.py +521 -0
- sempy_labs/_get_connection_string.py +84 -0
- sempy_labs/_git.py +543 -0
- sempy_labs/_graphQL.py +90 -0
- sempy_labs/_helper_functions.py +2833 -0
- sempy_labs/_icons.py +149 -0
- sempy_labs/_job_scheduler.py +609 -0
- sempy_labs/_kql_databases.py +149 -0
- sempy_labs/_kql_querysets.py +124 -0
- sempy_labs/_kusto.py +137 -0
- sempy_labs/_labels.py +124 -0
- sempy_labs/_list_functions.py +1720 -0
- sempy_labs/_managed_private_endpoints.py +253 -0
- sempy_labs/_mirrored_databases.py +416 -0
- sempy_labs/_mirrored_warehouses.py +60 -0
- sempy_labs/_ml_experiments.py +113 -0
- sempy_labs/_model_auto_build.py +140 -0
- sempy_labs/_model_bpa.py +557 -0
- sempy_labs/_model_bpa_bulk.py +378 -0
- sempy_labs/_model_bpa_rules.py +859 -0
- sempy_labs/_model_dependencies.py +343 -0
- sempy_labs/_mounted_data_factories.py +123 -0
- sempy_labs/_notebooks.py +441 -0
- sempy_labs/_one_lake_integration.py +151 -0
- sempy_labs/_onelake.py +131 -0
- sempy_labs/_query_scale_out.py +433 -0
- sempy_labs/_refresh_semantic_model.py +435 -0
- sempy_labs/_semantic_models.py +468 -0
- sempy_labs/_spark.py +455 -0
- sempy_labs/_sql.py +241 -0
- sempy_labs/_sql_audit_settings.py +207 -0
- sempy_labs/_sql_endpoints.py +214 -0
- sempy_labs/_tags.py +201 -0
- sempy_labs/_translations.py +43 -0
- sempy_labs/_user_delegation_key.py +44 -0
- sempy_labs/_utils.py +79 -0
- sempy_labs/_vertipaq.py +1021 -0
- sempy_labs/_vpax.py +388 -0
- sempy_labs/_warehouses.py +234 -0
- sempy_labs/_workloads.py +140 -0
- sempy_labs/_workspace_identity.py +72 -0
- sempy_labs/_workspaces.py +595 -0
- sempy_labs/admin/__init__.py +170 -0
- sempy_labs/admin/_activities.py +167 -0
- sempy_labs/admin/_apps.py +145 -0
- sempy_labs/admin/_artifacts.py +65 -0
- sempy_labs/admin/_basic_functions.py +463 -0
- sempy_labs/admin/_capacities.py +508 -0
- sempy_labs/admin/_dataflows.py +45 -0
- sempy_labs/admin/_datasets.py +186 -0
- sempy_labs/admin/_domains.py +522 -0
- sempy_labs/admin/_external_data_share.py +100 -0
- sempy_labs/admin/_git.py +72 -0
- sempy_labs/admin/_items.py +265 -0
- sempy_labs/admin/_labels.py +211 -0
- sempy_labs/admin/_reports.py +241 -0
- sempy_labs/admin/_scanner.py +118 -0
- sempy_labs/admin/_shared.py +82 -0
- sempy_labs/admin/_sharing_links.py +110 -0
- sempy_labs/admin/_tags.py +131 -0
- sempy_labs/admin/_tenant.py +503 -0
- sempy_labs/admin/_tenant_keys.py +89 -0
- sempy_labs/admin/_users.py +140 -0
- sempy_labs/admin/_workspaces.py +236 -0
- sempy_labs/deployment_pipeline/__init__.py +23 -0
- sempy_labs/deployment_pipeline/_items.py +580 -0
- sempy_labs/directlake/__init__.py +57 -0
- sempy_labs/directlake/_autosync.py +58 -0
- sempy_labs/directlake/_directlake_schema_compare.py +120 -0
- sempy_labs/directlake/_directlake_schema_sync.py +161 -0
- sempy_labs/directlake/_dl_helper.py +274 -0
- sempy_labs/directlake/_generate_shared_expression.py +94 -0
- sempy_labs/directlake/_get_directlake_lakehouse.py +62 -0
- sempy_labs/directlake/_get_shared_expression.py +34 -0
- sempy_labs/directlake/_guardrails.py +96 -0
- sempy_labs/directlake/_list_directlake_model_calc_tables.py +70 -0
- sempy_labs/directlake/_show_unsupported_directlake_objects.py +90 -0
- sempy_labs/directlake/_update_directlake_model_lakehouse_connection.py +239 -0
- sempy_labs/directlake/_update_directlake_partition_entity.py +259 -0
- sempy_labs/directlake/_warm_cache.py +236 -0
- sempy_labs/dotnet_lib/dotnet.runtime.config.json +10 -0
- sempy_labs/environment/__init__.py +23 -0
- sempy_labs/environment/_items.py +212 -0
- sempy_labs/environment/_pubstage.py +223 -0
- sempy_labs/eventstream/__init__.py +37 -0
- sempy_labs/eventstream/_items.py +263 -0
- sempy_labs/eventstream/_topology.py +652 -0
- sempy_labs/graph/__init__.py +59 -0
- sempy_labs/graph/_groups.py +651 -0
- sempy_labs/graph/_sensitivity_labels.py +120 -0
- sempy_labs/graph/_teams.py +125 -0
- sempy_labs/graph/_user_licenses.py +96 -0
- sempy_labs/graph/_users.py +516 -0
- sempy_labs/graph_model/__init__.py +15 -0
- sempy_labs/graph_model/_background_jobs.py +63 -0
- sempy_labs/graph_model/_items.py +149 -0
- sempy_labs/lakehouse/__init__.py +67 -0
- sempy_labs/lakehouse/_blobs.py +247 -0
- sempy_labs/lakehouse/_get_lakehouse_columns.py +102 -0
- sempy_labs/lakehouse/_get_lakehouse_tables.py +274 -0
- sempy_labs/lakehouse/_helper.py +250 -0
- sempy_labs/lakehouse/_lakehouse.py +351 -0
- sempy_labs/lakehouse/_livy_sessions.py +143 -0
- sempy_labs/lakehouse/_materialized_lake_views.py +157 -0
- sempy_labs/lakehouse/_partitioning.py +165 -0
- sempy_labs/lakehouse/_schemas.py +217 -0
- sempy_labs/lakehouse/_shortcuts.py +440 -0
- sempy_labs/migration/__init__.py +35 -0
- sempy_labs/migration/_create_pqt_file.py +238 -0
- sempy_labs/migration/_direct_lake_to_import.py +105 -0
- sempy_labs/migration/_migrate_calctables_to_lakehouse.py +398 -0
- sempy_labs/migration/_migrate_calctables_to_semantic_model.py +148 -0
- sempy_labs/migration/_migrate_model_objects_to_semantic_model.py +533 -0
- sempy_labs/migration/_migrate_tables_columns_to_semantic_model.py +172 -0
- sempy_labs/migration/_migration_validation.py +71 -0
- sempy_labs/migration/_refresh_calc_tables.py +131 -0
- sempy_labs/mirrored_azure_databricks_catalog/__init__.py +15 -0
- sempy_labs/mirrored_azure_databricks_catalog/_discover.py +213 -0
- sempy_labs/mirrored_azure_databricks_catalog/_refresh_catalog_metadata.py +45 -0
- sempy_labs/ml_model/__init__.py +23 -0
- sempy_labs/ml_model/_functions.py +427 -0
- sempy_labs/report/_BPAReportTemplate.json +232 -0
- sempy_labs/report/__init__.py +55 -0
- sempy_labs/report/_bpareporttemplate/.pbi/localSettings.json +9 -0
- sempy_labs/report/_bpareporttemplate/.platform +11 -0
- sempy_labs/report/_bpareporttemplate/StaticResources/SharedResources/BaseThemes/CY24SU06.json +710 -0
- sempy_labs/report/_bpareporttemplate/definition/pages/01d72098bda5055bd500/page.json +11 -0
- sempy_labs/report/_bpareporttemplate/definition/pages/01d72098bda5055bd500/visuals/1b08bce3bebabb0a27a8/visual.json +191 -0
- sempy_labs/report/_bpareporttemplate/definition/pages/01d72098bda5055bd500/visuals/2f22ddb70c301693c165/visual.json +438 -0
- sempy_labs/report/_bpareporttemplate/definition/pages/01d72098bda5055bd500/visuals/3b1182230aa6c600b43a/visual.json +127 -0
- sempy_labs/report/_bpareporttemplate/definition/pages/01d72098bda5055bd500/visuals/58577ba6380c69891500/visual.json +576 -0
- sempy_labs/report/_bpareporttemplate/definition/pages/01d72098bda5055bd500/visuals/a2a8fa5028b3b776c96c/visual.json +207 -0
- sempy_labs/report/_bpareporttemplate/definition/pages/01d72098bda5055bd500/visuals/adfd47ef30652707b987/visual.json +506 -0
- sempy_labs/report/_bpareporttemplate/definition/pages/01d72098bda5055bd500/visuals/b6a80ee459e716e170b1/visual.json +127 -0
- sempy_labs/report/_bpareporttemplate/definition/pages/01d72098bda5055bd500/visuals/ce3130a721c020cc3d81/visual.json +513 -0
- sempy_labs/report/_bpareporttemplate/definition/pages/92735ae19b31712208ad/page.json +8 -0
- sempy_labs/report/_bpareporttemplate/definition/pages/92735ae19b31712208ad/visuals/66e60dfb526437cd78d1/visual.json +112 -0
- sempy_labs/report/_bpareporttemplate/definition/pages/c597da16dc7e63222a82/page.json +11 -0
- sempy_labs/report/_bpareporttemplate/definition/pages/c597da16dc7e63222a82/visuals/07deb8bce824e1be37d7/visual.json +513 -0
- sempy_labs/report/_bpareporttemplate/definition/pages/c597da16dc7e63222a82/visuals/0b1c68838818b32ad03b/visual.json +352 -0
- sempy_labs/report/_bpareporttemplate/definition/pages/c597da16dc7e63222a82/visuals/0c171de9d2683d10b930/visual.json +37 -0
- sempy_labs/report/_bpareporttemplate/definition/pages/c597da16dc7e63222a82/visuals/0efa01be0510e40a645e/visual.json +542 -0
- sempy_labs/report/_bpareporttemplate/definition/pages/c597da16dc7e63222a82/visuals/6bf2f0eb830ab53cc668/visual.json +221 -0
- sempy_labs/report/_bpareporttemplate/definition/pages/c597da16dc7e63222a82/visuals/88d8141cb8500b60030c/visual.json +127 -0
- sempy_labs/report/_bpareporttemplate/definition/pages/c597da16dc7e63222a82/visuals/a753273590beed656a03/visual.json +576 -0
- sempy_labs/report/_bpareporttemplate/definition/pages/c597da16dc7e63222a82/visuals/b8fdc82cddd61ac447bc/visual.json +127 -0
- sempy_labs/report/_bpareporttemplate/definition/pages/d37dce724a0ccc30044b/page.json +9 -0
- sempy_labs/report/_bpareporttemplate/definition/pages/d37dce724a0ccc30044b/visuals/ce8532a7e25020271077/visual.json +38 -0
- sempy_labs/report/_bpareporttemplate/definition/pages/pages.json +10 -0
- sempy_labs/report/_bpareporttemplate/definition/report.json +176 -0
- sempy_labs/report/_bpareporttemplate/definition/version.json +4 -0
- sempy_labs/report/_bpareporttemplate/definition.pbir +14 -0
- sempy_labs/report/_download_report.py +76 -0
- sempy_labs/report/_export_report.py +257 -0
- sempy_labs/report/_generate_report.py +427 -0
- sempy_labs/report/_paginated.py +76 -0
- sempy_labs/report/_report_bpa.py +354 -0
- sempy_labs/report/_report_bpa_rules.py +115 -0
- sempy_labs/report/_report_functions.py +581 -0
- sempy_labs/report/_report_helper.py +227 -0
- sempy_labs/report/_report_list_functions.py +110 -0
- sempy_labs/report/_report_rebind.py +149 -0
- sempy_labs/report/_reportwrapper.py +3100 -0
- sempy_labs/report/_save_report.py +147 -0
- sempy_labs/snowflake_database/__init__.py +10 -0
- sempy_labs/snowflake_database/_items.py +105 -0
- sempy_labs/sql_database/__init__.py +21 -0
- sempy_labs/sql_database/_items.py +201 -0
- sempy_labs/sql_database/_mirroring.py +79 -0
- sempy_labs/theme/__init__.py +12 -0
- sempy_labs/theme/_org_themes.py +129 -0
- sempy_labs/tom/__init__.py +3 -0
- sempy_labs/tom/_model.py +5977 -0
- sempy_labs/variable_library/__init__.py +19 -0
- sempy_labs/variable_library/_functions.py +403 -0
- sempy_labs/warehouse/__init__.py +28 -0
- sempy_labs/warehouse/_items.py +234 -0
- 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()
|