Source code for pydotorg.domains.community.models

"""Community domain models."""

from __future__ import annotations

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, Base, SlugMixin
from pydotorg.domains.pages.models import ContentType


[docs] class Post(AuditBase, SlugMixin): __tablename__ = "community_posts" title: Mapped[str] = mapped_column(String(500)) content: Mapped[str] = mapped_column(Text) content_type: Mapped[ContentType] = mapped_column( Enum(ContentType, values_callable=lambda x: [e.value for e in x]), default=ContentType.MARKDOWN, ) creator_id: Mapped[UUID] = mapped_column(ForeignKey("users.id", ondelete="CASCADE")) is_published: Mapped[bool] = mapped_column(Boolean, default=False, index=True) photos: Mapped[list[Photo]] = relationship( "Photo", back_populates="post", cascade="all, delete-orphan", lazy="selectin", ) videos: Mapped[list[Video]] = relationship( "Video", back_populates="post", cascade="all, delete-orphan", lazy="selectin", ) links: Mapped[list[Link]] = relationship( "Link", back_populates="post", cascade="all, delete-orphan", lazy="selectin", )
[docs] class Photo(Base): __tablename__ = "community_photos" post_id: Mapped[UUID | None] = mapped_column( ForeignKey("community_posts.id", ondelete="CASCADE"), nullable=True, ) image: Mapped[str] = mapped_column(String(500)) caption: Mapped[str | None] = mapped_column(String(500), nullable=True) creator_id: Mapped[UUID] = mapped_column(ForeignKey("users.id", ondelete="CASCADE")) post: Mapped[Post | None] = relationship("Post", back_populates="photos")
[docs] class Video(Base): __tablename__ = "community_videos" post_id: Mapped[UUID | None] = mapped_column( ForeignKey("community_posts.id", ondelete="CASCADE"), nullable=True, ) url: Mapped[str] = mapped_column(String(1000)) title: Mapped[str] = mapped_column(String(500)) creator_id: Mapped[UUID] = mapped_column(ForeignKey("users.id", ondelete="CASCADE")) post: Mapped[Post | None] = relationship("Post", back_populates="videos")