- Fix admin sidebar: remove duplicate Teams, add Storage nav item - Analytics: client-scoped queries, super_admin sees all (including NULL client_id) - Storage management: list/download/delete presentations with file metadata - Settings page with brand config router - AI usage tracking: new AIUsageModel, ai_usage_service, analytics endpoint - Master deck → template bridge: _register_as_template creates TemplateModel + PresentationLayoutCodeModel so parsed layouts appear in template picker - Multi-provider LLM vision in parser: Anthropic/Google/OpenAI with asyncio.to_thread - Fix PPTX upload 400: accept by .pptx extension (browser sends octet-stream) - Fix reparse FK violation: presentation_id=None for parse_master_deck jobs - Worker job_timeout increased to 1800s for LLM-heavy master deck parsing - PYTHONUNBUFFERED=1 in docker-compose worker for real-time log output - Auth: clientId in /me response, dev-login cookie improvements - Frontend: auth slice clientId, master-deck thumbnails, storage page Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
78 lines
2.6 KiB
Python
78 lines
2.6 KiB
Python
"""Seed the database with the default Oliver Team and admin user."""
|
|
import asyncio
|
|
import uuid
|
|
from datetime import datetime, timezone
|
|
|
|
from sqlmodel import select
|
|
from services.database import async_session_maker
|
|
|
|
# Import all models so SQLAlchemy resolves FK references
|
|
from models.sql.client import ClientModel # noqa: F401
|
|
from models.sql.user import UserModel
|
|
from models.sql.team import TeamModel
|
|
from models.sql.team_membership import TeamMembershipModel
|
|
|
|
|
|
async def seed():
|
|
async with async_session_maker() as session:
|
|
# --- Oliver Team ---
|
|
result = await session.execute(
|
|
select(TeamModel).where(TeamModel.is_default == True) # noqa: E712
|
|
)
|
|
oliver_team = result.scalar_one_or_none()
|
|
|
|
if oliver_team:
|
|
print(f"Oliver Team already exists (id: {oliver_team.id})")
|
|
else:
|
|
oliver_team = TeamModel(
|
|
id=uuid.uuid4(),
|
|
name="Oliver Team",
|
|
client_id=None,
|
|
is_default=True,
|
|
created_at=datetime.now(timezone.utc),
|
|
)
|
|
session.add(oliver_team)
|
|
await session.flush()
|
|
print(f"Created Oliver Team with id: {oliver_team.id}")
|
|
|
|
# --- Admin user ---
|
|
admin_email = "admin@deckforge.dev"
|
|
result = await session.execute(
|
|
select(UserModel).where(UserModel.email == admin_email)
|
|
)
|
|
admin_user = result.scalar_one_or_none()
|
|
|
|
if admin_user:
|
|
if admin_user.role != "super_admin":
|
|
admin_user.role = "super_admin"
|
|
session.add(admin_user)
|
|
print(f"Updated {admin_email} role to super_admin")
|
|
else:
|
|
print(f"Admin user already exists (id: {admin_user.id})")
|
|
else:
|
|
admin_user = UserModel(
|
|
email=admin_email,
|
|
display_name="Admin",
|
|
role="super_admin",
|
|
is_active=True,
|
|
created_at=datetime.now(timezone.utc),
|
|
updated_at=datetime.now(timezone.utc),
|
|
)
|
|
session.add(admin_user)
|
|
await session.flush()
|
|
print(f"Created admin user with id: {admin_user.id}")
|
|
|
|
# Add to Oliver Team
|
|
membership = TeamMembershipModel(
|
|
user_id=admin_user.id,
|
|
team_id=oliver_team.id,
|
|
assigned_at=datetime.now(timezone.utc),
|
|
)
|
|
session.add(membership)
|
|
|
|
await session.commit()
|
|
print("Seed complete.")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
asyncio.run(seed())
|