diff --git a/CHANGELOG.md b/CHANGELOG.md index 4c1b098..4354120 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # Changelog +## [Version 1.1.7](https://github.com/dataiku/dss-plugin-sharepoint-online/releases/tag/v1.1.7) - Bugfix release - 2025-05-14 + +- Add recursive folder deletion + ## [Version 1.1.6](https://github.com/dataiku/dss-plugin-sharepoint-online/releases/tag/v1.1.6) - Bugfix release - 2025-04-01 - Fix issue with 255+ chars file paths. The new limit is 400 chars, imposed by SharePoint's API. diff --git a/plugin.json b/plugin.json index 9f1bbbc..3aca14d 100644 --- a/plugin.json +++ b/plugin.json @@ -1,6 +1,6 @@ { "id": "sharepoint-online", - "version": "1.1.6", + "version": "1.1.7", "meta": { "label": "SharePoint Online", "description": "Read and write data from/to your SharePoint Online account", diff --git a/python-fs-providers/sharepoint-online_shared-documents/fs-provider.py b/python-fs-providers/sharepoint-online_shared-documents/fs-provider.py index 2a05133..13a7d42 100644 --- a/python-fs-providers/sharepoint-online_shared-documents/fs-provider.py +++ b/python-fs-providers/sharepoint-online_shared-documents/fs-provider.py @@ -204,11 +204,36 @@ def delete_recursive(self, path): return 1 if folder is not None: + file_count = self.delete(get_lnt_path(full_path)) + logger.info("deleting folder '{}'".format(get_lnt_path(full_path))) self.client.recycle_folder(get_lnt_path(full_path)) - return 1 + return file_count return 0 + def delete(self, path, file_count=0): + # logger.info("call delete '{}'".format(path)) + files = self.client.get_files(path) + files = self.client.extract_results(files) + for file in files: + file_name = file.get("Name") + if file_name: + file_path = "/".join([path, file_name]) + logger.info("deleting file '{}'".format(get_lnt_path(file_path))) + self.client.recycle_file(get_lnt_path(file_path)) + file_count += 1 + folders = self.client.get_folders(path) + folders = self.client.extract_results(folders) + for folder in folders: + folder_name = folder.get("Name") + if folder_name: + folder_path = "/".join([path, folder_name]) + # logger.info("deleting content of folder '{}'".format(get_lnt_path(folder_path))) + file_count = self.delete(get_lnt_path(folder_path), file_count) + logger.info("deleting folder '{}'".format(get_lnt_path(folder_path))) + self.client.recycle_folder(get_lnt_path(folder_path)) + return file_count + def move(self, from_path, to_path): assert_valid_sharepoint_path(from_path) assert_no_percent_in_path(from_path) diff --git a/python-lib/dss_constants.py b/python-lib/dss_constants.py index 6e4f7d3..9a31951 100644 --- a/python-lib/dss_constants.py +++ b/python-lib/dss_constants.py @@ -37,7 +37,7 @@ class DSSConstants(object): "sharepoint_oauth": "The access token is missing" } PATH = 'path' - PLUGIN_VERSION = "1.1.6" + PLUGIN_VERSION = "1.1.7-beta.1" SECRET_PARAMETERS_KEYS = ["Authorization", "sharepoint_username", "sharepoint_password", "client_secret", "client_certificate", "passphrase"] SITE_APP_DETAILS = { "sharepoint_tenant": "The tenant name is missing", diff --git a/python-lib/sharepoint_client.py b/python-lib/sharepoint_client.py index 923258e..881a736 100644 --- a/python-lib/sharepoint_client.py +++ b/python-lib/sharepoint_client.py @@ -802,8 +802,7 @@ def get_list_default_view_url(self, list_title): ) def get_path_as_query_string(self, path): - if path: - if path == '/': + if path is None or path == '/': path = "" return "?@a1='{}'".format( url_encode(self.get_site_path(path))