ppt-tool/backend/scripts/seed.py
Vadym Samoilenko d3d1667a79 Phase 2: Admin panel, analytics, storage, template pipeline, multi-provider LLM
- 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>
2026-02-26 23:39:34 +00:00

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())