Phase 3.1: Enhanced Chore Logging and Reporting System

This commit is contained in:
2026-02-05 12:33:51 +11:00
commit e3cae7bfbb
178 changed files with 30105 additions and 0 deletions

228
backend/init_db.py Normal file
View File

@@ -0,0 +1,228 @@
#!/usr/bin/env python3
"""
Database initialization script for Family Hub.
Creates tables and populates with demo data.
"""
import sys
from pathlib import Path
from datetime import datetime, timedelta
# Add parent directory to path to import from app
sys.path.insert(0, str(Path(__file__).parent))
from app.core.database import engine, SessionLocal, Base
from app.models import User, Chore
from passlib.context import CryptContext
pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")
def init_db():
"""Initialize the database with tables and demo data."""
print("Initializing Family Hub database...")
# Create all tables
print("Creating database tables...")
Base.metadata.create_all(bind=engine)
db = SessionLocal()
try:
# Check if data already exists
existing_users = db.query(User).count()
if existing_users > 0:
print(f"Database already has {existing_users} users. Skipping initialization.")
print(" To reset the database, delete the file and run this script again.")
return
# Create demo users
print("\nCreating demo users...")
users_data = [
{"username": "jess", "email": "jess@family.local", "full_name": "Jess", "is_admin": True},
{"username": "lou", "email": "lou@family.local", "full_name": "Lou", "is_admin": False},
{"username": "william", "email": "william@family.local", "full_name": "William", "is_admin": False},
{"username": "xander", "email": "xander@family.local", "full_name": "Xander", "is_admin": False},
{"username": "bella", "email": "bella@family.local", "full_name": "Bella", "is_admin": False},
]
users = []
for user_data in users_data:
user = User(
username=user_data["username"],
email=user_data["email"],
full_name=user_data["full_name"],
hashed_password=pwd_context.hash("password123"),
is_admin=user_data["is_admin"],
is_active=True
)
db.add(user)
users.append(user)
admin_badge = " [ADMIN]" if user.is_admin else ""
print(f" + {user.full_name} ({user.username}){admin_badge}")
db.flush() # Flush to get user IDs
# Create demo chores
print("\nCreating demo chores...")
# Get user IDs for assignment
jess = next(u for u in users if u.username == "jess")
lou = next(u for u in users if u.username == "lou")
william = next(u for u in users if u.username == "william")
xander = next(u for u in users if u.username == "xander")
bella = next(u for u in users if u.username == "bella")
demo_chores = [
# Daily chores
{
"title": "Feed the pets",
"description": "Feed cats in the morning and evening",
"frequency": "daily",
"assignment_type": "any_one",
"points": 5,
"room": "Kitchen",
"assigned_user_id": bella.id,
"status": "pending"
},
{
"title": "Take out trash",
"description": "Empty kitchen and bathroom bins",
"frequency": "daily",
"assignment_type": "any_one",
"points": 3,
"room": "Kitchen",
"assigned_user_id": xander.id,
"status": "pending"
},
{
"title": "Tidy living room",
"description": "Pick up toys, straighten cushions, clear coffee table",
"frequency": "daily",
"assignment_type": "any_one",
"points": 5,
"room": "Living Room",
"assigned_user_id": william.id,
"status": "in_progress"
},
# Weekly chores
{
"title": "Vacuum entire house",
"description": "Vacuum all carpeted areas including stairs",
"frequency": "weekly",
"assignment_type": "any_one",
"points": 15,
"room": "Whole House",
"assigned_user_id": lou.id,
"status": "pending"
},
{
"title": "Clean bathrooms",
"description": "Clean toilets, sinks, mirrors, and mop floors",
"frequency": "weekly",
"assignment_type": "any_one",
"points": 20,
"room": "Bathrooms",
"assigned_user_id": jess.id,
"status": "completed",
"completed_at": datetime.now() - timedelta(days=1)
},
{
"title": "Mow the lawn",
"description": "Mow front and back yard, edge walkways",
"frequency": "weekly",
"assignment_type": "any_one",
"points": 25,
"room": "Yard",
"assigned_user_id": william.id,
"status": "pending"
},
# Monthly chores
{
"title": "Deep clean kitchen",
"description": "Clean oven, fridge, cabinets, and behind appliances",
"frequency": "monthly",
"assignment_type": "any_one",
"points": 50,
"room": "Kitchen",
"assigned_user_id": jess.id,
"status": "pending"
},
{
"title": "Wash windows",
"description": "Clean all interior and exterior windows",
"frequency": "monthly",
"assignment_type": "any_one",
"points": 40,
"room": "Whole House",
"assigned_user_id": lou.id,
"status": "pending"
},
{
"title": "Organize garage",
"description": "Sort items, sweep floor, arrange tools",
"frequency": "monthly",
"assignment_type": "any_one",
"points": 35,
"room": "Garage",
"assigned_user_id": william.id,
"status": "in_progress"
},
{
"title": "Change air filters",
"description": "Replace HVAC filters throughout house",
"frequency": "monthly",
"assignment_type": "any_one",
"points": 10,
"room": "Whole House",
"assigned_user_id": jess.id,
"status": "pending"
},
# On-trigger chores
{
"title": "Grocery shopping",
"description": "Weekly grocery shopping trip",
"frequency": "on_trigger",
"assignment_type": "any_one",
"points": 30,
"room": "Shopping",
"assigned_user_id": lou.id,
"status": "pending"
},
{
"title": "Car wash",
"description": "Wash and vacuum family car",
"frequency": "on_trigger",
"assignment_type": "any_one",
"points": 20,
"room": "Driveway",
"assigned_user_id": xander.id,
"status": "pending"
},
]
for chore_data in demo_chores:
chore = Chore(**chore_data)
db.add(chore)
# Pretty print status
status_marker = "[DONE]" if chore_data["status"] == "completed" else "[WIP]" if chore_data["status"] == "in_progress" else "[TODO]"
print(f" {status_marker} {chore_data['title']} - {chore_data['frequency']} ({chore_data['room']})")
db.commit()
print(f"\n[SUCCESS] Database initialized with {len(users_data)} users and {len(demo_chores)} demo chores!")
print("\nLogin credentials:")
print(" Username: jess (admin) or lou, william, xander, bella")
print(" Password: password123")
except Exception as e:
print(f"[ERROR] Error initializing database: {e}")
db.rollback()
raise
finally:
db.close()
if __name__ == "__main__":
init_db()