from datetime import datetime from typing import Optional, Annotated from bson import ObjectId from pydantic import BaseModel, BeforeValidator def validate_object_id(v) -> str: if isinstance(v, ObjectId): return str(v) if isinstance(v, str): return v raise ValueError("Invalid ObjectId") PyObjectId = Annotated[str, BeforeValidator(validate_object_id)] class Client(BaseModel): id: Optional[str] = None name: str slug: str is_active: bool = True created_at: Optional[datetime] = None updated_at: Optional[datetime] = None class ClientCreate(BaseModel): name: str slug: str class ClientUpdate(BaseModel): name: Optional[str] = None slug: Optional[str] = None is_active: Optional[bool] = None class Team(BaseModel): id: Optional[str] = None name: str client_id: str member_user_ids: list[str] = [] created_at: Optional[datetime] = None updated_at: Optional[datetime] = None class TeamCreate(BaseModel): name: str class TeamUpdate(BaseModel): name: Optional[str] = None class Project(BaseModel): id: Optional[str] = None name: str client_id: str is_active: bool = True default_languages: list[str] = [] default_linguist_id: Optional[str] = None default_reviewer_id: Optional[str] = None created_at: Optional[datetime] = None updated_at: Optional[datetime] = None class ProjectCreate(BaseModel): name: str default_languages: list[str] = [] default_linguist_id: Optional[str] = None default_reviewer_id: Optional[str] = None class ProjectUpdate(BaseModel): name: Optional[str] = None is_active: Optional[bool] = None default_languages: Optional[list[str]] = None default_linguist_id: Optional[str] = None default_reviewer_id: Optional[str] = None