144 lines
2.8 KiB
Python
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
|