File size: 1,956 Bytes
fcf8749 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 | """
Package database model.
Represents delivery packages with location and priority info.
"""
import enum
import uuid
from datetime import datetime
from typing import Optional, List, TYPE_CHECKING
from sqlalchemy import String, Float, Integer, Text, DateTime, Enum
from sqlalchemy.orm import Mapped, mapped_column, relationship
from app.database import Base, GUID
if TYPE_CHECKING:
from app.models.route import RoutePackage
class PackagePriority(str, enum.Enum):
"""Priority levels for package delivery."""
NORMAL = "NORMAL"
HIGH = "HIGH"
EXPRESS = "EXPRESS"
class Package(Base):
"""
Package model representing items to be delivered.
Contains weight, fragility, location, and priority information.
"""
__tablename__ = "packages"
id: Mapped[uuid.UUID] = mapped_column(
GUID(),
primary_key=True,
default=uuid.uuid4,
)
external_id: Mapped[str] = mapped_column(
String(100),
unique=True,
nullable=False,
index=True,
)
weight_kg: Mapped[float] = mapped_column(Float, nullable=False, default=1.0)
fragility_level: Mapped[int] = mapped_column(Integer, nullable=False, default=1) # 1-5
address: Mapped[str] = mapped_column(Text, nullable=False)
latitude: Mapped[float] = mapped_column(Float, nullable=False)
longitude: Mapped[float] = mapped_column(Float, nullable=False)
priority: Mapped[PackagePriority] = mapped_column(
Enum(PackagePriority),
default=PackagePriority.NORMAL,
)
created_at: Mapped[datetime] = mapped_column(
DateTime,
default=datetime.utcnow,
)
# Relationships
route_packages: Mapped[List["RoutePackage"]] = relationship(
"RoutePackage",
back_populates="package",
cascade="all, delete-orphan",
)
def __repr__(self) -> str:
return f"<Package(id={self.id}, external_id={self.external_id})>"
|