Source code for pydotorg.domains.blogs.models

"""Blogs domain models."""

from __future__ import annotations

import datetime
from uuid import UUID

from sqlalchemy import Boolean, Column, DateTime, ForeignKey, String, Table, Text, UniqueConstraint
from sqlalchemy.orm import Mapped, mapped_column, relationship

from pydotorg.core.database.base import AuditBase, Base, NameSlugMixin

feed_aggregate_feeds = Table(
    "feed_aggregate_feeds",
    Base.metadata,
    Column("feed_aggregate_id", ForeignKey("feed_aggregates.id", ondelete="CASCADE"), primary_key=True),
    Column("feed_id", ForeignKey("feeds.id", ondelete="CASCADE"), primary_key=True),
)


[docs] class Feed(AuditBase): __tablename__ = "feeds" name: Mapped[str] = mapped_column(String(255)) website_url: Mapped[str] = mapped_column(String(500)) feed_url: Mapped[str] = mapped_column(String(500), unique=True) last_fetched: Mapped[datetime.datetime | None] = mapped_column(DateTime(timezone=True), nullable=True) is_active: Mapped[bool] = mapped_column(Boolean, default=True, index=True) is_official: Mapped[bool] = mapped_column(Boolean, default=False, index=True) priority: Mapped[int] = mapped_column(default=0, index=True) entries: Mapped[list[BlogEntry]] = relationship( "BlogEntry", back_populates="feed", cascade="all, delete-orphan", lazy="noload", )
[docs] class BlogEntry(AuditBase): __tablename__ = "blog_entries" __table_args__ = (UniqueConstraint("guid", name="uq_blog_entry_guid"),) feed_id: Mapped[UUID] = mapped_column(ForeignKey("feeds.id", ondelete="CASCADE")) title: Mapped[str] = mapped_column(String(500)) summary: Mapped[str | None] = mapped_column(Text, nullable=True) content: Mapped[str | None] = mapped_column(Text, nullable=True) url: Mapped[str] = mapped_column(String(1000)) pub_date: Mapped[datetime.datetime] = mapped_column(DateTime(timezone=True), index=True) guid: Mapped[str] = mapped_column(String(500)) is_featured: Mapped[bool] = mapped_column(Boolean, default=False, index=True) feed: Mapped[Feed] = relationship("Feed", back_populates="entries", lazy="selectin")
[docs] class FeedAggregate(AuditBase, NameSlugMixin): __tablename__ = "feed_aggregates" description: Mapped[str | None] = mapped_column(Text, nullable=True) feeds: Mapped[list[Feed]] = relationship( "Feed", secondary=feed_aggregate_feeds, lazy="selectin", )
[docs] class RelatedBlog(AuditBase): __tablename__ = "related_blogs" blog_name: Mapped[str] = mapped_column(String(255)) blog_website: Mapped[str] = mapped_column(String(500)) description: Mapped[str | None] = mapped_column(Text, nullable=True)