from typing import Optional from pydantic import ( BaseModel, Field, PastDatetime, TypeAdapter, field_validator ) from app.utils.custom_functions import html2text from app.core.config import settings class PostBase(BaseModel): title: Optional[str] = Field(max_length=100) text: Optional[str] = None image_path: Optional[str] = None class PostCreate(PostBase): title: str = Field(max_length=100) text: str image_path: str class PostUpdate(PostBase): ... class PostInTemplate(BaseModel): title: str text: str created_at: PastDatetime slug: str class Config: from_attributes = True @field_validator('text', mode='after') @classmethod def html_to_text(cls, v: str) -> str: return html2text(v)[:60] ListPostInTemplate = TypeAdapter(list[PostInTemplate]) class PostDetail(BaseModel): title: str text: str created_at: PastDatetime image_path: str class Config: from_attributes = True @field_validator('image_path', mode='after') @classmethod def absolute_image_path(cls, v: str) -> str | None: return str( settings.MEDIA_FOLDER / settings.FILE_FOLDERS['post_images'] / v ) class PostInDBBase(PostBase): slug: str title: str text: str image_path: str owner_id: int class Config: from_attributes = True class Post(PostInDBBase): @field_validator('image_path', mode='after') @classmethod def absolute_image_path(cls, v: str) -> str | None: return str( settings.MEDIA_FOLDER / settings.FILE_FOLDERS['post_images'] / v )