97 lines
2.5 KiB
Python
97 lines
2.5 KiB
Python
from pydantic import BaseModel, EmailStr, Field, ConfigDict
|
|
from typing import Optional, List
|
|
from datetime import datetime
|
|
|
|
class UserBase(BaseModel):
|
|
email: EmailStr
|
|
name: str
|
|
avatar_url: Optional[str] = None
|
|
role: str = "regular"
|
|
weekly_star_quota: int = Field(default=15, ge=1, le=100)
|
|
|
|
class UserCreate(UserBase):
|
|
google_id: Optional[str] = None
|
|
|
|
class UserUpdate(BaseModel):
|
|
name: Optional[str] = None
|
|
avatar_url: Optional[str] = None
|
|
role: Optional[str] = None
|
|
weekly_star_quota: Optional[int] = Field(default=None, ge=1, le=100)
|
|
is_active: Optional[bool] = None
|
|
|
|
class UserOut(UserBase):
|
|
id: int
|
|
google_id: Optional[str] = None
|
|
is_active: bool
|
|
created_at: datetime
|
|
|
|
model_config = ConfigDict(from_attributes=True)
|
|
|
|
class ChoreTypeBase(BaseModel):
|
|
title: str
|
|
description: Optional[str] = None
|
|
star_reward: int = Field(default=1, ge=1, le=5)
|
|
recurrence: str = Field(default="daily", description="daily, weekly, spontaneous")
|
|
icon: str = "CheckSquare"
|
|
|
|
class ChoreTypeCreate(ChoreTypeBase):
|
|
pass
|
|
|
|
class ChoreTypeUpdate(BaseModel):
|
|
title: Optional[str] = None
|
|
description: Optional[str] = None
|
|
star_reward: Optional[int] = Field(default=None, ge=1, le=5)
|
|
recurrence: Optional[str] = None
|
|
icon: Optional[str] = None
|
|
|
|
class ChoreTypeOut(ChoreTypeBase):
|
|
id: int
|
|
created_at: datetime
|
|
|
|
model_config = ConfigDict(from_attributes=True)
|
|
|
|
class ChoreCompletionCreate(BaseModel):
|
|
chore_type_id: int
|
|
notes: Optional[str] = None
|
|
|
|
class ChoreCompletionOut(BaseModel):
|
|
id: int
|
|
chore_type_id: int
|
|
user_id: int
|
|
completed_at: datetime
|
|
stars_earned: int
|
|
week_identifier: str
|
|
notes: Optional[str] = None
|
|
user_name: Optional[str] = None
|
|
user_avatar: Optional[str] = None
|
|
chore_title: Optional[str] = None
|
|
chore_icon: Optional[str] = None
|
|
|
|
model_config = ConfigDict(from_attributes=True)
|
|
|
|
class UserWeekProgress(BaseModel):
|
|
user_id: int
|
|
name: str
|
|
email: str
|
|
avatar_url: Optional[str]
|
|
role: str
|
|
weekly_star_quota: int
|
|
stars_earned: int
|
|
percentage: float
|
|
completions_count: int
|
|
|
|
class WeeklyReportOut(BaseModel):
|
|
week_identifier: str
|
|
user_progress: List[UserWeekProgress]
|
|
total_stars_earned: int
|
|
total_completions: int
|
|
|
|
class GoogleAuthRequest(BaseModel):
|
|
credential: Optional[str] = None
|
|
email: Optional[EmailStr] = None
|
|
name: Optional[str] = None
|
|
avatar_url: Optional[str] = None
|
|
|
|
class DemoLoginRequest(BaseModel):
|
|
email: EmailStr
|