Source code for operators.gdrive.gdrive_folder
"""Google Drive Folder Creation Operator."""
from __future__ import annotations
from typing import Sequence
from airflow.utils.context import Context
from operators.gdrive.gdrive_base import GDriveBaseOperator
[docs]
class GDriveCreateFolderOperator(GDriveBaseOperator):
"""
Create a folder in Google Drive (or return existing if it already exists).
:param folder_name: Name of the folder to create
:param google_drive_id: Parent folder ID (inherited from base class)
Returns dict with keys: id, name, webViewLink
"""
template_fields: Sequence[str] = GDriveBaseOperator.template_fields + (
"folder_name",
)
ui_color = "#A6E6A6"
def __init__(
self,
*,
folder_name: str,
google_drive_id: str,
**kwargs,
):
super().__init__(google_drive_id=google_drive_id, **kwargs)
self.folder_name = folder_name
def _find_existing_folder(self) -> dict | None:
"""Find existing folder by name in parent."""
query = (
f"'{self.google_drive_id}' in parents "
f"and name = '{self.folder_name}' "
f"and mimeType = 'application/vnd.google-apps.folder' "
f"and trashed = false"
)
result = (
self.drive.files()
.list(
q=query,
fields="files(id, name, webViewLink)",
supportsAllDrives=True,
includeItemsFromAllDrives=True,
corpora="allDrives",
)
.execute()
)
files = result.get("files", [])
return files[0] if files else None
[docs]
def execute(self, context: Context) -> dict:
existing = self._find_existing_folder()
if existing:
self.log.info(
"Folder '%s' already exists (id=%s)",
self.folder_name,
existing["id"],
)
return existing
self.log.info(
"Creating folder '%s' in parent '%s'",
self.folder_name,
self.google_drive_id,
)
file_metadata = {
"name": self.folder_name,
"mimeType": "application/vnd.google-apps.folder",
"parents": [self.google_drive_id],
}
created = (
self.drive.files()
.create(
body=file_metadata,
fields="id, name, webViewLink",
supportsAllDrives=True,
)
.execute()
)
self.log.info(
"Created folder '%s' (id=%s) - %s",
created.get("name"),
created.get("id"),
created.get("webViewLink"),
)
return created