"""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]