"""Pydantic schemas for Activity endpoints.""" from __future__ import annotations from datetime import datetime from typing import Optional from pydantic import BaseModel, ConfigDict, Field, model_validator from app.models.activity import ActivityType class ActivityBase(BaseModel): type: ActivityType subject: str = Field(..., min_length=1, max_length=255) body: Optional[str] = None due_date: Optional[datetime] = None account_id: Optional[int] = None contact_id: Optional[int] = None deal_id: Optional[int] = None @model_validator(mode="after") def _check_at_least_one_parent(self) -> "ActivityBase": if self.account_id is None and self.contact_id is None and self.deal_id is None: raise ValueError( "At least one of account_id, contact_id, deal_id must be set" ) return self class ActivityCreate(ActivityBase): pass class ActivityUpdate(BaseModel): type: Optional[ActivityType] = None subject: Optional[str] = Field(None, min_length=1, max_length=255) body: Optional[str] = None due_date: Optional[datetime] = None account_id: Optional[int] = None contact_id: Optional[int] = None deal_id: Optional[int] = None class ActivityOut(ActivityBase): model_config = ConfigDict(from_attributes=True) id: int org_id: int owner_id: int completed_at: Optional[datetime] = None created_at: datetime updated_at: datetime deleted_at: Optional[datetime] = None class ActivityCompleteRequest(BaseModel): """Body for PATCH /api/v1/activities/{id}/complete.""" outcome: Optional[str] = Field(None, max_length=2048) __all__ = [ "ActivityCompleteRequest", "ActivityCreate", "ActivityOut", "ActivityUpdate", ]