AYS11231's picture
Upload folder using huggingface_hub
0af0679 verified
# tools.py
import os
import csv
import json
import base64
from dotenv import load_dotenv
from datetime import datetime
try:
import gspread
from google.oauth2.service_account import Credentials
GOOGLE_SHEETS_AVAILABLE = True
except ImportError:
GOOGLE_SHEETS_AVAILABLE = False
CSV_FILE = "user_interest.csv"
SHEET_NAME = "UserInterest"
def _get_google_credentials():
"""
Loads Google credentials either from local file or HF Spaces secret.
Returns a ServiceAccountCredentials object.
"""
load_dotenv(override=True)
scope = ["https://spreadsheets.google.com/feeds", "https://www.googleapis.com/auth/drive"]
google_creds_json = os.getenv("GOOGLE_CREDENTIALS_JSON")
if google_creds_json:
json_str = base64.b64decode(google_creds_json).decode('utf-8')
creds_dict = json.loads(json_str)
creds = Credentials.from_service_account_info(creds_dict, scopes=scope)
print("[info] Loaded Google credentials from environment.")
return creds
raise RuntimeError("Google credentials not found.")
def _save_to_google_sheets(email, name, notes):
creds = _get_google_credentials()
client = gspread.authorize(creds)
sheet = client.open(SHEET_NAME).sheet1
row = [datetime.today().strftime('%Y-%m-%d %H:%M'), email, name, notes]
sheet.append_row(row)
print(f"[Google Sheets] Recorded: {email}, {name}")
def _save_to_csv(email, name, notes):
file_exists = os.path.isfile(CSV_FILE)
with open(CSV_FILE, mode='a', newline='', encoding='utf-8') as f:
writer = csv.writer(f)
if not file_exists:
writer.writerow(["Timestamp", "Email", "Name", "Notes"])
writer.writerow([datetime.today().strftime('%Y-%m-%d %H:%M'), email, name, notes])
print(f"[CSV] Recorded: {email}, {name}")
def _record_user_details(email, name="Name not provided", notes="Not provided"):
try:
if GOOGLE_SHEETS_AVAILABLE:
_save_to_google_sheets(email, name, notes)
else:
raise ImportError("gspread not installed.")
except Exception as e:
print(f"[Warning] Google Sheets write failed, using CSV. Reason: {e}")
_save_to_csv(email, name, notes)
return {"recorded": "ok"}