import gradio as gr from modules.data_processor import process_query_and_update_csv, extract_column_name, process_query_and_update_sheets from modules.gsheet_handler import fetch_google_sheet_data, update_google_sheet import pandas as pd import tempfile from google.oauth2.service_account import Credentials import json import gspread def preview_columns(file=None, credentials=None, sheet_id=None, sheet_name=None): """ Preview columns from the uploaded CSV file or Google Sheet. """ try: if file: df = pd.read_csv(file.name) elif credentials and sheet_id and sheet_name: df = fetch_google_sheet_data(credentials.name, sheet_id, sheet_name) else: return "No data source provided", [] return df.head(), list(df.columns) except Exception as e: return str(e), [] def process_data(file=None, credentials=None, sheet_id=None, sheet_name=None, query_template=None): """ Process data using the provided query template and return the updated DataFrame and CSV file path. """ try: if file: print(file.name) updated_df = process_query_and_update_csv(file.name, query_template) elif credentials and sheet_id and sheet_name: # credentials_path = credentials.name # The file path for the credentials JSON # # Use gspread to authenticate and fetch the data # gc = gspread.service_account(credentials_path) # Pass the path of the credentials file # print("Dddddddddd") # sh = gc.open_by_url(sheet_id) # Open the Google Sheet by URL # worksheet = sh.worksheet(sheet_name) # Access the specified worksheet # # Extract all values from the sheet # values = worksheet.get_all_values() # df = pd.DataFrame(values[1:], columns=values[0]) # print(df) df = fetch_google_sheet_data(credentials.name, sheet_id, sheet_name) # Process the data with the query template # print(df) # print("krsghvkrgsnker") updated_df = process_query_and_update_sheets(credentials.name, df, query_template) # update_google_sheet(credentials.name, sheet_id, sheet_name, updated_df) else: return None, "No data source provided" # Write DataFrame to a temporary file for download temp_file = tempfile.NamedTemporaryFile(delete=False, suffix=".csv") updated_df.to_csv(temp_file.name, index=False) return updated_df, temp_file.name # Return DataFrame and file path except Exception as e: return pd.DataFrame(), str(e) def update_sheet(credentials, sheet_id, sheet_name, processed_df): """ Update the Google Sheet with the processed data. """ try: update_google_sheet(credentials.name, sheet_id, sheet_name, processed_df) return "Google Sheet updated successfully!" except Exception as e: return str(e) # Gradio Interface # Gradio Interface with Information def gradio_app(): with gr.Blocks(theme=gr.themes.Citrus()) as app: # General Information gr.Markdown(""" # CSV/Google Sheets Query Processor Dashboard This application allows you to: - Upload a CSV file or connect to a Google Sheet. - Preview the data to understand the structure and available columns. - Process the data by executing query templates that extract or manipulate information. - Download the processed data as a CSV file or update the Google Sheet directly. **Note**: This app uses my personal OpenAI API key and SERP API key, which have limited free API calls. If the app does not work due to API limits, you can: 1. Visit the [GitHub Repository](https://github.com/your-repo-url). 2. Download the project. 3. Use your own API keys to run it locally. For help setting up, refer to the documentation in the GitHub repository. """) # States to store independent data for CSV and Google Sheets csv_data_state = gr.State(None) # To store CSV data sheet_data_state = gr.State(None) # To store Google Sheets data with gr.Tabs(): with gr.TabItem("CSV File"): # CSV Tab Information gr.Markdown(""" ## **CSV File Operations** 1. Upload a CSV file to preview its columns and structure. 2. Enter a query template using placeholders like `{ColumnName}` to extract or modify data. 3. Process the CSV and download the updated file. **Sample Query Template**: `Get me the name of the CEO of {Company}` Replace `{Company}` with the column name containing company names. """) csv_file = gr.File(label="Upload CSV File") query_template_csv = gr.Textbox(label="CSV Query Template (e.g., 'Get me the name of CEO of {Company}')") with gr.Row(): preview_button_csv = gr.Button("Preview Columns") process_button_csv = gr.Button("Process Queries") preview_output_csv = gr.Dataframe(label="CSV Data Preview") processed_output_csv = gr.Dataframe(label="Processed CSV Data") download_button_csv = gr.File(label="Download Processed CSV") with gr.TabItem("Google Sheets"): # Google Sheets Tab Information gr.Markdown(""" ## **Google Sheets Operations** This section allows you to connect to a Google Sheet and perform data queries. **Steps to Use**: 1. **Provide Google Service Account Credentials**: - Create a Service Account in Google Cloud Console. - Download the Service Account credentials as a JSON file. - Share the Google Sheet with the Service Account's email (found in the JSON file under `client_email`). 2. **Enter the Google Sheet ID**: - The Google Sheet ID is the part of the URL between `/d/` and `/edit`, for example: `https://docs.google.com/spreadsheets/d//edit` 3. **Enter the Sheet Name**: - This is the name of the specific worksheet (tab) within the Google Sheet, e.g., `Sheet1`. **Example Input**: - Google Sheet ID: `1aBcDeFgHiJkLmNoPqRsTuVwXyZ0123456789` - Sheet Name: `SalesData` **Sample Query Template**: `Get me the revenue of {Product}` Replace `{Product}` with the column name containing product names. """) credentials = gr.File(label="Google Service Account Credentials (JSON)") sheet_id = gr.Textbox(label="Google Sheet ID") sheet_name = gr.Textbox(label="Google Sheet Name (e.g., Sheet1)") query_template_sheet = gr.Textbox(label="Google Sheets Query Template (e.g., 'Get me the revenue of {Product}')") with gr.Row(): preview_button_sheet = gr.Button("Preview Columns") process_button_sheet = gr.Button("Process Queries") update_button = gr.Button("Update Google Sheet") preview_output_sheet = gr.Dataframe(label="Google Sheet Data Preview") processed_output_sheet = gr.Dataframe(label="Processed Google Sheet Data") download_button_sheet = gr.File(label="Download Processed CSV") update_status = gr.Textbox(label="Update Status", interactive=False) # Button Interactions for CSV preview_button_csv.click( preview_columns, inputs=[csv_file, gr.State(None), gr.State(None), gr.State(None)], # Pass placeholders for unused inputs outputs=[preview_output_csv, csv_data_state], ) process_button_csv.click( process_data, inputs=[csv_file, gr.State(None), gr.State(None), gr.State(None), query_template_csv], outputs=[processed_output_csv, download_button_csv], ) # Button Interactions for Google Sheets preview_button_sheet.click( preview_columns, inputs=[gr.State(None), credentials, sheet_id, sheet_name], outputs=[preview_output_sheet, sheet_data_state], ) process_button_sheet.click( process_data, inputs=[gr.State(None), credentials, sheet_id, sheet_name, query_template_sheet], outputs=[processed_output_sheet, download_button_sheet], ) update_button.click( update_sheet, inputs=[credentials, sheet_id, sheet_name, processed_output_sheet], outputs=[update_status], ) return app if __name__ == "__main__": app = gradio_app() app.launch()