Spaces:
Runtime error
Runtime error
| # Directory: app/schemas.py | |
| from datetime import datetime, date | |
| from typing import Optional, List | |
| from pydantic import BaseModel, EmailStr, Field, validator | |
| from uuid import UUID | |
| from fastapi.security import OAuth2PasswordBearer | |
| oauth2_scheme = OAuth2PasswordBearer(tokenUrl="/auth/login") | |
| # --- Shared Schemas --- | |
| class Msg(BaseModel): | |
| detail: str | |
| # --- User --- | |
| class UserBase(BaseModel): | |
| email: EmailStr | |
| full_name: str | |
| class UserCreate(UserBase): | |
| password: str | |
| class UserOut(UserBase): | |
| id: UUID | |
| is_active: bool | |
| created_at: datetime | |
| updated_at: datetime | |
| # --- Token --- | |
| class Token(BaseModel): | |
| access_token: str | |
| refresh_token: str | |
| token_type: str = "bearer" | |
| # --- Hero --- | |
| class HeroBase(BaseModel): | |
| title: str | |
| subtitle: str | |
| description: str | |
| cta_text: str | |
| cta_link: str | |
| background_image: str | |
| profile_image: str | |
| animation_style: str | |
| show_scroll_indicator: bool | |
| class HeroUpdate(HeroBase): | |
| pass | |
| class HeroResponse(HeroBase): | |
| id: UUID | |
| updated_at: datetime | |
| # --- About --- | |
| class AboutBase(BaseModel): | |
| title: str | |
| introduction: str | |
| description: str | |
| profile_image: str | |
| highlights: List[str] | |
| skills: List[str] | |
| location: str | |
| availability: str | |
| email: str | |
| phone: str | |
| class AboutResponse(AboutBase): | |
| id: UUID | |
| updated_at: datetime | |
| # --- Experience --- | |
| class ExperienceBase(BaseModel): | |
| title: Optional[str] = None | |
| company: Optional[str] = None | |
| location: Optional[str] = None | |
| start_date: date = Field(..., alias="startDate") | |
| end_date: Optional[date] = Field(None, alias="endDate") | |
| is_current: Optional[bool] = Field(None, alias="current") | |
| description: Optional[str] = None | |
| technologies: Optional[List[str]] = None | |
| achievements: Optional[List[str]] = None | |
| display_order: Optional[int] = None | |
| class Config: | |
| allow_population_by_field_name = True | |
| class ExperienceCreate(ExperienceBase): | |
| def parse_partial_date(cls, value): | |
| if value == "": | |
| return None | |
| if isinstance(value, str) and len(value) == 7: | |
| return datetime.strptime(value + "-01", "%Y-%m-%d").date() | |
| return value | |
| class ExperienceUpdate(ExperienceBase): | |
| pass | |
| class ExperienceResponse(ExperienceBase): | |
| id: UUID | |
| created_at: datetime | |
| updated_at: datetime | |
| class Config: | |
| orm_mode = True | |
| populate_by_name = True | |
| # --- Project --- | |
| class ProjectBase(BaseModel): | |
| title: str | |
| description: str | |
| long_description: str | |
| image: Optional[str] = None | |
| technologies: List[str] = [] | |
| category: str | |
| status: str | |
| is_featured: bool | |
| github_url: Optional[str] = None | |
| live_url: Optional[str] = None | |
| start_date: date | |
| end_date: Optional[date] = None | |
| highlights: List[str] = [] | |
| display_order: int | |
| class ProjectCreate(ProjectBase): | |
| pass | |
| class ProjectUpdate(ProjectBase): | |
| pass | |
| class ProjectResponse(ProjectBase): | |
| id: UUID | |
| created_at: datetime | |
| updated_at: datetime | |
| # --- Skill Category --- | |
| class SkillCategoryBase(BaseModel): | |
| name: str | |
| color: str | |
| description: str | |
| display_order: Optional[int] = None | |
| class SkillCategoryCreate(SkillCategoryBase): | |
| pass | |
| class SkillCategoryUpdate(SkillCategoryBase): | |
| pass | |
| class SkillCategoryResponse(SkillCategoryBase): | |
| id: UUID | |
| # --- Skill --- | |
| class SkillBase(BaseModel): | |
| name: str | |
| category_id: UUID | |
| proficiency: int | |
| years_of_experience: int | |
| icon: Optional[str] | |
| is_featured: bool | |
| display_order: Optional[int] = None | |
| class SkillCreate(SkillBase): | |
| pass | |
| class SkillUpdate(SkillBase): | |
| pass | |
| class SkillResponse(SkillBase): | |
| id: UUID | |
| # --- Blog --- | |
| class BlogPostBase(BaseModel): | |
| title: str | |
| slug: str | |
| excerpt: str | |
| content: str | |
| author: str | |
| publish_date: date | |
| status: str | |
| is_featured: bool | |
| image: Optional[str] = None | |
| tags: List[str] | |
| category: str | |
| read_time: int | |
| seo_title: str | |
| seo_description: str | |
| class BlogPostCreate(BlogPostBase): | |
| pass | |
| class BlogPostUpdate(BlogPostBase): | |
| pass | |
| class BlogPostResponse(BlogPostBase): | |
| id: UUID | |
| views: int | |
| created_at: datetime | |
| updated_at: datetime | |
| # --- Certification --- | |
| class CertificationBase(BaseModel): | |
| name: str | |
| issuer: str | |
| issue_date: date | |
| expiry_date: Optional[date] | |
| credential_id: Optional[str] | |
| verification_url: Optional[str] | |
| image: Optional[str] | |
| description: Optional[str] | |
| is_featured: bool | |
| display_order: int | |
| class CertificationCreate(CertificationBase): | |
| pass | |
| class CertificationUpdate(CertificationBase): | |
| pass | |
| class CertificationResponse(CertificationBase): | |
| id: UUID | |
| # --- Contact Message --- | |
| class ContactMessageCreate(BaseModel): | |
| name: str | |
| email: str | |
| subject: str | |
| message: str | |
| class ContactMessageResponse(ContactMessageCreate): | |
| id: UUID | |
| is_read: bool | |
| created_at: datetime | |