""" Create test database with sample data Run: .venv/bin/python create_test_db.py Manager-centric model: - Users have a manager_id pointing to their manager - Managers own parking spots (manager_parking_quota) - Each manager has a spot prefix (A, B, C...) for display names """ import uuid from datetime import datetime, timezone from database.connection import engine, SessionLocal from database.models import Base, User from services.auth import hash_password # Drop and recreate all tables for clean slate Base.metadata.drop_all(bind=engine) Base.metadata.create_all(bind=engine) db = SessionLocal() now = datetime.now(timezone.utc).isoformat() password_hash = hash_password("password123") # Create users with manager-centric model # manager_id points to the user's manager users_data = [ { "id": "admin", "email": "admin@example.com", "name": "Admin User", "role": "admin", "manager_id": None, # Admins don't have managers }, { "id": "manager1", "email": "manager1@example.com", "name": "Alice Manager", "role": "manager", "manager_id": None, # Managers don't have managers "manager_parking_quota": 3, "manager_spot_prefix": "A", }, { "id": "manager2", "email": "manager2@example.com", "name": "Bob Manager", "role": "manager", "manager_id": None, "manager_parking_quota": 2, "manager_spot_prefix": "B", }, { "id": "user1", "email": "user1@example.com", "name": "User One", "role": "employee", "manager_id": "manager1", # Managed by Alice }, { "id": "user2", "email": "user2@example.com", "name": "User Two", "role": "employee", "manager_id": "manager1", # Managed by Alice }, { "id": "user3", "email": "user3@example.com", "name": "User Three", "role": "employee", "manager_id": "manager1", # Managed by Alice }, { "id": "user4", "email": "user4@example.com", "name": "User Four", "role": "employee", "manager_id": "manager2", # Managed by Bob }, { "id": "user5", "email": "user5@example.com", "name": "User Five", "role": "employee", "manager_id": "manager2", # Managed by Bob }, ] for data in users_data: user = User( id=data["id"], email=data["email"], password_hash=password_hash, name=data["name"], role=data["role"], manager_id=data.get("manager_id"), manager_parking_quota=data.get("manager_parking_quota", 0), manager_spot_prefix=data.get("manager_spot_prefix"), created_at=now ) db.add(user) print(f"Created user: {user.email} ({user.role})") db.commit() db.close() print("\n" + "="*60) print("Test database created successfully!") print("="*60) print("\nTest accounts (all use password: password123):") print("-"*60) print(f"{'Email':<25} {'Role':<10} {'Manager':<15}") print("-"*60) print(f"{'admin@example.com':<25} {'admin':<10} {'-':<15}") print(f"{'manager1@example.com':<25} {'manager':<10} {'-':<15}") print(f"{'manager2@example.com':<25} {'manager':<10} {'-':<15}") print(f"{'user1@example.com':<25} {'employee':<10} {'Alice':<15}") print(f"{'user2@example.com':<25} {'employee':<10} {'Alice':<15}") print(f"{'user3@example.com':<25} {'employee':<10} {'Alice':<15}") print(f"{'user4@example.com':<25} {'employee':<10} {'Bob':<15}") print(f"{'user5@example.com':<25} {'employee':<10} {'Bob':<15}") print("-"*60) print("\nParking pools:") print(" Alice (manager1): 3 spots (A1,A2,A3)") print(" -> manages: user1, user2, user3") print(" -> 3 users, 3 spots = 100% ratio target") print() print(" Bob (manager2): 2 spots (B1,B2)") print(" -> manages: user4, user5") print(" -> 2 users, 2 spots = 100% ratio target")