Source code for app.apps.blog.models

"""Blog app Pydantic models."""

from typing import List, Optional
from pydantic import BaseModel


[docs] class BlogPostMetadata(BaseModel): """Metadata stored in the revision node.""" title: str author: str date: str content: str # Markdown content
[docs] class BlogPostSEO(BaseModel): """SEO settings stored in the revision metadata.""" title: Optional[str] = None description: Optional[str] = None image: Optional[str] = None canonical_url: Optional[str] = None keywords: Optional[List[str]] = None noindex: Optional[bool] = None
[docs] class BlogPostMedia(BaseModel): """Media item attached to a blog revision.""" name: str url: str content_type: Optional[str] = None
[docs] class BlogPostCreate(BaseModel): """Request model for creating a blog post.""" title: str content: str space_path: str # Must be provided by client author: Optional[str] = None tags: List[str] = [] media: List[BlogPostMedia] = [] seo: Optional[BlogPostSEO] = None
[docs] class BlogPostResponse(BaseModel): """Response model for blog posts.""" kref: str slug: str title: str author: str date: str content: Optional[str] = None # Full content only in detail view tags: List[str] = [] revision: str revisions: List[str] = [] published: bool space_path: Optional[str] = None media: List[BlogPostMedia] = [] seo: Optional[BlogPostSEO] = None
[docs] class BlogSettings(BaseModel): """Blog settings for a project.""" project_name: str post_item_kind: str = "post" pagination_count: int = 10 display_type: str = "title_only" # title_only, excerpt, full display_category_filters: bool = True allow_public: bool = False