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/file_field/__init__.py b/file_automation/remote/google_drive/delete/__init__.py similarity index 100% rename from file_automation/remote/google_drive/file_field/__init__.py rename to file_automation/remote/google_drive/delete/__init__.py 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..623f3cd --- /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/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..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}') - 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 + + +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/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/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/file_automation/remote/google_drive/upload/upload_to_driver.py b/file_automation/remote/google_drive/upload/upload_to_driver.py index bcb7814..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": "*/*" @@ -26,5 +26,30 @@ 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 + + +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/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 diff --git a/tests/unit_test/remote/google_drive/quick_test.py b/tests/unit_test/remote/google_drive/quick_test.py index 4db0009..a8dca51 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.download.download_file import download_file_from_folder +from file_automation.remote.google_drive.search.search_drive import search_all_file -print(add_folder("new_folder")) +print(search_all_file()) +print(download_file_from_folder("new_folder"))