From 8a20875a50d805f3b54d19b122f3837b43655313 Mon Sep 17 00:00:00 2001 From: JE-Chen Date: Mon, 5 Jun 2023 03:32:17 +0800 Subject: [PATCH 1/4] Add delete file Add delete file --- .../remote/google_drive/delete/__init__.py | 0 .../remote/google_drive/delete/delete_manager.py | 12 ++++++++++++ tests/unit_test/remote/google_drive/quick_test.py | 6 ++++-- 3 files changed, 16 insertions(+), 2 deletions(-) create mode 100644 file_automation/remote/google_drive/delete/__init__.py create mode 100644 file_automation/remote/google_drive/delete/delete_manager.py diff --git a/file_automation/remote/google_drive/delete/__init__.py b/file_automation/remote/google_drive/delete/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/file_automation/remote/google_drive/delete/delete_manager.py b/file_automation/remote/google_drive/delete/delete_manager.py new file mode 100644 index 0000000..3270b0f --- /dev/null +++ b/file_automation/remote/google_drive/delete/delete_manager.py @@ -0,0 +1,12 @@ +from googleapiclient.errors import HttpError + +from file_automation.remote.google_drive.driver_instance import driver_instance + + +def delete_file(file_id: str): + try: + file = driver_instance.service.files().delete(fileId=file_id).execute() + return file + except HttpError as error: + print(F'An error occurred: {error}') + return None diff --git a/tests/unit_test/remote/google_drive/quick_test.py b/tests/unit_test/remote/google_drive/quick_test.py index 4db0009..4aa846d 100644 --- a/tests/unit_test/remote/google_drive/quick_test.py +++ b/tests/unit_test/remote/google_drive/quick_test.py @@ -1,3 +1,5 @@ -from file_automation.remote.google_drive.dir.folder_manager import add_folder +from file_automation.remote.google_drive.search.search_drive import search_all_file +from file_automation.remote.google_drive.delete.delete_manager import delete_file -print(add_folder("new_folder")) +print(search_all_file()) +print(delete_file("1x0HyWIXluTbyfo2UuQbpF62Ks8Dqz0Ud")) From 91adf2a218c079d3f4c737b1b76073f5e5276e14 Mon Sep 17 00:00:00 2001 From: JeffreyChen <33644111+JE-Chen@users.noreply.github.com> Date: Mon, 5 Jun 2023 10:20:51 +0800 Subject: [PATCH 2/4] Refactor and add search file with field Refactor and add search file with field --- dev_requirements.txt | 4 +++ .../google_drive/delete/delete_manager.py | 2 +- .../remote/google_drive/dir/folder_manager.py | 2 +- .../google_drive/download/download_file.py | 4 +-- .../google_drive/file_field/__init__.py | 0 .../google_drive/search/search_drive.py | 29 +++++++++++++++---- .../google_drive/upload/upload_to_driver.py | 2 +- requirements.txt | 4 +++ 8 files changed, 36 insertions(+), 11 deletions(-) delete mode 100644 file_automation/remote/google_drive/file_field/__init__.py diff --git a/dev_requirements.txt b/dev_requirements.txt index a30f299..8bf0168 100644 --- a/dev_requirements.txt +++ b/dev_requirements.txt @@ -1 +1,5 @@ automation_file_dev +google-api-python-client +google-auth-httplib2 +google-auth-oauthlib +APScheduler diff --git a/file_automation/remote/google_drive/delete/delete_manager.py b/file_automation/remote/google_drive/delete/delete_manager.py index 3270b0f..623f3cd 100644 --- a/file_automation/remote/google_drive/delete/delete_manager.py +++ b/file_automation/remote/google_drive/delete/delete_manager.py @@ -8,5 +8,5 @@ def delete_file(file_id: str): file = driver_instance.service.files().delete(fileId=file_id).execute() return file except HttpError as error: - print(F'An error occurred: {error}') + print(f"An error occurred: {error}") return None diff --git a/file_automation/remote/google_drive/dir/folder_manager.py b/file_automation/remote/google_drive/dir/folder_manager.py index 65b4367..90a5b20 100644 --- a/file_automation/remote/google_drive/dir/folder_manager.py +++ b/file_automation/remote/google_drive/dir/folder_manager.py @@ -15,5 +15,5 @@ def add_folder(folder_name: str): ).execute() return file.get("id") except HttpError as error: - print(F'An error occurred: {error}') + print(f"An error occurred: {error}") return None diff --git a/file_automation/remote/google_drive/download/download_file.py b/file_automation/remote/google_drive/download/download_file.py index 2df1a49..5b65ae8 100644 --- a/file_automation/remote/google_drive/download/download_file.py +++ b/file_automation/remote/google_drive/download/download_file.py @@ -16,8 +16,8 @@ def download_file(file_id: str, file_name: str): status, done = downloader.next_chunk() print(F'Download {int(status.progress() * 100)}.') except HttpError as error: - print(F'An error occurred: {error}') - file = None + print(f"An error occurred: {error}") + return None with open(file_name, "wb") as output_file: output_file.write(file.getbuffer()) return file diff --git a/file_automation/remote/google_drive/file_field/__init__.py b/file_automation/remote/google_drive/file_field/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/file_automation/remote/google_drive/search/search_drive.py b/file_automation/remote/google_drive/search/search_drive.py index a938cff..3c91496 100644 --- a/file_automation/remote/google_drive/search/search_drive.py +++ b/file_automation/remote/google_drive/search/search_drive.py @@ -4,11 +4,15 @@ def search_all_file(): - item = dict() - response = driver_instance.service.files().list().execute() - for file in response.get("files", []): - item.update({file.get("name"): file.get("id")}) - return item + try: + item = dict() + response = driver_instance.service.files().list().execute() + for file in response.get("files", []): + item.update({file.get("name"): file.get("id")}) + return item + except HttpError as error: + print(f"An error occurred: {error}") + return None def search_file_mimetype(mime_type: str): @@ -28,5 +32,18 @@ def search_file_mimetype(mime_type: str): break return files except HttpError as error: - print(F'An error occurred: {error}') + print(f"An error occurred: {error}") return None + + +def search_field(field_pattern: str): + try: + files = dict() + response = driver_instance.service.files().list(fields=field_pattern).execute() + for file in response.get("files", []): + files.update({file.get("name"): file.get("id")}) + return files + except HttpError as error: + print(f"An error occurred: {error}") + return None + diff --git a/file_automation/remote/google_drive/upload/upload_to_driver.py b/file_automation/remote/google_drive/upload/upload_to_driver.py index bcb7814..a4e1a9c 100644 --- a/file_automation/remote/google_drive/upload/upload_to_driver.py +++ b/file_automation/remote/google_drive/upload/upload_to_driver.py @@ -26,5 +26,5 @@ def upload_to_drive(file_name: str, file_path: str): return file_id return False except HttpError as error: - print(F'An error occurred: {error}') + print(f"An error occurred: {error}") return None diff --git a/requirements.txt b/requirements.txt index 5080c45..b09bdbc 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1 +1,5 @@ automation_file +google-api-python-client +google-auth-httplib2 +google-auth-oauthlib +APScheduler From 2985fe32483ecf1cd8eaa671ab7ae5e541c0c98c Mon Sep 17 00:00:00 2001 From: JeffreyChen <33644111+JE-Chen@users.noreply.github.com> Date: Mon, 5 Jun 2023 11:11:11 +0800 Subject: [PATCH 3/4] Add share file to user anyone or domain Add share file to user anyone or domain --- .../{manager => share}/__init__.py | 0 .../remote/google_drive/share/share_file.py | 56 +++++++++++++++++++ .../remote/google_drive/quick_test.py | 4 +- 3 files changed, 58 insertions(+), 2 deletions(-) rename file_automation/remote/google_drive/{manager => share}/__init__.py (100%) create mode 100644 file_automation/remote/google_drive/share/share_file.py diff --git a/file_automation/remote/google_drive/manager/__init__.py b/file_automation/remote/google_drive/share/__init__.py similarity index 100% rename from file_automation/remote/google_drive/manager/__init__.py rename to file_automation/remote/google_drive/share/__init__.py diff --git a/file_automation/remote/google_drive/share/share_file.py b/file_automation/remote/google_drive/share/share_file.py new file mode 100644 index 0000000..d5b4022 --- /dev/null +++ b/file_automation/remote/google_drive/share/share_file.py @@ -0,0 +1,56 @@ +from googleapiclient.errors import HttpError + +from file_automation.remote.google_drive.driver_instance import driver_instance + + +def share_file_to_user( + file_id: str, user: str, user_role: str = "writer"): + try: + service = driver_instance.service + user_permission = { + "type": "user", + "role": user_role, + "emailAddress": user + } + return service.permissions().create( + fileId=file_id, + body=user_permission, + fields='id', ).execute() + except HttpError as error: + print(f"An error occurred: {error}") + return None + + +def share_file_to_anyone(file_id: str, share_role: str = "reader"): + try: + service = driver_instance.service + user_permission = { + "type": "anyone", + "value": "anyone", + "role": share_role + } + return service.permissions().create( + fileId=file_id, + body=user_permission, + fields='id', ).execute() + except HttpError as error: + print(f"An error occurred: {error}") + return None + + +def share_file_to_domain( + file_id: str, domain: str, domain_role: str = "reader"): + try: + service = driver_instance.service + domain_permission = { + "type": "domain", + "role": domain_role, + "domain": domain + } + return service.permissions().create( + fileId=file_id, + body=domain_permission, + fields='id', ).execute() + except HttpError as error: + print(f"An error occurred: {error}") + return None diff --git a/tests/unit_test/remote/google_drive/quick_test.py b/tests/unit_test/remote/google_drive/quick_test.py index 4aa846d..531040c 100644 --- a/tests/unit_test/remote/google_drive/quick_test.py +++ b/tests/unit_test/remote/google_drive/quick_test.py @@ -1,5 +1,5 @@ from file_automation.remote.google_drive.search.search_drive import search_all_file -from file_automation.remote.google_drive.delete.delete_manager import delete_file +from file_automation.remote.google_drive.share.share_file import share_file_to_anyone print(search_all_file()) -print(delete_file("1x0HyWIXluTbyfo2UuQbpF62Ks8Dqz0Ud")) +print(share_file_to_anyone("1PlUh-iBEQF4n-0Ew0FfabVuoDZbuFpxc")) From 7e9ced3ed38db29d6868436c19d7da303bbca5d0 Mon Sep 17 00:00:00 2001 From: JeffreyChen <33644111+JE-Chen@users.noreply.github.com> Date: Mon, 5 Jun 2023 11:48:03 +0800 Subject: [PATCH 4/4] Add download from folder Add download from folder --- .../google_drive/download/download_file.py | 22 ++++++++++++++- .../google_drive/upload/upload_to_driver.py | 27 ++++++++++++++++++- .../remote/google_drive/quick_test.py | 4 +-- 3 files changed, 49 insertions(+), 4 deletions(-) diff --git a/file_automation/remote/google_drive/download/download_file.py b/file_automation/remote/google_drive/download/download_file.py index 5b65ae8..1c19395 100644 --- a/file_automation/remote/google_drive/download/download_file.py +++ b/file_automation/remote/google_drive/download/download_file.py @@ -14,10 +14,30 @@ def download_file(file_id: str, file_name: str): done = False while done is False: status, done = downloader.next_chunk() - print(F'Download {int(status.progress() * 100)}.') + print(f"Download {file_name} {int(status.progress() * 100)}%.") except HttpError as error: print(f"An error occurred: {error}") return None with open(file_name, "wb") as output_file: output_file.write(file.getbuffer()) return file + + +def download_file_from_folder(folder_name: str): + try: + files = dict() + response = driver_instance.service.files().list( + q=f"mimeType = 'application/vnd.google-apps.folder' and name = '{folder_name}'" + ).execute() + folder = response.get("files", [])[0] + folder_id = folder.get("id") + response = driver_instance.service.files().list( + q=f"'{folder_id}' in parents" + ).execute() + for file in response.get("files", []): + download_file(file.get("id"), file.get("name")) + files.update({file.get("name"): file.get("id")}) + return files + except HttpError as error: + print(f"An error occurred: {error}") + return None \ No newline at end of file diff --git a/file_automation/remote/google_drive/upload/upload_to_driver.py b/file_automation/remote/google_drive/upload/upload_to_driver.py index a4e1a9c..677127a 100644 --- a/file_automation/remote/google_drive/upload/upload_to_driver.py +++ b/file_automation/remote/google_drive/upload/upload_to_driver.py @@ -8,7 +8,7 @@ def upload_to_drive(file_name: str, file_path: str): try: - if Path(file_path).is_file(): + if Path(file_path).exists(): file_metadata = { "name": file_name, "mimeType": "*/*" @@ -28,3 +28,28 @@ def upload_to_drive(file_name: str, file_path: str): except HttpError as error: print(f"An error occurred: {error}") return None + + +def upload_to_dir(folder_id: str, file_name: str, file_path: str): + try: + if Path(file_path).exists(): + file_metadata = { + "name": file_name, + "mimeType": "*/*", + "parents": [f"{folder_id}"] + } + media = MediaFileUpload( + file_path, + mimetype="*/*", + resumable=True + ) + file_id = driver_instance.service.files().create( + body=file_metadata, + media_body=media, + fields="id" + ).execute() + return file_id + return False + except HttpError as error: + print(f"An error occurred: {error}") + return None diff --git a/tests/unit_test/remote/google_drive/quick_test.py b/tests/unit_test/remote/google_drive/quick_test.py index 531040c..a8dca51 100644 --- a/tests/unit_test/remote/google_drive/quick_test.py +++ b/tests/unit_test/remote/google_drive/quick_test.py @@ -1,5 +1,5 @@ +from file_automation.remote.google_drive.download.download_file import download_file_from_folder from file_automation.remote.google_drive.search.search_drive import search_all_file -from file_automation.remote.google_drive.share.share_file import share_file_to_anyone print(search_all_file()) -print(share_file_to_anyone("1PlUh-iBEQF4n-0Ew0FfabVuoDZbuFpxc")) +print(download_file_from_folder("new_folder"))