179f6125e8
- Add Free / Starter / Professional / Business tiers with lifetime, daily, and monthly file limits (app/utils/subscription.py) - Add subscription_tier column to UserProfile model + migration 014 - Enforce quotas at upload time (HTTP 402 on violation) in /api/ui-upload - New REST API: GET /api/subscriptions/tiers, /my, /platform (admin) - New pages: /pricing (marketing, public) and /subscription (per-user status) - Enhanced dashboard: SaaS stats (files today/month, OCR count, active users) in multi-user mode; original single-user layout preserved - Admin users page: show Plan badge, allow tier editing via dropdown - Navigation: add Pricing link + subscription icon in user header - Tests: 23 unit tests for subscription tier logic - Docs: docs/SubscriptionTiers.md Co-authored-by: christianlouis <361235+christianlouis@users.noreply.github.com>
31 lines
776 B
Python
31 lines
776 B
Python
"""Add subscription_tier column to user_profiles
|
|
|
|
Revision ID: 014_add_subscription_tiers
|
|
Revises: 013_add_user_profiles
|
|
Create Date: 2026-03-06
|
|
|
|
"""
|
|
|
|
from typing import Union
|
|
|
|
import sqlalchemy as sa
|
|
from alembic import op
|
|
|
|
# revision identifiers, used by Alembic.
|
|
revision: str = "014_add_subscription_tiers"
|
|
down_revision: Union[str, None] = "013_add_user_profiles"
|
|
depends_on: Union[str, None] = None
|
|
|
|
|
|
def upgrade() -> None:
|
|
"""Add subscription_tier column to user_profiles."""
|
|
op.add_column(
|
|
"user_profiles",
|
|
sa.Column("subscription_tier", sa.String(50), nullable=True, server_default="free"),
|
|
)
|
|
|
|
|
|
def downgrade() -> None:
|
|
"""Remove subscription_tier column from user_profiles."""
|
|
op.drop_column("user_profiles", "subscription_tier")
|