Files
openapi-first/openapi_first/templates/vet_app/models.py

144 lines
2.8 KiB
Python

from datetime import date, datetime
from typing import Annotated, Literal
from pydantic import BaseModel, Field
class Metadata(BaseModel):
createdOn: datetime | None = None
updatedOn: datetime | None = None
class ParentBase(BaseModel):
name: str
email: str
phone: str | None = None
metadata: Metadata | None = None
class ParentCreate(ParentBase):
pass
class Parent(ParentBase):
id: int
class VetBase(BaseModel):
name: str
specialty: str | None = None
email: str
phone: str | None = None
metadata: Metadata | None = None
class VetCreate(VetBase):
pass
class Vet(VetBase):
id: int
class ProcedureNoteBase(BaseModel):
summary: str | None = None
details: str | None = None
class BasicNote(ProcedureNoteBase):
noteType: Literal["basic"] = "basic"
class HeartRateNote(ProcedureNoteBase):
noteType: Literal["heart_rate"] = "heart_rate"
bpm: int
class DentalNote(ProcedureNoteBase):
noteType: Literal["dental"] = "dental"
procedureType: Literal["scaling", "polishing"]
teeth: str | None = None
class VaccineNote(ProcedureNoteBase):
noteType: Literal["vaccine"] = "vaccine"
medicine: Literal["Rabies", "DHPP", "Tricat", "Deworming"]
leg: Literal["front_left", "front_right", "hind_left", "hind_right"]
class PreOpNote(ProcedureNoteBase):
noteType: Literal["preop"] = "preop"
heartRate: int
temperature: float
class SurgeryNote(ProcedureNoteBase):
noteType: Literal["surgery"] = "surgery"
surgeryType: Literal["neuter", "spay"]
complications: str | None = None
ProcedureNotes = Annotated[
BasicNote | HeartRateNote | DentalNote | VaccineNote | PreOpNote | SurgeryNote,
Field(discriminator="noteType"),
]
class Procedure(BaseModel):
name: str | None = None
description: str | None = None
cost: float | None = None
notes: ProcedureNotes | None = None
class TreatmentBase(BaseModel):
label: str
description: str | None = None
metadata: Metadata | None = None
class TreatmentCreate(TreatmentBase):
pass
class Treatment(TreatmentBase):
id: int
class PetBase(BaseModel):
name: str
species: str
age: int | None = None
weight: float | None = None
birthDate: date | None = None
photo: str | None = None
metadata: Metadata | None = None
class PetCreate(PetBase):
parent_ids: list[int] = []
class Pet(PetBase):
id: int
parents: list[Parent] = []
class AppointmentBase(BaseModel):
date: datetime
notes: str | None = None
procedures: list[Procedure] = []
metadata: Metadata | None = None
class AppointmentCreate(AppointmentBase):
pet_id: int
vet_id: int
treatment_id: int
class Appointment(AppointmentBase):
id: int
pet: Pet
vet: Vet
treatment: Treatment