Update app.py
Browse files
app.py
CHANGED
|
@@ -1,95 +1,95 @@
|
|
| 1 |
-
from flask import Flask, request, render_template, jsonify, redirect
|
| 2 |
-
import json
|
| 3 |
-
from datetime import datetime, timedelta
|
| 4 |
-
import os
|
| 5 |
-
from flask_cors import CORS
|
| 6 |
-
|
| 7 |
-
app = Flask(__name__)
|
| 8 |
-
CORS(app) # Enable CORS for all routes (for front-end testing on a different port/domain)
|
| 9 |
-
DATA_FILE = 'events.json'
|
| 10 |
-
|
| 11 |
-
def load_events():
|
| 12 |
-
if not os.path.exists(DATA_FILE):
|
| 13 |
-
return []
|
| 14 |
-
with open(DATA_FILE, 'r') as f:
|
| 15 |
-
return json.load(f)
|
| 16 |
-
|
| 17 |
-
def save_events(events):
|
| 18 |
-
with open(DATA_FILE, 'w') as f:
|
| 19 |
-
json.dump(events, f, indent=2)
|
| 20 |
-
|
| 21 |
-
def get_upcoming_reminders(events):
|
| 22 |
-
now = datetime.now()
|
| 23 |
-
end = now + timedelta(hours=4)
|
| 24 |
-
upcoming = []
|
| 25 |
-
|
| 26 |
-
for e in events:
|
| 27 |
-
start = datetime.fromisoformat(e['start_time'])
|
| 28 |
-
if now <= start < end:
|
| 29 |
-
upcoming.append(e)
|
| 30 |
-
|
| 31 |
-
return upcoming
|
| 32 |
-
|
| 33 |
-
@app.route('/')
|
| 34 |
-
def index():
|
| 35 |
-
all_events = load_events()
|
| 36 |
-
reminders = get_upcoming_reminders(all_events)
|
| 37 |
-
|
| 38 |
-
search_query = request.args.get('search', '').lower()
|
| 39 |
-
if search_query:
|
| 40 |
-
events = [e for e in all_events if search_query in e['title'].lower()]
|
| 41 |
-
else:
|
| 42 |
-
events = all_events
|
| 43 |
-
|
| 44 |
-
return render_template('index.html', events=events, reminders=reminders, search=search_query)
|
| 45 |
-
|
| 46 |
-
# Get all events
|
| 47 |
-
@app.route('/events', methods=['GET', 'POST'])
|
| 48 |
-
@app.route('/events/', methods=['GET', 'POST']) # For routes with trailing slash
|
| 49 |
-
def events():
|
| 50 |
-
if request.method == 'GET':
|
| 51 |
-
events = load_events()
|
| 52 |
-
return jsonify(events)
|
| 53 |
-
elif request.method == 'POST':
|
| 54 |
-
events = load_events()
|
| 55 |
-
data = request.get_json()
|
| 56 |
-
new_event = {
|
| 57 |
-
'id': str(len(events) + 1),
|
| 58 |
-
'title': data['title'],
|
| 59 |
-
'description': data.get('description', ''),
|
| 60 |
-
'start_time': data['start_time'],
|
| 61 |
-
'end_time': data['end_time'],
|
| 62 |
-
}
|
| 63 |
-
events.append(new_event)
|
| 64 |
-
save_events(events)
|
| 65 |
-
return jsonify(new_event), 201
|
| 66 |
-
|
| 67 |
-
# Update an existing event
|
| 68 |
-
@app.route('/events/<event_id>', methods=['PUT'])
|
| 69 |
-
def update_event(event_id):
|
| 70 |
-
events = load_events()
|
| 71 |
-
data = request.get_json()
|
| 72 |
-
for event in events:
|
| 73 |
-
if event['id'] == event_id:
|
| 74 |
-
event.update(data)
|
| 75 |
-
save_events(events)
|
| 76 |
-
return jsonify(event)
|
| 77 |
-
return jsonify({'error': 'Event not found'}), 404
|
| 78 |
-
|
| 79 |
-
# Delete an event
|
| 80 |
-
@app.route('/events/<event_id>', methods=['DELETE'])
|
| 81 |
-
def delete_event(event_id):
|
| 82 |
-
events = load_events()
|
| 83 |
-
events = [e for e in events if e['id'] != event_id]
|
| 84 |
-
save_events(events)
|
| 85 |
-
return '', 204
|
| 86 |
-
|
| 87 |
-
# Custom template filter for formatting time (12-hour clock)
|
| 88 |
-
@app.template_filter('format12')
|
| 89 |
-
def format12(value):
|
| 90 |
-
dt = datetime.fromisoformat(value)
|
| 91 |
-
return dt.strftime('%I:%M %p, %b %d')
|
| 92 |
-
|
| 93 |
-
if __name__ == "__main__":
|
| 94 |
-
# Make sure it listens on 0.0.0.0 (the container's network interface)
|
| 95 |
-
app.run(host="0.0.0.0", port=
|
|
|
|
| 1 |
+
from flask import Flask, request, render_template, jsonify, redirect
|
| 2 |
+
import json
|
| 3 |
+
from datetime import datetime, timedelta
|
| 4 |
+
import os
|
| 5 |
+
from flask_cors import CORS
|
| 6 |
+
|
| 7 |
+
app = Flask(__name__)
|
| 8 |
+
CORS(app) # Enable CORS for all routes (for front-end testing on a different port/domain)
|
| 9 |
+
DATA_FILE = 'events.json'
|
| 10 |
+
|
| 11 |
+
def load_events():
|
| 12 |
+
if not os.path.exists(DATA_FILE):
|
| 13 |
+
return []
|
| 14 |
+
with open(DATA_FILE, 'r') as f:
|
| 15 |
+
return json.load(f)
|
| 16 |
+
|
| 17 |
+
def save_events(events):
|
| 18 |
+
with open(DATA_FILE, 'w') as f:
|
| 19 |
+
json.dump(events, f, indent=2)
|
| 20 |
+
|
| 21 |
+
def get_upcoming_reminders(events):
|
| 22 |
+
now = datetime.now()
|
| 23 |
+
end = now + timedelta(hours=4)
|
| 24 |
+
upcoming = []
|
| 25 |
+
|
| 26 |
+
for e in events:
|
| 27 |
+
start = datetime.fromisoformat(e['start_time'])
|
| 28 |
+
if now <= start < end:
|
| 29 |
+
upcoming.append(e)
|
| 30 |
+
|
| 31 |
+
return upcoming
|
| 32 |
+
|
| 33 |
+
@app.route('/')
|
| 34 |
+
def index():
|
| 35 |
+
all_events = load_events()
|
| 36 |
+
reminders = get_upcoming_reminders(all_events)
|
| 37 |
+
|
| 38 |
+
search_query = request.args.get('search', '').lower()
|
| 39 |
+
if search_query:
|
| 40 |
+
events = [e for e in all_events if search_query in e['title'].lower()]
|
| 41 |
+
else:
|
| 42 |
+
events = all_events
|
| 43 |
+
|
| 44 |
+
return render_template('index.html', events=events, reminders=reminders, search=search_query)
|
| 45 |
+
|
| 46 |
+
# Get all events
|
| 47 |
+
@app.route('/events', methods=['GET', 'POST'])
|
| 48 |
+
@app.route('/events/', methods=['GET', 'POST']) # For routes with trailing slash
|
| 49 |
+
def events():
|
| 50 |
+
if request.method == 'GET':
|
| 51 |
+
events = load_events()
|
| 52 |
+
return jsonify(events)
|
| 53 |
+
elif request.method == 'POST':
|
| 54 |
+
events = load_events()
|
| 55 |
+
data = request.get_json()
|
| 56 |
+
new_event = {
|
| 57 |
+
'id': str(len(events) + 1),
|
| 58 |
+
'title': data['title'],
|
| 59 |
+
'description': data.get('description', ''),
|
| 60 |
+
'start_time': data['start_time'],
|
| 61 |
+
'end_time': data['end_time'],
|
| 62 |
+
}
|
| 63 |
+
events.append(new_event)
|
| 64 |
+
save_events(events)
|
| 65 |
+
return jsonify(new_event), 201
|
| 66 |
+
|
| 67 |
+
# Update an existing event
|
| 68 |
+
@app.route('/events/<event_id>', methods=['PUT'])
|
| 69 |
+
def update_event(event_id):
|
| 70 |
+
events = load_events()
|
| 71 |
+
data = request.get_json()
|
| 72 |
+
for event in events:
|
| 73 |
+
if event['id'] == event_id:
|
| 74 |
+
event.update(data)
|
| 75 |
+
save_events(events)
|
| 76 |
+
return jsonify(event)
|
| 77 |
+
return jsonify({'error': 'Event not found'}), 404
|
| 78 |
+
|
| 79 |
+
# Delete an event
|
| 80 |
+
@app.route('/events/<event_id>', methods=['DELETE'])
|
| 81 |
+
def delete_event(event_id):
|
| 82 |
+
events = load_events()
|
| 83 |
+
events = [e for e in events if e['id'] != event_id]
|
| 84 |
+
save_events(events)
|
| 85 |
+
return '', 204
|
| 86 |
+
|
| 87 |
+
# Custom template filter for formatting time (12-hour clock)
|
| 88 |
+
@app.template_filter('format12')
|
| 89 |
+
def format12(value):
|
| 90 |
+
dt = datetime.fromisoformat(value)
|
| 91 |
+
return dt.strftime('%I:%M %p, %b %d')
|
| 92 |
+
|
| 93 |
+
if __name__ == "__main__":
|
| 94 |
+
# Make sure it listens on 0.0.0.0 (the container's network interface)
|
| 95 |
+
app.run(host="0.0.0.0", port=7860)
|