diff --git a/app/schemas/activity.py b/app/schemas/activity.py new file mode 100644 index 0000000..4976d0c --- /dev/null +++ b/app/schemas/activity.py @@ -0,0 +1,68 @@ +"""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", +]