| | import json |
| |
|
| | from google.oauth2.credentials import Credentials |
| | from googleapiclient.discovery import build |
| |
|
| | from langflow.custom import Component |
| | from langflow.inputs import DropdownInput, MessageTextInput |
| | from langflow.io import SecretStrInput |
| | from langflow.schema import Data |
| | from langflow.template import Output |
| |
|
| |
|
| | class GoogleDriveSearchComponent(Component): |
| | display_name = "Google Drive Search" |
| | description = "Searches Google Drive files using provided credentials and query parameters." |
| | icon = "Google" |
| |
|
| | inputs = [ |
| | SecretStrInput( |
| | name="token_string", |
| | display_name="Token String", |
| | info="JSON string containing OAuth 2.0 access token information for service account access", |
| | required=True, |
| | ), |
| | DropdownInput( |
| | name="query_item", |
| | display_name="Query Item", |
| | options=[ |
| | "name", |
| | "fullText", |
| | "mimeType", |
| | "modifiedTime", |
| | "viewedByMeTime", |
| | "trashed", |
| | "starred", |
| | "parents", |
| | "owners", |
| | "writers", |
| | "readers", |
| | "sharedWithMe", |
| | "createdTime", |
| | "properties", |
| | "appProperties", |
| | "visibility", |
| | "shortcutDetails.targetId", |
| | ], |
| | info="The field to query.", |
| | required=True, |
| | ), |
| | DropdownInput( |
| | name="valid_operator", |
| | display_name="Valid Operator", |
| | options=["contains", "=", "!=", "<=", "<", ">", ">=", "in", "has"], |
| | info="Operator to use in the query.", |
| | required=True, |
| | ), |
| | MessageTextInput( |
| | name="search_term", |
| | display_name="Search Term", |
| | info="The value to search for in the specified query item.", |
| | required=True, |
| | ), |
| | MessageTextInput( |
| | name="query_string", |
| | display_name="Query String", |
| | info="The query string used for searching. You can edit this manually.", |
| | value="", |
| | ), |
| | ] |
| |
|
| | outputs = [ |
| | Output(display_name="Document URLs", name="doc_urls", method="search_doc_urls"), |
| | Output(display_name="Document IDs", name="doc_ids", method="search_doc_ids"), |
| | Output(display_name="Document Titles", name="doc_titles", method="search_doc_titles"), |
| | Output(display_name="Data", name="Data", method="search_data"), |
| | ] |
| |
|
| | def generate_query_string(self) -> str: |
| | query_item = self.query_item |
| | valid_operator = self.valid_operator |
| | search_term = self.search_term |
| |
|
| | |
| | query = f"{query_item} {valid_operator} '{search_term}'" |
| |
|
| | |
| | self.query_string = query |
| |
|
| | return query |
| |
|
| | def on_inputs_changed(self) -> None: |
| | |
| | self.generate_query_string() |
| |
|
| | def generate_file_url(self, file_id: str, mime_type: str) -> str: |
| | """Generates the appropriate Google Drive URL for a file based on its MIME type.""" |
| | return { |
| | "application/vnd.google-apps.document": f"https://docs.google.com/document/d/{file_id}/edit", |
| | "application/vnd.google-apps.spreadsheet": f"https://docs.google.com/spreadsheets/d/{file_id}/edit", |
| | "application/vnd.google-apps.presentation": f"https://docs.google.com/presentation/d/{file_id}/edit", |
| | "application/vnd.google-apps.drawing": f"https://docs.google.com/drawings/d/{file_id}/edit", |
| | "application/pdf": f"https://drive.google.com/file/d/{file_id}/view?usp=drivesdk", |
| | }.get(mime_type, f"https://drive.google.com/file/d/{file_id}/view?usp=drivesdk") |
| |
|
| | def search_files(self) -> dict: |
| | |
| | token_info = json.loads(self.token_string) |
| | creds = Credentials.from_authorized_user_info(token_info) |
| |
|
| | |
| | query = self.query_string or self.generate_query_string() |
| |
|
| | |
| | service = build("drive", "v3", credentials=creds) |
| |
|
| | |
| | results = service.files().list(q=query, pageSize=5, fields="nextPageToken, files(id, name, mimeType)").execute() |
| | items = results.get("files", []) |
| |
|
| | doc_urls = [] |
| | doc_ids = [] |
| | doc_titles_urls = [] |
| | doc_titles = [] |
| |
|
| | if items: |
| | for item in items: |
| | |
| | file_id = item["id"] |
| | file_title = item["name"] |
| | mime_type = item["mimeType"] |
| | file_url = self.generate_file_url(file_id, mime_type) |
| |
|
| | |
| | doc_urls.append(file_url) |
| | doc_ids.append(file_id) |
| | doc_titles.append(file_title) |
| | doc_titles_urls.append({"title": file_title, "url": file_url}) |
| |
|
| | return {"doc_urls": doc_urls, "doc_ids": doc_ids, "doc_titles_urls": doc_titles_urls, "doc_titles": doc_titles} |
| |
|
| | def search_doc_ids(self) -> list[str]: |
| | return self.search_files()["doc_ids"] |
| |
|
| | def search_doc_urls(self) -> list[str]: |
| | return self.search_files()["doc_urls"] |
| |
|
| | def search_doc_titles(self) -> list[str]: |
| | return self.search_files()["doc_titles"] |
| |
|
| | def search_data(self) -> Data: |
| | return Data(data={"text": self.search_files()["doc_titles_urls"]}) |
| |
|