Source code for pydotorg.domains.pages.models

"""Pages domain models."""

from __future__ import annotations

from enum import StrEnum
from uuid import UUID

from sqlalchemy import Boolean, Enum, ForeignKey, String, Text
from sqlalchemy.orm import Mapped, mapped_column, relationship

from pydotorg.core.database.base import AuditBase, ContentManageableMixin


[docs] class ContentType(StrEnum): MARKDOWN = "markdown" RESTRUCTUREDTEXT = "restructuredtext" HTML = "html"
[docs] class Page(AuditBase, ContentManageableMixin): __tablename__ = "pages" title: Mapped[str] = mapped_column(String(500)) keywords: Mapped[str] = mapped_column(String(1000), default="") description: Mapped[str] = mapped_column(Text, default="") path: Mapped[str] = mapped_column(String(500), unique=True, index=True) content: Mapped[str] = mapped_column(Text, default="") content_type: Mapped[ContentType] = mapped_column( Enum(ContentType, values_callable=lambda x: [e.value for e in x]), default=ContentType.MARKDOWN, ) is_published: Mapped[bool] = mapped_column(Boolean, default=True, index=True) template_name: Mapped[str] = mapped_column(String(255), default="pages/default.html") images: Mapped[list[Image]] = relationship( "Image", back_populates="page", cascade="all, delete-orphan", lazy="selectin", ) documents: Mapped[list[DocumentFile]] = relationship( "DocumentFile", back_populates="page", cascade="all, delete-orphan", lazy="selectin", )
[docs] class Image(AuditBase): __tablename__ = "page_images" page_id: Mapped[UUID] = mapped_column(ForeignKey("pages.id", ondelete="CASCADE")) image: Mapped[str] = mapped_column(String(500)) page: Mapped[Page] = relationship("Page", back_populates="images")
[docs] class DocumentFile(AuditBase): __tablename__ = "page_documents" page_id: Mapped[UUID] = mapped_column(ForeignKey("pages.id", ondelete="CASCADE")) document: Mapped[str] = mapped_column(String(500)) page: Mapped[Page] = relationship("Page", back_populates="documents")