Files
leocrm/scripts/seed_admin.py
T

82 lines
2.5 KiB
Python
Raw Normal View History

#!/usr/bin/env python3
"""Seed a default tenant and admin user for LeoCRM.
Usage: python scripts/seed_admin.py
Creates:
- Tenant: "Default Org" (slug: default)
- Admin user: admin@media-on.de / Admin123!
If tenant or user already exists, skips creation.
"""
import asyncio
import sys
import os
# Ensure app is importable
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
from app.core.db import get_engine, close_engine
from app.core.auth import hash_password
from app.models.tenant import Tenant
from app.models.user import User, UserTenant
from sqlalchemy import select
from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy.ext.asyncio import async_sessionmaker
async def seed():
engine = get_engine()
async_session = async_sessionmaker(engine, expire_on_commit=False)
async with async_session() as db: # type: AsyncSession
# Check if default tenant exists
result = await db.execute(select(Tenant).where(Tenant.slug == "default"))
tenant = result.scalar_one_or_none()
if tenant is None:
tenant = Tenant(name="Default Org", slug="default")
db.add(tenant)
await db.flush()
print(f"Created tenant: {tenant.name} (slug: {tenant.slug}, id: {tenant.id})")
else:
print(f"Tenant exists: {tenant.name} (id: {tenant.id})")
# Check if admin user exists
result = await db.execute(select(User).where(User.email == "admin@media-on.de"))
user = result.scalar_one_or_none()
if user is None:
user = User(
tenant_id=tenant.id,
email="admin@media-on.de",
name="Administrator",
password_hash=hash_password("Admin123!"),
role="admin",
is_active=True,
preferences={},
)
db.add(user)
await db.flush()
# Link user to tenant
ut = UserTenant(user_id=user.id, tenant_id=tenant.id, is_default=True)
db.add(ut)
await db.flush()
print(f"Created admin user: {user.email} (id: {user.id})")
else:
print(f"Admin user exists: {user.email} (id: {user.id})")
await db.commit()
print("\nSeed complete!")
print(f" Login URL: https://crm.media-on.de/login")
print(f" Email: admin@media-on.de")
print(f" Password: Admin123!")
await close_engine()
if __name__ == "__main__":
asyncio.run(seed())