"""Pydantic schemas for Activity endpoints.""" from __future__ import annotations from datetime import datetime 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: str | None = None due_date: datetime | None = None account_id: int | None = None contact_id: int | None = None deal_id: int | None = 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: ActivityType | None = None subject: str | None = Field(None, min_length=1, max_length=255) body: str | None = None due_date: datetime | None = None account_id: int | None = None contact_id: int | None = None deal_id: int | None = None class ActivityOut(ActivityBase): model_config = ConfigDict(from_attributes=True) id: int org_id: int owner_id: int completed_at: datetime | None = None created_at: datetime updated_at: datetime deleted_at: datetime | None = None class ActivityCompleteRequest(BaseModel): """Body for PATCH /api/v1/activities/{id}/complete.""" outcome: str | None = Field(None, max_length=2048) __all__ = [ "ActivityCompleteRequest", "ActivityCreate", "ActivityOut", "ActivityUpdate", ]