Files
gh-christianlouis-leagueledger/app/db_init.py
T
Christian Krakau-Louis 9eef726d9b Refactor authentication and session management
- Removed session-based user retrieval from dependencies.py and main.py.
- Eliminated SessionMiddleware and related session handling code.
- Updated dashboard and team views to directly query user data from the database.
- Simplified redeem and team management views to remove authentication checks.
- Adjusted templates to reflect changes in user context handling.
- Added camera selection feature in scan_qr.html for improved QR code scanning.
- Cleaned up Docker configuration and requirements for better deployment.
2025-04-13 21:43:24 +02:00

167 lines
5.5 KiB
Python

#!/usr/bin/env python3
"""
Seed the database with initial testing data.
"""
import random
from datetime import datetime, timedelta
from sqlalchemy import inspect
from sqlalchemy.orm import Session
from passlib.context import CryptContext
from .models import User, Team, TeamMembership, QRTicket
from .db import SessionLocal
pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")
def get_password_hash(password: str) -> str:
return pwd_context.hash(password)
def table_has_column(engine, table_name, column_name):
"""Check if a table has a specific column."""
inspector = inspect(engine)
if table_name not in inspector.get_table_names():
return False
columns = [col['name'] for col in inspector.get_columns(table_name)]
return column_name in columns
def seed_db():
"""Seed the database with test data."""
db = SessionLocal()
try:
# Only seed if tables are empty
if db.query(User).count() > 0:
print("Database already has data. Skipping seeding.")
return
# Create users with properly hashed passwords
users = [
User(
username="admin",
email="admin@example.com",
hashed_password=get_password_hash("password"),
is_admin=True # Set admin privileges
),
User(
username="john_quizmaster",
email="john@example.com",
hashed_password=get_password_hash("password123")
),
User(
username="sarah_johnson",
email="sarah@example.com",
hashed_password=get_password_hash("password123")
),
User(
username="mike_peters",
email="mike@example.com",
hashed_password=get_password_hash("password123")
),
User(
username="emma_wilson",
email="emma@example.com",
hashed_password=get_password_hash("password123")
),
User(
username="robert_brown",
email="robert@example.com",
hashed_password=get_password_hash("password123")
),
]
db.add_all(users)
db.commit()
# Create teams
has_is_public = table_has_column(db.bind, 'teams', 'is_public')
has_created_at = table_has_column(db.bind, 'teams', 'created_at')
has_description = table_has_column(db.bind, 'teams', 'description')
teams = []
for i, name in enumerate(["Quiz Wizards", "Trivia Titans", "Beer Brainiacs", "Knowledge Knights"]):
team_attrs = {"name": name}
if has_is_public:
team_attrs["is_public"] = i % 2 == 1 # Alternate public/private
if has_description:
team_attrs["description"] = f"A team of quiz enthusiasts called {name}"
teams.append(Team(**team_attrs))
db.add_all(teams)
db.commit()
# Create team memberships
has_joined_at = table_has_column(db.bind, 'team_membership', 'joined_at')
memberships = []
membership_data = [
# Quiz Wizards
(1, 1, True, 160), # Admin user is team admin of Quiz Wizards
(2, 1, True, 155),
(3, 1, False, 130),
(4, 1, False, 90),
(5, 1, False, 45),
# Trivia Titans
(2, 2, True, 150),
(1, 2, False, 145),
# Beer Brainiacs
(3, 3, True, 120),
]
for user_id, team_id, is_admin, days_ago in membership_data:
membership_attrs = {
"user_id": user_id,
"team_id": team_id,
"is_admin": is_admin
}
if has_joined_at:
membership_attrs["joined_at"] = datetime.now() - timedelta(days=days_ago)
memberships.append(TeamMembership(**membership_attrs))
db.add_all(memberships)
db.commit()
# Create QR tickets
has_created_at = table_has_column(db.bind, 'qr_tickets', 'created_at')
has_redeemed_at = table_has_column(db.bind, 'qr_tickets', 'redeemed_at')
has_event_name = table_has_column(db.bind, 'qr_tickets', 'event_name')
event_names = [
"Music Trivia Night",
"History Night",
"Movie Trivia Night",
"Sports Quiz",
"General Knowledge"
]
# Create some basic tickets
tickets = []
for i in range(15):
points = random.choice([5, 10, 15, 20, 25])
team_id = random.randint(1, len(teams))
user_id = random.randint(1, len(users))
ticket_attrs = {
"code": f"TICKET{i:03d}",
"points": points,
"redeemed_by": user_id,
"redeemed_at_team": team_id,
"used": True
}
if has_event_name:
ticket_attrs["event_name"] = random.choice(event_names)
tickets.append(QRTicket(**ticket_attrs))
db.add_all(tickets)
db.commit()
print("Database seeded successfully!")
except Exception as e:
print(f"Error seeding database: {e}")
finally:
db.close()
if __name__ == "__main__":
seed_db()