From 7ad1a0c9da94fa96def4a53a0e167808cda57f2a Mon Sep 17 00:00:00 2001 From: vgrem Date: Sat, 16 Mar 2024 16:27:41 +0200 Subject: [PATCH] Initial support for sitepages namespace in OneDrive, download_folder method --- examples/onedrive/folders/upload.py | 4 +- generator/metadata/MicrosoftGraph.xml | 243 +++++++++++++++------ office365/onedrive/driveitems/driveItem.py | 46 ++++ 3 files changed, 229 insertions(+), 64 deletions(-) diff --git a/examples/onedrive/folders/upload.py b/examples/onedrive/folders/upload.py index ddfab343..9ebfcb50 100644 --- a/examples/onedrive/folders/upload.py +++ b/examples/onedrive/folders/upload.py @@ -16,5 +16,5 @@ def print_progress(uploaded_file): test_tenant, test_client_id, test_username, test_password ) local_path = "../../data" -target_folder = client.me.drive.root.get_by_path("Import") -target_folder.upload_folder(local_path, print_progress).execute_query() +drive_item = client.me.drive.root.get_by_path("Import") +drive_item.upload_folder(local_path, print_progress).execute_query() diff --git a/generator/metadata/MicrosoftGraph.xml b/generator/metadata/MicrosoftGraph.xml index 22c9954d..91f88640 100644 --- a/generator/metadata/MicrosoftGraph.xml +++ b/generator/metadata/MicrosoftGraph.xml @@ -495,25 +495,25 @@ - + - + - + - + - + - + - + @@ -564,25 +564,25 @@ - + - + - + - + - + - + - + @@ -2180,6 +2180,9 @@ + + + @@ -3300,46 +3303,46 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -7601,7 +7604,11 @@ - + + + + Org.OData.Core.V1.Permission/Read + @@ -7832,7 +7839,7 @@ - + @@ -7919,7 +7926,11 @@ - + + + + Org.OData.Core.V1.Permission/Read + @@ -8096,13 +8107,21 @@ - + + + + Org.OData.Core.V1.Permission/Read + - + + + + Org.OData.Core.V1.Permission/Read + @@ -8123,7 +8142,11 @@ - + + + + Org.OData.Core.V1.Permission/Read + @@ -8144,7 +8167,11 @@ - + + + + Org.OData.Core.V1.Permission/Read + @@ -8159,7 +8186,11 @@ - + + + + Org.OData.Core.V1.Permission/Read + @@ -8183,7 +8214,11 @@ - + + + + Org.OData.Core.V1.Permission/Read + @@ -8198,31 +8233,51 @@ - + + + + Org.OData.Core.V1.Permission/Read + - + + + + Org.OData.Core.V1.Permission/Read + - + + + + Org.OData.Core.V1.Permission/Read + - + + + + Org.OData.Core.V1.Permission/Read + - + - + - + - + - + + + + Org.OData.Core.V1.Permission/Read + @@ -8231,10 +8286,18 @@ - + + + + Org.OData.Core.V1.Permission/Read + - + + + + Org.OData.Core.V1.Permission/Read + @@ -8363,7 +8426,11 @@ - + + + + Org.OData.Core.V1.Permission/Read + @@ -9350,10 +9417,10 @@ - + - + @@ -12719,6 +12786,12 @@ + + + + + + @@ -14858,41 +14931,44 @@ + + + - + - + - + - + - + - + - + - + - + - + - + - + @@ -18308,6 +18384,7 @@ + @@ -29936,6 +30013,9 @@ + + + @@ -30271,6 +30351,7 @@ + @@ -33389,6 +33470,9 @@ + + + @@ -36971,6 +37055,18 @@ + + + + + + + + + + + + @@ -38586,6 +38682,14 @@ + + + + + + + + @@ -39019,6 +39123,10 @@ + + + + @@ -39086,6 +39194,7 @@ + @@ -39130,6 +39239,7 @@ + @@ -39145,6 +39255,7 @@ + @@ -39237,6 +39348,14 @@ + + + + + + + + diff --git a/office365/onedrive/driveitems/driveItem.py b/office365/onedrive/driveitems/driveItem.py index c8c7ef0f..9d67433e 100644 --- a/office365/onedrive/driveitems/driveItem.py +++ b/office365/onedrive/driveitems/driveItem.py @@ -328,6 +328,52 @@ def _save_content(return_type): self.get_content().after_execute(_save_content) return self + def download_folder( + self, download_file, after_file_downloaded=None, recursive=True + ): + # type: (IO, Callable[[File], None], bool) -> "DriveItem" + """ + Download the folder content + """ + import zipfile + + def _after_file_downloaded(drive_item, base_path, result): + # type: ("DriveItem", str, ClientResult[AnyStr]) -> None + with zipfile.ZipFile(download_file.name, "a", zipfile.ZIP_DEFLATED) as zf: + zip_path = ( + "/".join([base_path, drive_item.name]) + if base_path is not None + else drive_item.name + ) + zf.writestr(zip_path, result.value) + if callable(after_file_downloaded): + after_file_downloaded(drive_item) + + def _after_folder_downloaded(parent_item, base_path=None): + # type: ("DriveItem", str) -> None + for drive_item in parent_item.children: + if drive_item.is_file: + drive_item.get_content().after_execute( + partial(_after_file_downloaded, drive_item, base_path) + ) + else: + if recursive: + if base_path is None: + next_base_path = str(drive_item.name) + else: + next_base_path = "/".join([base_path, drive_item.name]) + _download_folder(drive_item, next_base_path) + + def _download_folder(drive_item, prev_result=None): + # type: ("DriveItem", str) -> None + drive_item.ensure_properties( + ["children", "name"], + partial(_after_folder_downloaded, drive_item, prev_result), + ) + + _download_folder(self) + return self + def download_session( self, file_object, chunk_downloaded=None, chunk_size=1024 * 1024 ):