56 lines
1.9 KiB
Python
56 lines
1.9 KiB
Python
"""
|
|
Story Project Models
|
|
|
|
Database models for Story Studio project persistence and state management.
|
|
Modeled after PodcastProject and ResearchProject for cross-device resume.
|
|
"""
|
|
|
|
from datetime import datetime
|
|
|
|
from sqlalchemy import Column, Integer, String, DateTime, Boolean, JSON, Index
|
|
|
|
from models.subscription_models import Base
|
|
|
|
|
|
class StoryProject(Base):
|
|
"""
|
|
Database model for Story Studio project state.
|
|
Stores complete story project state to enable cross-device resume.
|
|
"""
|
|
|
|
__tablename__ = "story_projects"
|
|
|
|
# Primary fields
|
|
id = Column(Integer, primary_key=True, autoincrement=True)
|
|
project_id = Column(String(255), unique=True, nullable=False, index=True)
|
|
user_id = Column(String(255), nullable=False, index=True)
|
|
|
|
# Project metadata
|
|
title = Column(String(500), nullable=True)
|
|
story_mode = Column(String(50), nullable=True)
|
|
story_template = Column(String(100), nullable=True)
|
|
|
|
# Story state (stored as JSON)
|
|
setup = Column(JSON, nullable=True)
|
|
outline = Column(JSON, nullable=True)
|
|
scenes = Column(JSON, nullable=True)
|
|
story_content = Column(JSON, nullable=True)
|
|
anime_bible = Column(JSON, nullable=True)
|
|
media_state = Column(JSON, nullable=True)
|
|
|
|
# UI/progress state
|
|
current_phase = Column(String(50), nullable=True)
|
|
status = Column(String(50), default="draft", nullable=False, index=True)
|
|
is_favorite = Column(Boolean, default=False, index=True)
|
|
is_complete = Column(Boolean, default=False)
|
|
|
|
# Timestamps
|
|
created_at = Column(DateTime, default=datetime.utcnow, nullable=False, index=True)
|
|
updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow, nullable=False, index=True)
|
|
|
|
__table_args__ = (
|
|
Index("idx_story_user_status_created", "user_id", "status", "created_at"),
|
|
Index("idx_story_user_favorite_updated", "user_id", "is_favorite", "updated_at"),
|
|
)
|
|
|