generated from nathanwoodburn/python-webserver-template
feat: Make leaders more flexible
Some checks failed
Build Docker / BuildImage (push) Failing after 2m22s
Some checks failed
Build Docker / BuildImage (push) Failing after 2m22s
This commit is contained in:
53
server.py
53
server.py
@@ -1,77 +1,77 @@
|
||||
from functools import cache
|
||||
import json
|
||||
from flask import (
|
||||
Flask,
|
||||
make_response,
|
||||
redirect,
|
||||
request,
|
||||
jsonify,
|
||||
render_template,
|
||||
send_from_directory,
|
||||
send_file,
|
||||
)
|
||||
import os
|
||||
import json
|
||||
import requests
|
||||
from datetime import datetime
|
||||
import dotenv
|
||||
import csv
|
||||
from io import StringIO
|
||||
|
||||
dotenv.load_dotenv()
|
||||
|
||||
|
||||
def load_schedule_data():
|
||||
"""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')
|
||||
|
||||
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')
|
||||
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
|
||||
leaders_str = row.get("Leaders", "").strip()
|
||||
# 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()
|
||||
"date": row.get("Date", "").strip(),
|
||||
"leaders": [leader for leader in leaders_str.split(", ") if leader]
|
||||
if leaders_str
|
||||
else [],
|
||||
"topic": row.get("Topic", "").strip(),
|
||||
}
|
||||
|
||||
|
||||
# Only add rows that have at least a date and topic
|
||||
if schedule_item['date'] and schedule_item['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:
|
||||
with open('schedule_data.json', 'r') as f:
|
||||
with open("schedule_data.json", "r") as f:
|
||||
data = json.load(f)
|
||||
print("Loaded schedule from local JSON file")
|
||||
return data.get('schedule', [])
|
||||
return data.get("schedule", [])
|
||||
except FileNotFoundError:
|
||||
print("Warning: schedule_data.json not found. Using empty schedule.")
|
||||
return []
|
||||
@@ -79,6 +79,7 @@ def load_schedule_data():
|
||||
print("Warning: Invalid JSON in schedule_data.json. Using empty schedule.")
|
||||
return []
|
||||
|
||||
|
||||
# Load schedule data from JSON file
|
||||
SCHEDULE_DATA = load_schedule_data()
|
||||
|
||||
@@ -90,6 +91,7 @@ def find(name, path):
|
||||
if name in files:
|
||||
return os.path.join(root, name)
|
||||
|
||||
|
||||
# Assets routes
|
||||
@app.route("/assets/<path:path>")
|
||||
def send_assets(path):
|
||||
@@ -181,6 +183,7 @@ def api_schedule():
|
||||
SCHEDULE_DATA = current_schedule
|
||||
return jsonify({"schedule": current_schedule})
|
||||
|
||||
|
||||
# endregion
|
||||
|
||||
|
||||
|
||||
@@ -43,10 +43,10 @@
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for item in schedule %}
|
||||
<tr class="{% if not item.primary_leader and not item.secondary_leader %}special-event{% endif %}">
|
||||
<tr class="{% if not item.leaders %}special-event{% endif %}">
|
||||
<td class="date-cell">{{ item.date }}</td>
|
||||
<td class="leader-cell">{% if item.primary_leader %}{{ item.primary_leader }}{% endif %}{% if item.primary_leader and item.secondary_leader %} & {% endif %}{% if item.secondary_leader %}{{ item.secondary_leader }}{% endif %}</td>
|
||||
<td class="topic-cell" {% if item.primary_leader or item.secondary_leader %}data-leaders="Leaders: {% if item.primary_leader %}{{ item.primary_leader }}{% endif %}{% if item.primary_leader and item.secondary_leader %} & {% endif %}{% if item.secondary_leader %}{{ item.secondary_leader }}{% endif %}"{% endif %}>{{ item.topic }}</td>
|
||||
<td class="leader-cell">{% if item.leaders %}{% if item.leaders|length > 1 %}{{ item.leaders[:-1]|join(', ') }} & {{ item.leaders[-1] }}{% else %}{{ item.leaders[0] }}{% endif %}{% endif %}</td>
|
||||
<td class="topic-cell" {% if item.leaders %}data-leaders="Leaders: {% if item.leaders|length > 1 %}{{ item.leaders[:-1]|join(', ') }} & {{ item.leaders[-1] }}{% else %}{{ item.leaders[0] }}{% endif %}"{% endif %}>{{ item.topic }}</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
@@ -102,6 +102,8 @@
|
||||
});
|
||||
});
|
||||
</script>
|
||||
|
||||
{# <script>console.log({{schedule | tojson}});</script> #}
|
||||
</body>
|
||||
|
||||
</html>
|
||||
|
||||
Reference in New Issue
Block a user