Barclays-banner-builder/backend/scripts/seed_admin.py
Vadym Samoilenko 3f795c0d35 Replace passlib with bcrypt directly — passlib incompatible with bcrypt>=4.0
passlib hasn't been updated for bcrypt>=4.0 which removed __about__.
Use bcrypt library directly: hashpw/checkpw in auth.py and seed_admin.py.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-17 12:15:06 +01:00

66 lines
2.3 KiB
Python

#!/usr/bin/env python3
"""Seed an admin user and the initial system prompt.
Run once on first deploy:
docker compose exec api python scripts/seed_admin.py
Creates admin@barclays.com / change_me_password (change immediately).
"""
import asyncio
import sys
from pathlib import Path
sys.path.insert(0, str(Path(__file__).parent.parent))
async def main():
import bcrypt
from datetime import datetime, timezone
from sqlalchemy import select
from app.database import AsyncSessionLocal
from app.models.user import User
from app.models.system_prompt import SystemPrompt
system_prompt_text = (Path(__file__).parent.parent / "app" / "prompts" / "system_prompt.md").read_text()
async with AsyncSessionLocal() as db:
# Admin user
result = await db.execute(select(User).where(User.email == "admin@barclays.com"))
if not result.scalar_one_or_none():
hashed_pw = bcrypt.hashpw(b"change_me_password", bcrypt.gensalt()).decode()
admin = User(
email="admin@barclays.com",
hashed_password=hashed_pw,
role="admin",
created_at=datetime.now(timezone.utc),
)
db.add(admin)
await db.flush()
admin_id = admin.id
print("Created admin user: admin@barclays.com / change_me_password")
else:
result = await db.execute(select(User).where(User.email == "admin@barclays.com"))
admin_id = result.scalar_one().id
print("Admin user already exists — skipping.")
# Initial system prompt
result = await db.execute(select(SystemPrompt).where(SystemPrompt.is_active == True)) # noqa: E712
if not result.scalar_one_or_none():
db.add(SystemPrompt(
version=1,
label="Barclays Display Banner — default",
system_text=system_prompt_text,
is_active=True,
created_by_id=admin_id,
created_at=datetime.now(timezone.utc),
))
print("Created initial system prompt (active).")
else:
print("Active system prompt already exists — skipping.")
await db.commit()
print("Seed complete.")
if __name__ == "__main__":
asyncio.run(main())