Key changes: - Removed office-centric model (deleted offices.py, office-rules) - Renamed to team-rules, managers are part of their own team - Team calendar visible to all (read-only for employees) - Admins can have a manager assigned
133 lines
3.9 KiB
Python
133 lines
3.9 KiB
Python
"""
|
|
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")
|