import json from bson import ObjectId from pydantic import BaseModel, Field from typing import List, Optional, Union class PyObjectId(ObjectId): @classmethod def __get_validators__(cls): yield cls.validate @classmethod def validate(cls, v): if not ObjectId.is_valid(v): raise ValueError("Invalid objectid") return ObjectId(v) @classmethod def __modify_schema__(cls, field_schema): field_schema.update(type="string") class DataPost(BaseModel): name: str level: str content: List[str] class DataSmallPost(BaseModel): name: str level: int point: int class Point(BaseModel): less10 : Optional[int] = 0 form10to20: Optional[int] = 0 form20to30: Optional[int] = 0 form30to40: Optional[int] = 0 form40to50: Optional[int] = 0 form50to60: Optional[int] = 0 bigger60: Optional[int] = 0 total: Optional[int] = 0 class PostModel(BaseModel): id: PyObjectId = Field(default_factory=PyObjectId, alias="_id") original_post: Union[str, None] = None translation_post: Union[str, None] = None link : Union[str, None] = None is_active : str created_at: Optional[str] = None specialist: str summary: str data : List[DataPost] point : Point class Config: orm_mode = True case_sensitive = True allow_population_by_field_name = True arbitrary_types_allowed = True json_encoders = {ObjectId: str} schema_extra = { "example": { "original_post": "Joh111", "translation_post": "Doe11111", "link": "simple mortal111", "is_active": "false", "created_at": "07/20/22 02: 26: 54", "specialist": "", "summary": "", "data": [ { "name": "abc1", "level": "user", "content": [ "Hoàng Anh Hoàng Anh Hoàng Anh Hoàng AnhHoàng Anh Hoàng Anh Hoàng Anh Hoàng Anh Hoàng Anh", "Hoàng Anh Hoàng Anh Hoàng Anh Hoàng AnhHoàng Anh Hoàng Anh Hoàng Anh Hoàng Anh Hoàng Anh", "Hoàng Anh Hoàng Anh Hoàng Anh Hoàng AnhHoàng Anh Hoàng Anh Hoàng Anh Hoàng Anh Hoàng Anh", "Hoàng Anh Hoàng Anh Hoàng Anh Hoàng AnhHoàng Anh Hoàng Anh Hoàng Anh Hoàng Anh Hoàng Anh" ] }, { "name": "abc2", "level": "user", "content": [ "Hoàng Anh Hoàng Anh Hoàng Anh Hoàng AnhHoàng Anh Hoàng Anh Hoàng Anh Hoàng Anh Hoàng Anh", "Hoàng Anh Hoàng Anh Hoàng Anh Hoàng AnhHoàng Anh Hoàng Anh Hoàng Anh Hoàng Anh Hoàng Anh", "Hoàng Anh Hoàng Anh Hoàng Anh Hoàng AnhHoàng Anh Hoàng Anh Hoàng Anh Hoàng Anh Hoàng Anh", "Hoàng Anh Hoàng Anh Hoàng Anh Hoàng AnhHoàng Anh Hoàng Anh Hoàng Anh Hoàng Anh Hoàng Anh" ] }, { "name": "abc", "level": "user", "content": [ "Hoàng Anh Hoàng Anh Hoàng Anh Hoàng AnhHoàng Anh Hoàng Anh Hoàng Anh Hoàng Anh Hoàng Anh", "Hoàng Anh Hoàng Anh Hoàng Anh Hoàng AnhHoàng Anh Hoàng Anh Hoàng Anh Hoàng Anh Hoàng Anh", "Hoàng Anh Hoàng Anh Hoàng Anh Hoàng AnhHoàng Anh Hoàng Anh Hoàng Anh Hoàng Anh Hoàng Anh", "Hoàng Anh Hoàng Anh Hoàng Anh Hoàng AnhHoàng Anh Hoàng Anh Hoàng Anh Hoàng Anh Hoàng Anh" ] }, { "name": "abc3", "level": "user", "content": [ "Hoàng Anh Hoàng Anh Hoàng Anh Hoàng AnhHoàng Anh Hoàng Anh Hoàng Anh Hoàng Anh Hoàng Anh", "Hoàng Anh Hoàng Anh Hoàng Anh Hoàng AnhHoàng Anh Hoàng Anh Hoàng Anh Hoàng Anh Hoàng Anh", "Hoàng Anh Hoàng Anh Hoàng Anh Hoàng AnhHoàng Anh Hoàng Anh Hoàng Anh Hoàng Anh Hoàng Anh", "Hoàng Anh Hoàng Anh Hoàng Anh Hoàng AnhHoàng Anh Hoàng Anh Hoàng Anh Hoàng Anh Hoàng Anh" ] } ], "point": { "less10": 0, "form10to20": 0, "form20to30": 0, "form30to40": 0, "form40to50": 0, "form50to60": 0, "bigger60": 0, "total": 0 } } } class UpdatePostModel(BaseModel): original_post: Union[str, None] = None translation_post: Union[str, None] = None link : Union[str, None] = None is_active : str created_at: Optional[str] = None specialist: str summary: str data : List[DataPost] point : Point class Config: arbitrary_types_allowed = True json_encoders = {ObjectId: str} schema_extra = { "example": { "original_post": "John", "translation_post": "Doe", "link": "simple mortal", "is_active": "false", "created_at": "datetime", "specialist": "", "summary": "", "data": "" } } class ShowPostModel(BaseModel): id: PyObjectId = Field(default_factory=PyObjectId, alias="_id") original_post: Optional[str] translation_post: Optional[str] link: Optional[str] is_active: Optional[str] specialist: Optional[str] summary: Optional[str] data : List[DataSmallPost] point : Point class Config: arbitrary_types_allowed = True json_encoders = {ObjectId: str} schema_extra = { "example": { "original_post": "John", "translation_post": "Doe", "link": "simple mortal", "is_active": "false", "created_at": "datetime", "specialist": "", "summary": "", } }