from pydantic import BaseModel, EmailStr from typing import List, Optional from datetime import datetime class UserBase(BaseModel): id: str name: str role: str hue: int initials: str email: Optional[str] = None phone: Optional[str] = None photo: Optional[str] = None account_type: str = "standard" class UserCreate(UserBase): password: str class UserLogin(BaseModel): id: str password: str class UserUpdate(BaseModel): name: Optional[str] = None role: Optional[str] = None account_type: Optional[str] = None photo: Optional[str] = None class PasswordChange(BaseModel): old_password: str new_password: str class User(UserBase): created_at: datetime class Config: from_attributes = True class TaskNoteBase(BaseModel): body: str class TaskNoteCreate(TaskNoteBase): task_id: str author_id: str class TaskNote(TaskNoteBase): id: int task_id: str author_id: str created_at: datetime class Config: from_attributes = True class TagBase(BaseModel): tag: str class Tag(TagBase): class Config: from_attributes = True class TaskBase(BaseModel): title: str description: Optional[str] = None assignee_id: str added_by: str priority: str source: str status: str = "open" due_at: Optional[datetime] = None reminder_at: Optional[datetime] = None deleted_at: Optional[datetime] = None position: float = 0.0 class TaskCreate(TaskBase): id: Optional[str] = None tags: List[str] = [] class TaskUpdate(BaseModel): title: Optional[str] = None description: Optional[str] = None assignee_id: Optional[str] = None priority: Optional[str] = None status: Optional[str] = None due_at: Optional[datetime] = None reminder_at: Optional[datetime] = None position: Optional[float] = None class Task(TaskBase): id: str added_at: datetime tags: List[Tag] = [] notes: List[TaskNote] = [] class Config: from_attributes = True class AuditLogBase(BaseModel): actor: str action: str summary: str target: Optional[str] = None class AuditLog(AuditLogBase): id: str at: datetime class Config: from_attributes = True class SessionBase(BaseModel): user_id: str device: str location: Optional[str] = None class Session(SessionBase): id: int last_active: datetime class Config: from_attributes = True class WorkspaceBase(BaseModel): name: str timezone: str class WorkspaceUpdate(BaseModel): name: Optional[str] = None timezone: Optional[str] = None class Workspace(WorkspaceBase): id: str class Config: from_attributes = True class Token(BaseModel): access_token: str token_type: str class TokenData(BaseModel): username: Optional[str] = None