| """Seed the minimum needed to use the app: an admin account. |
| |
| Real dogs come from batch-loaded datasets (scripts.load_dataset) or organic found/lost reports — |
| there is no synthetic 'generated-dot' demo data. Idempotent. |
| |
| The admin password is taken from SEED_ADMIN_PASSWORD, or randomly generated and printed once. |
| It is deliberately not hardcoded: a password committed to a public repo is a published credential |
| for every copy of this project that anyone runs. |
| |
| Run from the backend dir: python -m scripts.seed |
| """ |
| from __future__ import annotations |
|
|
| import os |
| import secrets |
|
|
| from app.db import SessionLocal, engine |
| from app.models import Base, User |
| from app.models.base import UserRole |
| from app.security import hash_password |
|
|
| ADMIN_EMAIL = "admin@example.com" |
|
|
|
|
| def run() -> None: |
| Base.metadata.create_all(bind=engine) |
| db = SessionLocal() |
| try: |
| if db.query(User).filter(User.email == ADMIN_EMAIL).first(): |
| print(f"Admin {ADMIN_EMAIL} already present; nothing to seed.") |
| return |
| password = os.getenv("SEED_ADMIN_PASSWORD") or secrets.token_urlsafe(16) |
| generated = not os.getenv("SEED_ADMIN_PASSWORD") |
| db.add( |
| User( |
| name="Admin", email=ADMIN_EMAIL, zip="20001", |
| password_hash=hash_password(password), role=UserRole.admin, |
| ) |
| ) |
| db.commit() |
| print("Seed complete.") |
| print(f" Admin login: {ADMIN_EMAIL}") |
| if generated: |
| print(f" Generated password (shown once, not stored anywhere): {password}") |
| print(" Set SEED_ADMIN_PASSWORD to choose your own instead.") |
| finally: |
| db.close() |
|
|
|
|
| if __name__ == "__main__": |
| run() |
|
|