"""SeriesPage — ordered image membership for a series-kind Tag. A series IS a Tag with kind='series'; series_page gives it ordered pages. An image belongs to at most one series (UNIQUE image_id). Cover = the lowest page_number. page_number is an ordering key only (not unique) — reorder rewrites 1..N wholesale. """ from datetime import datetime from sqlalchemy import DateTime, ForeignKey, Integer, func from sqlalchemy.orm import Mapped, mapped_column from .base import Base class SeriesPage(Base): __tablename__ = "series_page" id: Mapped[int] = mapped_column(Integer, primary_key=True) series_tag_id: Mapped[int] = mapped_column( ForeignKey("tag.id", ondelete="CASCADE"), nullable=False, index=True ) image_id: Mapped[int] = mapped_column( ForeignKey("image_record.id", ondelete="CASCADE"), nullable=False, unique=True, ) page_number: Mapped[int] = mapped_column(Integer, nullable=False) created_at: Mapped[datetime] = mapped_column( DateTime(timezone=True), nullable=False, server_default=func.now() ) updated_at: Mapped[datetime] = mapped_column( DateTime(timezone=True), nullable=False, server_default=func.now(), onupdate=func.now(), )