feat: Get data from google sheets
All checks were successful
Build Docker / BuildImage (push) Successful in 48s

This commit is contained in:
2025-09-29 21:32:49 +10:00
parent d17ab73dce
commit a546da0191
3 changed files with 66 additions and 23 deletions

12
.env.example Normal file
View File

@@ -0,0 +1,12 @@
# Google Sheets Configuration
# To use a Google Sheet as your data source, add the URL here
# Make sure the sheet is publicly viewable or shared with "Anyone with the link can view"
#
# Format 1: Direct CSV export URL
# GOOGLE_SHEET_URL=https://docs.google.com/spreadsheets/d/YOUR_SHEET_ID/export?format=csv
#
# Format 2: Regular Google Sheets URL (will be converted automatically)
# GOOGLE_SHEET_URL=https://docs.google.com/spreadsheets/d/YOUR_SHEET_ID/edit#gid=0
#
# Example:
# GOOGLE_SHEET_URL=https://docs.google.com/spreadsheets/d/1AbCdEfGhIjKlMnOpQrStUvWxYz/edit#gid=0

3
.gitignore vendored
View File

@@ -3,5 +3,4 @@ __pycache__/
.env .env
.vs/ .vs/
.venv/ .venv/
schedule_data.json

View File

@@ -15,14 +15,62 @@ import json
import requests import requests
from datetime import datetime from datetime import datetime
import dotenv import dotenv
import csv
from io import StringIO
dotenv.load_dotenv() dotenv.load_dotenv()
def load_schedule_data(): def load_schedule_data():
"""Load schedule data from JSON file""" """Load schedule data from Google Sheets or fallback to JSON file"""
# Try to load from Google Sheets first
google_sheet_url = os.getenv('GOOGLE_SHEET_URL')
if google_sheet_url:
try:
# Convert Google Sheets URL to CSV export URL
if '/edit' in google_sheet_url:
csv_url = google_sheet_url.replace('/edit#gid=', '/export?format=csv&gid=')
csv_url = csv_url.replace('/edit', '/export?format=csv')
else:
csv_url = google_sheet_url
print(f"Fetching schedule from Google Sheets: {csv_url}")
response = requests.get(csv_url, timeout=10)
response.raise_for_status()
# Parse CSV data
csv_data = StringIO(response.text)
reader = csv.DictReader(csv_data)
schedule = []
for row in reader:
# Map CSV columns to our expected format
# Expected columns: Date, Primary Leader, Secondary Leader, Topic
schedule_item = {
"date": row.get('Date', '').strip(),
"primary_leader": row.get('Primary Leader', '').strip(),
"secondary_leader": row.get('Secondary Leader', '').strip(),
"topic": row.get('Topic', '').strip()
}
# Only add rows that have at least a date and topic
if schedule_item['date'] and schedule_item['topic']:
schedule.append(schedule_item)
print(f"Successfully loaded {len(schedule)} items from Google Sheets")
return schedule
except requests.RequestException as e:
print(f"Error fetching from Google Sheets: {e}")
except Exception as e:
print(f"Error parsing Google Sheets data: {e}")
# Fallback to JSON file
try: try:
with open('schedule_data.json', 'r') as f: with open('schedule_data.json', 'r') as f:
data = json.load(f) data = json.load(f)
print("Loaded schedule from local JSON file")
return data.get('schedule', []) return data.get('schedule', [])
except FileNotFoundError: except FileNotFoundError:
print("Warning: schedule_data.json not found. Using empty schedule.") print("Warning: schedule_data.json not found. Using empty schedule.")
@@ -120,33 +168,17 @@ def catch_all(path: str):
# region API routes # region API routes
api_requests = 0
@app.route("/api/v1/data", methods=["GET"])
def api_data():
"""
Example API endpoint that returns some data.
You can modify this to return whatever data you need.
"""
global api_requests
api_requests += 1
data = {
"header": "Sample API Response",
"content": f"Hello, this is a sample API response! You have called this endpoint {api_requests} times.",
"timestamp": datetime.now().isoformat(),
}
return jsonify(data)
@app.route("/api/v1/schedule", methods=["GET"]) @app.route("/api/v1/schedule", methods=["GET"])
def api_schedule(): def api_schedule():
""" """
API endpoint that returns the weekly schedule data. API endpoint that returns the weekly schedule data.
""" """
# Reload data in case file has been updated # Always reload data in case Google Sheet has been updated
current_schedule = load_schedule_data() current_schedule = load_schedule_data()
# Set the global variable to the latest data
global SCHEDULE_DATA
SCHEDULE_DATA = current_schedule
return jsonify({"schedule": current_schedule}) return jsonify({"schedule": current_schedule})
# endregion # endregion