import asyncio import sys from pathlib import Path from sqlalchemy import select from sqlalchemy.exc import IntegrityError ROOT_DIR = Path(__file__).resolve().parents[1] if str(ROOT_DIR.parent) not in sys.path: sys.path.insert(0, str(ROOT_DIR.parent)) from backend.core.security import get_password_hash # noqa: E402 from backend.db import import_all_models # noqa: F401,E402 from backend.db.session import AsyncSessionLocal # noqa: E402 from backend.modules.users.models import Role, RoleName, User # noqa: E402 async def ensure_roles(session): existing = {r.name for r in (await session.scalars(select(Role))).all()} for name in [RoleName.ADMIN.value, RoleName.CUSTOMER_ADMIN.value, RoleName.CUSTOMER_USER.value]: if name not in existing: session.add(Role(name=name, description=f"{name} role")) await session.commit() async def ensure_admin(username: str, password: str): async with AsyncSessionLocal() as session: await ensure_roles(session) role = await session.scalar(select(Role).where(Role.name == RoleName.ADMIN.value)) user = await session.scalar(select(User).where(User.username == username)) if user: print(f"User {username} already exists (id={user.id})") return admin = User( username=username, email=None, password_hash=get_password_hash(password), role_id=role.id, customer_id=None, is_active=1, ) session.add(admin) try: await session.commit() await session.refresh(admin) print(f"Created admin user {username} with id={admin.id}") except IntegrityError: await session.rollback() print("Failed to create admin (maybe already exists)") if __name__ == "__main__": asyncio.run(ensure_admin("admin", "Admin@123"))