feat: add onboarding, branding, and supporting data models, migrations, and schemas

Add onboarding_dismissed and branding columns (logo_data, logo_content_type,
company_display_name) to users and teams models. Create SessionSupportingData
model for attaching text snippets and screenshots to sessions. Add Pydantic
schemas for onboarding status, branding responses, and supporting data CRUD.
Update SessionExport to accept pdf format.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
chihlasm
2026-03-16 23:51:42 -04:00
parent ae6b7b3055
commit f16a686fb4
11 changed files with 185 additions and 4 deletions

View File

@@ -0,0 +1,41 @@
"""add onboarding and branding columns
Revision ID: 21ddb46ddd05
Revises: 061
Create Date: 2026-03-16 23:30:48.910485
"""
from typing import Sequence, Union
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision: str = '21ddb46ddd05'
down_revision: Union[str, None] = '061'
branch_labels: Union[str, Sequence[str], None] = None
depends_on: Union[str, Sequence[str], None] = None
def upgrade() -> None:
# Users: onboarding + branding columns
op.add_column('users', sa.Column('onboarding_dismissed', sa.Boolean(), server_default='false', nullable=False))
op.add_column('users', sa.Column('logo_data', sa.Text(), nullable=True))
op.add_column('users', sa.Column('logo_content_type', sa.String(length=50), nullable=True))
op.add_column('users', sa.Column('company_display_name', sa.String(length=255), nullable=True))
# Teams: branding columns
op.add_column('teams', sa.Column('logo_data', sa.Text(), nullable=True))
op.add_column('teams', sa.Column('logo_content_type', sa.String(length=50), nullable=True))
op.add_column('teams', sa.Column('company_display_name', sa.String(length=255), nullable=True))
def downgrade() -> None:
op.drop_column('teams', 'company_display_name')
op.drop_column('teams', 'logo_content_type')
op.drop_column('teams', 'logo_data')
op.drop_column('users', 'company_display_name')
op.drop_column('users', 'logo_content_type')
op.drop_column('users', 'logo_data')
op.drop_column('users', 'onboarding_dismissed')

View File

@@ -0,0 +1,41 @@
"""add session_supporting_data table
Revision ID: ee98013dd18c
Revises: 21ddb46ddd05
Create Date: 2026-03-16 23:31:43.483511
"""
from typing import Sequence, Union
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision: str = 'ee98013dd18c'
down_revision: Union[str, None] = '21ddb46ddd05'
branch_labels: Union[str, Sequence[str], None] = None
depends_on: Union[str, Sequence[str], None] = None
def upgrade() -> None:
op.create_table('session_supporting_data',
sa.Column('id', sa.UUID(), nullable=False),
sa.Column('session_id', sa.UUID(), nullable=False),
sa.Column('label', sa.String(length=255), nullable=False),
sa.Column('data_type', sa.Enum('text_snippet', 'screenshot', name='supporting_data_type'), nullable=False),
sa.Column('content', sa.Text(), nullable=False),
sa.Column('content_type', sa.String(length=50), nullable=True),
sa.Column('sort_order', sa.Integer(), nullable=False),
sa.Column('created_at', sa.DateTime(timezone=True), nullable=False),
sa.Column('updated_at', sa.DateTime(timezone=True), nullable=False),
sa.ForeignKeyConstraint(['session_id'], ['sessions.id'], ondelete='CASCADE'),
sa.PrimaryKeyConstraint('id'),
)
op.create_index(op.f('ix_session_supporting_data_session_id'), 'session_supporting_data', ['session_id'], unique=False)
def downgrade() -> None:
op.drop_index(op.f('ix_session_supporting_data_session_id'), table_name='session_supporting_data')
op.drop_table('session_supporting_data')
op.execute("DROP TYPE IF EXISTS supporting_data_type")