From c08104f9eebb7390eb234b20a29c959421f21cb1 Mon Sep 17 00:00:00 2001 From: David Whittaker Date: Thu, 15 May 2025 11:48:45 -0700 Subject: [PATCH] updating to Pydantic v2 validationData --- src/dispatch/conference/models.py | 13 ++++++++++--- src/dispatch/document/models.py | 14 +++++++++++--- 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/src/dispatch/conference/models.py b/src/dispatch/conference/models.py index 85417d802455..60747d26b24e 100644 --- a/src/dispatch/conference/models.py +++ b/src/dispatch/conference/models.py @@ -1,7 +1,8 @@ """Models for conference resources in the Dispatch application.""" + from jinja2 import Template -from pydantic import field_validator +from pydantic import field_validator, ValidationInfo from sqlalchemy import Column, Integer, String, ForeignKey from dispatch.database.core import Base @@ -11,6 +12,7 @@ class Conference(Base, ResourceMixin): """SQLAlchemy model for conference resources.""" + id = Column(Integer, primary_key=True) conference_id = Column(String) conference_challenge = Column(String, nullable=False, server_default="N/A") @@ -20,28 +22,33 @@ class Conference(Base, ResourceMixin): # Pydantic models... class ConferenceBase(ResourceBase): """Base Pydantic model for conference resources.""" + conference_id: str | None = None conference_challenge: str | None = None class ConferenceCreate(ConferenceBase): """Pydantic model for creating a conference resource.""" + pass class ConferenceUpdate(ConferenceBase): """Pydantic model for updating a conference resource.""" + pass class ConferenceRead(ConferenceBase): """Pydantic model for reading a conference resource.""" + description: str | None = None @field_validator("description", mode="before") @classmethod - def set_description(cls, v, values): + def set_description(cls, v, info: ValidationInfo): """Sets the description using a Jinja2 template and the conference challenge.""" + conference_challenge = info.data.get("conference_challenge") return Template(INCIDENT_CONFERENCE_DESCRIPTION).render( - conference_challenge=values["conference_challenge"] + conference_challenge=conference_challenge ) diff --git a/src/dispatch/document/models.py b/src/dispatch/document/models.py index e7c13f9ca033..b3be6bceaba0 100644 --- a/src/dispatch/document/models.py +++ b/src/dispatch/document/models.py @@ -1,8 +1,9 @@ """Models for document resources in the Dispatch application.""" + from datetime import datetime from collections import defaultdict -from pydantic import field_validator +from pydantic import field_validator, ValidationInfo from sqlalchemy import ( Column, ForeignKey, @@ -42,6 +43,7 @@ class Document(ProjectMixin, ResourceMixin, EvergreenMixin, Base): """SQLAlchemy model for document resources.""" + id = Column(Integer, primary_key=True) name = Column(String) description = Column(String) @@ -63,6 +65,7 @@ class Document(ProjectMixin, ResourceMixin, EvergreenMixin, Base): # Pydantic models... class DocumentBase(ResourceBase, EvergreenBase): """Base Pydantic model for document resources.""" + description: str | None = None name: NameStr created_at: datetime | None = None @@ -71,6 +74,7 @@ class DocumentBase(ResourceBase, EvergreenBase): class DocumentCreate(DocumentBase): """Pydantic model for creating a document resource.""" + filters: list[SearchFilterRead] | None = [] project: ProjectRead tags: list[TagRead] | None = [] @@ -78,6 +82,7 @@ class DocumentCreate(DocumentBase): class DocumentUpdate(DocumentBase): """Pydantic model for updating a document resource.""" + filters: list[SearchFilterRead] | None tags: list[TagRead] | None = [] @@ -101,6 +106,7 @@ def find_exclusive(cls, v): class DocumentRead(DocumentBase): """Pydantic model for reading a document resource.""" + id: PrimaryKey filters: list[SearchFilterRead] | None = [] project: ProjectRead | None @@ -108,13 +114,15 @@ class DocumentRead(DocumentBase): @field_validator("description", mode="before") @classmethod - def set_description(cls, v, values): + def set_description(cls, v, info: ValidationInfo): """Sets the description for the document resource.""" if not v: - return DOCUMENT_DESCRIPTIONS.get(values["resource_type"], "No Description") + resource_type = info.data.get("resource_type") + return DOCUMENT_DESCRIPTIONS.get(resource_type, "No Description") return v class DocumentPagination(Pagination): """Pydantic model for paginated document results.""" + items: list[DocumentRead] = []