Query-Pilot / app.py
raghuv-aditya's picture
Transfer of files
4f18307 verified
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/<SheetID>/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()