91 lines
2.0 KiB
Python
91 lines
2.0 KiB
Python
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
|
|
committee_role: str | None
|
|
skills_tags: list[str] | None
|
|
wechat_id: str | None
|
|
phone: str | None
|
|
avatar_url: str | None
|
|
bio: str | None
|
|
created_at: datetime
|
|
enabled_modules: list[str] | None = None
|
|
|
|
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
|
|
committee_role: str | None = 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
|
|
committee_role: str | None = 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
|