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,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
+ )