File size: 1,269 Bytes
54eb2ce | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | 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
|