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