1+ from uuid import UUID , uuid4
2+
3+ from sqlmodel import Field , SQLModel , Relationship
4+
5+ from .base import BaseModel
6+
7+
8+ class RouteBase (SQLModel ):
9+ """Shared fields between table and API models"""
10+
11+ route_group_id : UUID | None = Field (
12+ foreign_key = "route_groups.id"
13+ )
14+ name : str = Field (default = "" , min_length = 1 , max_length = 255 ) # can change this later
15+ notes : str = Field (default = "" , max_length = 1000 ) # can change this later
16+ length : float = Field (ge = 0.0 ) # in km, must be non-negative
17+
18+
19+ class Route (RouteBase , BaseModel , table = True ):
20+ """Database table model for Routes
21+
22+ Note: Routes are immutable once created
23+ """
24+
25+ __tablename__ = "routes"
26+
27+ route_id : UUID = Field (
28+ default = uuid4 ,
29+ primary_key = True ,
30+ nullable = False
31+ )
32+
33+ # Relationship to route stops
34+ route_stops : list ["RouteStop" ] = Relationship (
35+ back_populates = "route" ,
36+ sa_relationship_kwargs = {"cascade" : "all, delete-orphan" }
37+ )
38+
39+
40+ class RouteCreate (RouteBase ):
41+ """Create request model"""
42+
43+ pass
44+
45+
46+ class RouteRead (RouteBase ):
47+ """Read response model"""
48+
49+ route_id : UUID
50+
51+
52+ class RouteUpdate (SQLModel ):
53+ """Update request model - all optional
54+
55+ Note: Routes are meant to be immutable, but this allows updates if needed
56+ """
57+
58+ route_group_id : UUID | None = None
59+ name : str | None = None
60+ notes : str | None = None
61+ length : float | None = None
0 commit comments