""" Pydantic schemas for Project model. Request and response schemas for individual projects and engagements. """ from datetime import date, datetime from typing import Optional from uuid import UUID from pydantic import BaseModel, Field class ProjectBase(BaseModel): """Base schema with shared Project fields.""" client_id: str = Field(..., description="Foreign key to clients table (UUID)") name: str = Field(..., description="Project name") slug: Optional[str] = Field(None, description="URL-safe slug (directory name like 'dataforth-dos')") category: Optional[str] = Field(None, description="Project category: client_project, internal_product, infrastructure, website, development_tool, documentation") status: str = Field("working", description="Status: complete, working, blocked, pending, critical, deferred") priority: Optional[str] = Field(None, description="Priority level: critical, high, medium, low") description: Optional[str] = Field(None, description="Project description") started_date: Optional[date] = Field(None, description="Date project started") target_completion_date: Optional[date] = Field(None, description="Target completion date") completed_date: Optional[date] = Field(None, description="Actual completion date") estimated_hours: Optional[float] = Field(None, description="Estimated hours for completion") actual_hours: Optional[float] = Field(None, description="Actual hours spent") gitea_repo_url: Optional[str] = Field(None, description="Gitea repository URL if applicable") notes: Optional[str] = Field(None, description="Additional notes about the project") class ProjectCreate(ProjectBase): """Schema for creating a new Project.""" pass class ProjectUpdate(BaseModel): """Schema for updating an existing Project. All fields are optional.""" client_id: Optional[str] = Field(None, description="Foreign key to clients table (UUID)") name: Optional[str] = Field(None, description="Project name") slug: Optional[str] = Field(None, description="URL-safe slug (directory name like 'dataforth-dos')") category: Optional[str] = Field(None, description="Project category: client_project, internal_product, infrastructure, website, development_tool, documentation") status: Optional[str] = Field(None, description="Status: complete, working, blocked, pending, critical, deferred") priority: Optional[str] = Field(None, description="Priority level: critical, high, medium, low") description: Optional[str] = Field(None, description="Project description") started_date: Optional[date] = Field(None, description="Date project started") target_completion_date: Optional[date] = Field(None, description="Target completion date") completed_date: Optional[date] = Field(None, description="Actual completion date") estimated_hours: Optional[float] = Field(None, description="Estimated hours for completion") actual_hours: Optional[float] = Field(None, description="Actual hours spent") gitea_repo_url: Optional[str] = Field(None, description="Gitea repository URL if applicable") notes: Optional[str] = Field(None, description="Additional notes about the project") class ProjectResponse(ProjectBase): """Schema for Project responses with ID and timestamps.""" id: UUID = Field(..., description="Unique identifier for the project") created_at: datetime = Field(..., description="Timestamp when the project was created") updated_at: datetime = Field(..., description="Timestamp when the project was last updated") model_config = {"from_attributes": True}