-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathapp.py
More file actions
142 lines (117 loc) · 5.55 KB
/
app.py
File metadata and controls
142 lines (117 loc) · 5.55 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
from flask import Flask, render_template, request, redirect, url_for, flash, send_from_directory
import os
from werkzeug.utils import secure_filename
from database import db
from models import Member, Event, Photo
from datetime import datetime
app = Flask(__name__)
app.config['SECRET_KEY'] = 'your-secret-key-change-this-in-production'
# Database configuration
# Use DATABASE_URL from environment if available (for Render), else local sqlite
database_url = os.environ.get('DATABASE_URL')
if database_url and database_url.startswith("postgres://"):
database_url = database_url.replace("postgres://", "postgresql://", 1)
app.config['SQLALCHEMY_DATABASE_URI'] = database_url or 'sqlite:///events.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
# Upload Configuration
UPLOAD_FOLDER = 'static/uploads'
ALLOWED_EXTENSIONS = {'png', 'jpg', 'jpeg', 'gif'}
app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER
if not os.path.exists(UPLOAD_FOLDER):
os.makedirs(UPLOAD_FOLDER)
def allowed_file(filename):
return '.' in filename and filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS
db.init_app(app)
with app.app_context():
db.create_all()
@app.route('/')
def index():
recent_events = Event.query.order_by(Event.date.desc()).limit(5).all()
member_count = Member.query.count()
return render_template('index.html', recent_events=recent_events, member_count=member_count)
# --- Member Routes ---
@app.route('/members', methods=['GET', 'POST'])
def members():
if request.method == 'POST':
name = request.form['name']
email = request.form['email']
if Member.query.filter_by(email=email).first():
flash('Email already exists!')
else:
filename = None
if 'profile_image' in request.files:
file = request.files['profile_image']
if file and allowed_file(file.filename):
filename = secure_filename(file.filename)
# Unique filename to prevent overwrite or just keep simple for now
# Adding timestamp to ensure uniqueness could be good, but let's keep it simple
filename = f"{datetime.now().timestamp()}_{filename}"
file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))
new_member = Member(name=name, email=email, profile_image=filename)
db.session.add(new_member)
db.session.commit()
flash('Member added successfully!')
return redirect(url_for('members'))
all_members = Member.query.all()
return render_template('members.html', members=all_members)
# --- Event Routes ---
@app.route('/events', methods=['GET', 'POST'])
def events():
if request.method == 'POST':
title = request.form['title']
description = request.form['description']
date_str = request.form['date']
try:
event_date = datetime.strptime(date_str, '%Y-%m-%dT%H:%M')
except ValueError:
# Fallback for browsers that might send different format or if user types it
try:
event_date = datetime.strptime(date_str, '%Y-%m-%d')
except:
flash('Invalid date format')
return redirect(url_for('events'))
new_event = Event(title=title, description=description, date=event_date)
db.session.add(new_event)
db.session.commit()
flash('Event created successfully!')
return redirect(url_for('events'))
all_events = Event.query.order_by(Event.date.desc()).all()
return render_template('events.html', events=all_events)
@app.route('/event/<int:event_id>', methods=['GET', 'POST'])
def event_detail(event_id):
event = Event.query.get_or_404(event_id)
if request.method == 'POST':
if 'photo' in request.files:
file = request.files['photo']
if file and allowed_file(file.filename):
filename = secure_filename(file.filename)
filename = f"event_{event_id}_{datetime.now().timestamp()}_{filename}"
file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))
new_photo = Photo(filename=filename, event=event)
db.session.add(new_photo)
db.session.commit()
flash('Photo uploaded successfully!')
return redirect(url_for('event_detail', event_id=event_id))
member_id = request.form.get('member_id')
if member_id:
member = Member.query.get(member_id)
if member and member not in event.participants:
event.participants.append(member)
db.session.commit()
flash(f'{member.name} added to event!')
elif member in event.participants:
flash('Member already joined this event.')
return redirect(url_for('event_detail', event_id=event_id))
# Get members who are NOT in this event for the dropdown
available_members = [m for m in Member.query.all() if m not in event.participants]
return render_template('event_detail.html', event=event, available_members=available_members)
@app.route('/albums')
def albums():
# Only show events that have photos
events_with_photos = Event.query.join(Photo).group_by(Event.id).all()
# Or just show all events and let template handle empty ones?
# Let's show all for now so users know they can find albums for any event
all_events = Event.query.all()
return render_template('albums.html', events=all_events)
if __name__ == '__main__':
app.run(debug=True)