Source code for pydotorg.domains.blogs.schemas

"""Blogs domain Pydantic schemas."""

from __future__ import annotations

import datetime
from typing import Annotated
from uuid import UUID

from pydantic import BaseModel, ConfigDict, Field


[docs] class FeedBase(BaseModel): """Base Feed schema with common fields.""" name: Annotated[str, Field(min_length=1, max_length=255)] website_url: Annotated[str, Field(min_length=1, max_length=500)] feed_url: Annotated[str, Field(min_length=1, max_length=500)] is_active: bool = True is_official: bool = False priority: int = 100
[docs] class FeedCreate(FeedBase): """Schema for creating a new Feed."""
[docs] class FeedUpdate(BaseModel): """Schema for updating a Feed.""" name: Annotated[str, Field(min_length=1, max_length=255)] | None = None website_url: Annotated[str, Field(min_length=1, max_length=500)] | None = None feed_url: Annotated[str, Field(min_length=1, max_length=500)] | None = None is_active: bool | None = None is_official: bool | None = None priority: int | None = None
[docs] class FeedRead(FeedBase): """Schema for reading Feed data.""" id: UUID last_fetched: datetime.datetime | None created_at: datetime.datetime updated_at: datetime.datetime model_config = ConfigDict(from_attributes=True)
[docs] class FeedList(BaseModel): """Schema for Feed list items.""" id: UUID name: str website_url: str is_active: bool is_official: bool priority: int last_fetched: datetime.datetime | None model_config = ConfigDict(from_attributes=True)
[docs] class BlogEntryBase(BaseModel): """Base BlogEntry schema with common fields.""" title: Annotated[str, Field(min_length=1, max_length=500)] summary: str | None = None content: str | None = None url: Annotated[str, Field(min_length=1, max_length=1000)] pub_date: datetime.datetime guid: Annotated[str, Field(min_length=1, max_length=500)] is_featured: bool = False
[docs] class BlogEntryCreate(BlogEntryBase): """Schema for creating a new BlogEntry.""" feed_id: UUID
[docs] class BlogEntryUpdate(BaseModel): """Schema for updating a BlogEntry.""" title: Annotated[str, Field(min_length=1, max_length=500)] | None = None summary: str | None = None content: str | None = None url: Annotated[str, Field(min_length=1, max_length=1000)] | None = None pub_date: datetime.datetime | None = None is_featured: bool | None = None
[docs] class BlogEntryRead(BlogEntryBase): """Schema for reading BlogEntry data.""" id: UUID feed_id: UUID created_at: datetime.datetime updated_at: datetime.datetime model_config = ConfigDict(from_attributes=True)
[docs] class BlogEntryList(BaseModel): """Schema for BlogEntry list items.""" id: UUID feed_id: UUID title: str summary: str | None url: str pub_date: datetime.datetime is_featured: bool model_config = ConfigDict(from_attributes=True)
[docs] class BlogEntryWithFeed(BlogEntryRead): """Schema for BlogEntry with Feed information.""" feed: FeedRead model_config = ConfigDict(from_attributes=True)
[docs] class FeedAggregateBase(BaseModel): """Base FeedAggregate schema with common fields.""" name: Annotated[str, Field(min_length=1, max_length=255)] slug: Annotated[str, Field(min_length=1, max_length=255)] description: str | None = None
[docs] class FeedAggregateCreate(FeedAggregateBase): """Schema for creating a new FeedAggregate.""" feed_ids: list[UUID] = []
[docs] class FeedAggregateUpdate(BaseModel): """Schema for updating a FeedAggregate.""" name: Annotated[str, Field(min_length=1, max_length=255)] | None = None description: str | None = None feed_ids: list[UUID] | None = None
[docs] class FeedAggregateRead(FeedAggregateBase): """Schema for reading FeedAggregate data.""" id: UUID created_at: datetime.datetime updated_at: datetime.datetime model_config = ConfigDict(from_attributes=True)
[docs] class FeedAggregateWithFeeds(FeedAggregateRead): """Schema for FeedAggregate with Feeds.""" feeds: list[FeedRead] model_config = ConfigDict(from_attributes=True)
[docs] class RelatedBlogBase(BaseModel): """Base RelatedBlog schema with common fields.""" blog_name: Annotated[str, Field(min_length=1, max_length=255)] blog_website: Annotated[str, Field(min_length=1, max_length=500)] description: str | None = None
[docs] class RelatedBlogCreate(RelatedBlogBase): """Schema for creating a new RelatedBlog."""
[docs] class RelatedBlogUpdate(BaseModel): """Schema for updating a RelatedBlog.""" blog_name: Annotated[str, Field(min_length=1, max_length=255)] | None = None blog_website: Annotated[str, Field(min_length=1, max_length=500)] | None = None description: str | None = None
[docs] class RelatedBlogRead(RelatedBlogBase): """Schema for reading RelatedBlog data.""" id: UUID created_at: datetime.datetime updated_at: datetime.datetime model_config = ConfigDict(from_attributes=True)
[docs] class BlogsPageData(BaseModel): """Schema for blogs page template data.""" recent_entries: list[BlogEntryWithFeed] feeds: list[FeedRead] related_blogs: list[RelatedBlogRead]
[docs] class FeedDetailPageData(BaseModel): """Schema for feed detail page template data.""" feed: FeedRead entries: list[BlogEntryList]