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,120 @@
|
|
|
1
|
+
import pandas as pd
|
|
2
|
+
from uuid import UUID
|
|
3
|
+
from typing import Optional
|
|
4
|
+
from sempy_labs._helper_functions import (
|
|
5
|
+
_base_api,
|
|
6
|
+
_create_dataframe,
|
|
7
|
+
_update_dataframe_datatypes,
|
|
8
|
+
_is_valid_uuid,
|
|
9
|
+
)
|
|
10
|
+
from sempy._utils._log import log
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
@log
|
|
14
|
+
def list_sensitivity_labels(user: Optional[str | UUID] = None) -> pd.DataFrame:
|
|
15
|
+
"""
|
|
16
|
+
Get a list of `sensitivity label <https://learn.microsoft.com/graph/api/resources/security-sensitivitylabel>`_ objects associated with a user or organization.
|
|
17
|
+
|
|
18
|
+
This is a wrapper function for the following API: `List sensitivityLabels https://learn.microsoft.com/graph/api/security-informationprotection-list-sensitivitylabels>`_.
|
|
19
|
+
|
|
20
|
+
Service Principal Authentication is required (see `here <https://github.com/microsoft/semantic-link-labs/blob/main/notebooks/Service%20Principal.ipynb>`_ for examples).
|
|
21
|
+
|
|
22
|
+
Parameters
|
|
23
|
+
----------
|
|
24
|
+
user : str | uuid.UUID
|
|
25
|
+
The user ID or user principal name.
|
|
26
|
+
|
|
27
|
+
Returns
|
|
28
|
+
-------
|
|
29
|
+
pandas.DataFrame
|
|
30
|
+
A pandas dataframe showing a list of `sensitivity label <https://learn.microsoft.com/graph/api/resources/security-sensitivitylabel>`_ objects associated with a user or organization.
|
|
31
|
+
"""
|
|
32
|
+
from sempy_labs.graph import resolve_user_id
|
|
33
|
+
|
|
34
|
+
url = "/security/informationProtection/sensitivityLabels"
|
|
35
|
+
|
|
36
|
+
if user is not None:
|
|
37
|
+
user_id = resolve_user_id(user=user)
|
|
38
|
+
url = f"users/{user_id}{url}"
|
|
39
|
+
|
|
40
|
+
result = _base_api(request=url, client="graph").json()
|
|
41
|
+
|
|
42
|
+
columns = {
|
|
43
|
+
"Sensitivity Label Id": "str",
|
|
44
|
+
"Sensitivity Label Name": "str",
|
|
45
|
+
"Description": "str",
|
|
46
|
+
"Color": "str",
|
|
47
|
+
"Sensitivity": "int",
|
|
48
|
+
"Tooltip": "str",
|
|
49
|
+
"Is Active": "bool",
|
|
50
|
+
"Is Appliable": "bool",
|
|
51
|
+
"Has Protection": "bool",
|
|
52
|
+
"Parent Sensitivity Label Id": "str",
|
|
53
|
+
"Parent Sensitivity Label Name": "str",
|
|
54
|
+
}
|
|
55
|
+
df = _create_dataframe(columns=columns)
|
|
56
|
+
|
|
57
|
+
rows = []
|
|
58
|
+
for item in result.get("value", []):
|
|
59
|
+
row = {
|
|
60
|
+
"Sensitivity Label Id": item.get("id"),
|
|
61
|
+
"Sensitivity Label Name": item.get("name"),
|
|
62
|
+
"Description": item.get("description"),
|
|
63
|
+
"Color": item.get("color"),
|
|
64
|
+
"Sensitivity": item.get("sensitivity"),
|
|
65
|
+
"Tooltip": item.get("tooltip"),
|
|
66
|
+
"Is Active": item.get("isActive"),
|
|
67
|
+
"Is Appliable": item.get("isAppliable"),
|
|
68
|
+
"Has Protection": item.get("hasProtection"),
|
|
69
|
+
"Parent Sensitivity Label Id": (
|
|
70
|
+
item.get("parent", {}).get("id") if item.get("parent") else None
|
|
71
|
+
),
|
|
72
|
+
"Parent Sensitivity Label Name": (
|
|
73
|
+
item.get("parent", {}).get("name") if item.get("parent") else None
|
|
74
|
+
),
|
|
75
|
+
}
|
|
76
|
+
rows.append(row)
|
|
77
|
+
|
|
78
|
+
if rows:
|
|
79
|
+
df = pd.DataFrame(rows, columns=list(columns.keys()))
|
|
80
|
+
_update_dataframe_datatypes(dataframe=df, column_map=columns)
|
|
81
|
+
|
|
82
|
+
return df
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
@log
|
|
86
|
+
def resolve_sensitivity_label_id(
|
|
87
|
+
label: str | UUID, user: Optional[str | UUID] = None
|
|
88
|
+
) -> UUID | None:
|
|
89
|
+
"""
|
|
90
|
+
Resolve a sensitivity label name or ID to its corresponding sensitivity label ID.
|
|
91
|
+
|
|
92
|
+
Service Principal Authentication is required (see `here <https://github.com/microsoft/semantic-link-labs/blob/main/notebooks/Service%20Principal.ipynb>`_ for examples).
|
|
93
|
+
|
|
94
|
+
Parameters
|
|
95
|
+
----------
|
|
96
|
+
label : str | uuid.UUID
|
|
97
|
+
The name or ID of the sensitivity label.
|
|
98
|
+
user : str | uuid.UUID, default=None
|
|
99
|
+
The user ID or user principal name.
|
|
100
|
+
|
|
101
|
+
Returns
|
|
102
|
+
-------
|
|
103
|
+
uuid.UUID | None
|
|
104
|
+
The ID of the sensitivity label if found, otherwise None.
|
|
105
|
+
"""
|
|
106
|
+
|
|
107
|
+
if _is_valid_uuid(label):
|
|
108
|
+
return str(label)
|
|
109
|
+
|
|
110
|
+
df = list_sensitivity_labels(user=user)
|
|
111
|
+
|
|
112
|
+
if df.empty:
|
|
113
|
+
return None
|
|
114
|
+
|
|
115
|
+
# Try to find the label by name
|
|
116
|
+
label_row = df[df["Sensitivity Label Name"] == label]
|
|
117
|
+
if not label_row.empty:
|
|
118
|
+
return label_row["Sensitivity Label Id"].iloc[0]
|
|
119
|
+
|
|
120
|
+
return None
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import pandas as pd
|
|
2
|
+
from uuid import UUID
|
|
3
|
+
from sempy._utils._log import log
|
|
4
|
+
from sempy_labs._helper_functions import (
|
|
5
|
+
_base_api,
|
|
6
|
+
_create_dataframe,
|
|
7
|
+
_update_dataframe_datatypes,
|
|
8
|
+
)
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
@log
|
|
12
|
+
def list_teams() -> pd.DataFrame:
|
|
13
|
+
"""
|
|
14
|
+
Shows a list of teams and their properties.
|
|
15
|
+
|
|
16
|
+
This is a wrapper function for the following API: `List teams <https://learn.microsoft.com/graph/api/teams-list>`_.
|
|
17
|
+
|
|
18
|
+
Service Principal Authentication is required (see `here <https://github.com/microsoft/semantic-link-labs/blob/main/notebooks/Service%20Principal.ipynb>`_ for examples).
|
|
19
|
+
|
|
20
|
+
Returns
|
|
21
|
+
-------
|
|
22
|
+
pandas.DataFrame
|
|
23
|
+
A pandas dataframe showing a list of teams and their properties.
|
|
24
|
+
"""
|
|
25
|
+
|
|
26
|
+
result = _base_api(request="teams", client="graph", uses_pagination=True)
|
|
27
|
+
|
|
28
|
+
columns = {
|
|
29
|
+
"Team Id": "str",
|
|
30
|
+
"Team Name": "str",
|
|
31
|
+
"Description": "str",
|
|
32
|
+
"Creation Date Time": "datetime",
|
|
33
|
+
"Classification": "str",
|
|
34
|
+
"Specialization": "str",
|
|
35
|
+
"Visibility": "str",
|
|
36
|
+
"Web Url": "str",
|
|
37
|
+
"Archived": "bool",
|
|
38
|
+
"Favorite By Me": "bool",
|
|
39
|
+
"Discoverable By Me": "bool",
|
|
40
|
+
"Member Count": "int_fillna",
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
df = _create_dataframe(columns=columns)
|
|
44
|
+
|
|
45
|
+
rows = []
|
|
46
|
+
for r in result:
|
|
47
|
+
for v in r.get("value", []):
|
|
48
|
+
rows.append(
|
|
49
|
+
{
|
|
50
|
+
"Team Id": v.get("id"),
|
|
51
|
+
"Team Name": v.get("displayName"),
|
|
52
|
+
"Description": v.get("description"),
|
|
53
|
+
"Creation Date Time": v.get("createdDateTime"),
|
|
54
|
+
"Classification": v.get("classification"),
|
|
55
|
+
"Specialization": v.get("specialization"),
|
|
56
|
+
"Visibility": v.get("visibility"),
|
|
57
|
+
"Web Url": v.get("webUrl"),
|
|
58
|
+
"Archived": v.get("isArchived"),
|
|
59
|
+
"Favorite By Me": v.get("isFavoriteByMe"),
|
|
60
|
+
"Discoverable By Me": v.get("isDiscoverableByMe"),
|
|
61
|
+
"Member Count": v.get("memberCount"),
|
|
62
|
+
}
|
|
63
|
+
)
|
|
64
|
+
|
|
65
|
+
if rows:
|
|
66
|
+
df = pd.DataFrame(rows, columns=list(columns.keys()))
|
|
67
|
+
_update_dataframe_datatypes(dataframe=df, column_map=columns)
|
|
68
|
+
|
|
69
|
+
return df
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
@log
|
|
73
|
+
def list_chats(user: str | UUID) -> pd.DataFrame:
|
|
74
|
+
"""
|
|
75
|
+
In progress...
|
|
76
|
+
"""
|
|
77
|
+
|
|
78
|
+
from sempy_labs.graph._users import resolve_user_id
|
|
79
|
+
|
|
80
|
+
user_id = resolve_user_id(user=user)
|
|
81
|
+
result = _base_api(request=f"users/{user_id}/chats", client="graph").json()
|
|
82
|
+
|
|
83
|
+
columns = {
|
|
84
|
+
"Chat Id": "str",
|
|
85
|
+
"Type": "str",
|
|
86
|
+
"Members": "str",
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
df = _create_dataframe(columns=columns)
|
|
90
|
+
|
|
91
|
+
rows = []
|
|
92
|
+
for v in result.get("value"):
|
|
93
|
+
rows.append(
|
|
94
|
+
{
|
|
95
|
+
"Chat Id": v.get("id"),
|
|
96
|
+
"Type": v.get("chatType"),
|
|
97
|
+
"Members": v.get("members"),
|
|
98
|
+
}
|
|
99
|
+
)
|
|
100
|
+
|
|
101
|
+
if rows:
|
|
102
|
+
df = pd.DataFrame(rows, columns=list(columns.keys()))
|
|
103
|
+
|
|
104
|
+
return df
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
@log
|
|
108
|
+
def send_teams_message(chat_id: str, message: str):
|
|
109
|
+
"""
|
|
110
|
+
In progress...
|
|
111
|
+
"""
|
|
112
|
+
|
|
113
|
+
payload = {
|
|
114
|
+
"body": {
|
|
115
|
+
"content": message,
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
_base_api(
|
|
120
|
+
request=f"chats/{chat_id}/messages",
|
|
121
|
+
client="graph",
|
|
122
|
+
method="post",
|
|
123
|
+
payload=payload,
|
|
124
|
+
status_codes=201,
|
|
125
|
+
)
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
from uuid import UUID
|
|
2
|
+
import sempy_labs._icons as icons
|
|
3
|
+
from typing import List, Optional
|
|
4
|
+
from sempy_labs._helper_functions import (
|
|
5
|
+
_base_api,
|
|
6
|
+
)
|
|
7
|
+
from sempy._utils._log import log
|
|
8
|
+
from sempy_labs.graph._users import resolve_user_id
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
@log
|
|
12
|
+
def add_user_license(
|
|
13
|
+
user: str | UUID, sku_id: UUID, disabled_plans: Optional[UUID | List[UUID]] = None
|
|
14
|
+
):
|
|
15
|
+
"""
|
|
16
|
+
Assigns a license to a user.
|
|
17
|
+
|
|
18
|
+
This is a wrapper function for the following API: `user: assignLicense <https://learn.microsoft.com/graph/api/user-assignlicense>`_.
|
|
19
|
+
|
|
20
|
+
Service Principal Authentication is required (see `here <https://github.com/microsoft/semantic-link-labs/blob/main/notebooks/Service%20Principal.ipynb>`_ for examples).
|
|
21
|
+
|
|
22
|
+
Parameters
|
|
23
|
+
----------
|
|
24
|
+
user : str | uuid.UUID
|
|
25
|
+
The user ID or user principal name.
|
|
26
|
+
sku_id : uuid.UUID
|
|
27
|
+
The SKU ID of the license to assign.
|
|
28
|
+
disabled_plans : Optional[uuid.UUID | List[uuid.UUID]], default=None
|
|
29
|
+
A single service plan ID or a list of service plan IDs to disable within the assigned license.
|
|
30
|
+
"""
|
|
31
|
+
|
|
32
|
+
user_id = resolve_user_id(user)
|
|
33
|
+
|
|
34
|
+
payload = {
|
|
35
|
+
"addLicenses": [
|
|
36
|
+
{
|
|
37
|
+
"skuId": sku_id,
|
|
38
|
+
},
|
|
39
|
+
],
|
|
40
|
+
"removeLicenses": [],
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
if disabled_plans:
|
|
44
|
+
if isinstance(disabled_plans, str):
|
|
45
|
+
disabled_plans = [disabled_plans]
|
|
46
|
+
payload["addLicenses"][0]["disabledPlans"] = disabled_plans
|
|
47
|
+
|
|
48
|
+
_base_api(
|
|
49
|
+
request=f"users/{user_id}/assignLicense",
|
|
50
|
+
client="graph",
|
|
51
|
+
method="post",
|
|
52
|
+
payload=payload,
|
|
53
|
+
)
|
|
54
|
+
|
|
55
|
+
print(
|
|
56
|
+
f"{icons.green_dot} The '{sku_id}' license has been assigned to the user '{user}'."
|
|
57
|
+
)
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
@log
|
|
61
|
+
def remove_user_license(user: str | UUID, sku_ids: UUID | List[UUID]):
|
|
62
|
+
"""
|
|
63
|
+
Removes a license from a user.
|
|
64
|
+
|
|
65
|
+
This is a wrapper function for the following API: `user: assignLicense <https://learn.microsoft.com/graph/api/user-assignlicense>`_.
|
|
66
|
+
|
|
67
|
+
Service Principal Authentication is required (see `here <https://github.com/microsoft/semantic-link-labs/blob/main/notebooks/Service%20Principal.ipynb>`_ for examples).
|
|
68
|
+
|
|
69
|
+
Parameters
|
|
70
|
+
----------
|
|
71
|
+
user : str | uuid.UUID
|
|
72
|
+
The user ID or user principal name.
|
|
73
|
+
sku_id : uuid.UUID
|
|
74
|
+
The SKU ID of the license to remove.
|
|
75
|
+
"""
|
|
76
|
+
|
|
77
|
+
user_id = resolve_user_id(user)
|
|
78
|
+
|
|
79
|
+
if isinstance(sku_ids, str):
|
|
80
|
+
sku_ids = [sku_ids]
|
|
81
|
+
|
|
82
|
+
payload = {
|
|
83
|
+
"addLicenses": [],
|
|
84
|
+
"removeLicenses": sku_ids,
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
_base_api(
|
|
88
|
+
request=f"users/{user_id}/assignLicense",
|
|
89
|
+
client="graph",
|
|
90
|
+
method="post",
|
|
91
|
+
payload=payload,
|
|
92
|
+
)
|
|
93
|
+
|
|
94
|
+
print(
|
|
95
|
+
f"{icons.green_dot} The '{', '.join([str(s) for s in sku_ids])}' license(s) have been removed from the user '{user}'."
|
|
96
|
+
)
|