| from pydantic import BaseModel, field_validator
|
| from typing import Optional
|
|
|
| from ..lib.categories import VALID_CATEGORY_CODES
|
|
|
|
|
| class ProfileBase(BaseModel):
|
| phone: Optional[str] = None
|
| bio: Optional[str] = None
|
| avatar_url: Optional[str] = None
|
| topic_preferences: Optional[str] = None
|
|
|
| @field_validator("topic_preferences")
|
| @classmethod
|
| def validate_topic_preferences(cls, v: Optional[str]) -> Optional[str]:
|
| if v is None or v.strip() == "":
|
| return None
|
| tags = [t.strip() for t in v.split(",") if t.strip()]
|
| invalid = [t for t in tags if t not in VALID_CATEGORY_CODES]
|
| if invalid:
|
| raise ValueError(
|
| f"Invalid arXiv categories: {', '.join(invalid)}. "
|
| f"Must be valid CS/stat/eess categories (e.g. cs.AI, stat.ML)."
|
| )
|
| return ",".join(tags)
|
|
|
|
|
| class ProfileCreate(ProfileBase):
|
| pass
|
|
|
|
|
| class ProfileUpdate(ProfileBase):
|
| pass
|
|
|
|
|
| class ProfileResponse(BaseModel):
|
| id: int
|
| user_id: int
|
| phone: Optional[str] = None
|
| bio: Optional[str] = None
|
| avatar_url: Optional[str] = None
|
| topic_preferences: Optional[str] = None
|
|
|
| class Config:
|
| from_attributes = True
|
|
|