import json from datetime import datetime from pydantic import BaseModel, EmailStr, field_validator class UserOut(BaseModel): id: int email: str name: str student_id: str | None role: str status: str class_id: int | None industry: str | None company: str | None position: str | None skills_tags: list[str] | None wechat_id: str | None phone: str | None avatar_url: str | None bio: str | None created_at: datetime model_config = {"from_attributes": True} @field_validator("skills_tags", mode="before") @classmethod def parse_skills_tags(cls, v): if isinstance(v, str): try: return json.loads(v) except (json.JSONDecodeError, TypeError): return [] return v class UserPublic(BaseModel): """Shown to same-class approved members (includes contact info).""" id: int name: str student_id: str | None industry: str | None company: str | None position: str | None wechat_id: str | None phone: str | None avatar_url: str | None bio: str | None class UserListItem(BaseModel): """For admin user management list.""" id: int email: str name: str student_id: str | None role: str status: str class_id: int | None industry: str | None company: str | None created_at: datetime model_config = {"from_attributes": True} class UserUpdate(BaseModel): email: EmailStr | None = None name: str | None = None industry: str | None = None company: str | None = None position: str | None = None wechat_id: str | None = None phone: str | None = None bio: str | None = None class UserStatusUpdate(BaseModel): status: str # approved | rejected | disabled role: str | None = None class TokenResponse(BaseModel): token: str user: UserOut