130 lines
3.6 KiB
Python
130 lines
3.6 KiB
Python
|
|
from __future__ import annotations
|
|
|
|
from datetime import datetime
|
|
from typing import Any
|
|
|
|
from pydantic import BaseModel, Field
|
|
|
|
|
|
class CaseCreate(BaseModel):
|
|
age: int | None = None
|
|
gender: str | None = None
|
|
health_flags: list[str] = Field(default_factory=list)
|
|
elapsed_hours: int | None = None
|
|
last_known_place: str | None = None
|
|
direction: str | None = None
|
|
terrain_primary: str | None = None
|
|
weather: str | None = None
|
|
resources: list[str] = Field(default_factory=list)
|
|
gps: dict[str, float] | None = None
|
|
notes: str | None = None
|
|
note: str | None = None
|
|
status: str = 'new'
|
|
found_alive: bool | None = None
|
|
found_distance_km: float | None = None
|
|
found_direction: str | None = None
|
|
found_location_type: str | None = None
|
|
found_lat: float | None = None
|
|
found_lon: float | None = None
|
|
who_found: str | None = None
|
|
mobile: bool = False
|
|
|
|
|
|
class CaseUpdate(BaseModel):
|
|
age: int | None = None
|
|
gender: str | None = None
|
|
health_flags: list[str] | None = None
|
|
elapsed_hours: int | None = None
|
|
last_known_place: str | None = None
|
|
direction: str | None = None
|
|
terrain_primary: str | None = None
|
|
weather: str | None = None
|
|
resources: list[str] | None = None
|
|
gps_lat: float | None = None
|
|
gps_lon: float | None = None
|
|
notes: str | None = None
|
|
note: str | None = None
|
|
status: str | None = None
|
|
found_alive: bool | None = None
|
|
found_distance_km: float | None = None
|
|
found_direction: str | None = None
|
|
found_location_type: str | None = None
|
|
found_lat: float | None = None
|
|
found_lon: float | None = None
|
|
who_found: str | None = None
|
|
raw_text: str | None = None
|
|
analysis_log: str | None = None
|
|
|
|
|
|
class CaseResponse(BaseModel):
|
|
id: str
|
|
created_at: datetime
|
|
updated_at: datetime
|
|
age: int | None = None
|
|
gender: str | None = None
|
|
health_flags: list[str]
|
|
elapsed_hours: int | None = None
|
|
last_known_place: str | None = None
|
|
direction: str | None = None
|
|
terrain_primary: str | None = None
|
|
weather: str | None = None
|
|
resources: list[str]
|
|
gps_lat: float | None = None
|
|
gps_lon: float | None = None
|
|
notes: str | None = None
|
|
status: str
|
|
found_alive: bool | None = None
|
|
found_distance_km: float | None = None
|
|
found_direction: str | None = None
|
|
found_location_type: str | None = None
|
|
found_lat: float | None = None
|
|
found_lon: float | None = None
|
|
who_found: str | None = None
|
|
raw_text: str | None = None
|
|
analysis_log: str | None = None
|
|
result: dict[str, Any] | None = None
|
|
|
|
|
|
class CaseListResponse(BaseModel):
|
|
items: list[CaseResponse]
|
|
total: int
|
|
page: int
|
|
page_size: int
|
|
|
|
|
|
class DashboardResponse(BaseModel):
|
|
total_cases: int
|
|
found_alive_count: int
|
|
found_deceased_count: int
|
|
unknown_outcome_count: int
|
|
median_found_distance_km: float | None
|
|
recent_activity_count: int
|
|
|
|
|
|
class RecommendationRequest(BaseModel):
|
|
age: int | None = None
|
|
gender: str | None = None
|
|
health_flags: list[str] = Field(default_factory=list)
|
|
elapsed_hours: int | None = None
|
|
terrain_primary: str | None = None
|
|
weather: str | None = None
|
|
resources: list[str] = Field(default_factory=list)
|
|
|
|
|
|
class AnalyzeResponse(BaseModel):
|
|
urgency: str
|
|
primary_zones: list[dict[str, Any]]
|
|
immediate_actions: list[str]
|
|
behavioral_prediction: str
|
|
psychotype_recommendations: dict[str, Any]
|
|
key_locations: list[str]
|
|
case_id: str
|
|
|
|
|
|
class ParseDocResponse(BaseModel):
|
|
filename: str
|
|
parsed: bool
|
|
preview: dict[str, Any]
|
|
raw_text: str | None = None
|