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})>"