generated from westfarn/web_django_template
CI / test (pull_request) Successful in 35s
Shoppers can register, save shipping details, and view order history while cards stay on Stripe. EasyPost tracker updates (including numbers from Pirate Ship) and 1–5 star reviews are limited to buyers. The contact form now only asks for email and a message.
58 lines
2.2 KiB
Python
58 lines
2.2 KiB
Python
from django.db import models
|
|
|
|
from core.models import TimeStampedModel, UUIDPrimaryKeyModel
|
|
from shop.models import Order
|
|
|
|
|
|
class Shipment(UUIDPrimaryKeyModel, TimeStampedModel):
|
|
class Status(models.TextChoices):
|
|
DRAFT = "draft", "Draft"
|
|
RATED = "rated", "Rated"
|
|
LABELED = "labeled", "Labeled"
|
|
VOID = "void", "Void"
|
|
|
|
class TrackingStatus(models.TextChoices):
|
|
UNKNOWN = "unknown", "Unknown"
|
|
PRE_TRANSIT = "pre_transit", "Pre-transit"
|
|
IN_TRANSIT = "in_transit", "In transit"
|
|
OUT_FOR_DELIVERY = "out_for_delivery", "Out for delivery"
|
|
DELIVERED = "delivered", "Delivered"
|
|
AVAILABLE_FOR_PICKUP = "available_for_pickup", "Available for pickup"
|
|
RETURN_TO_SENDER = "return_to_sender", "Return to sender"
|
|
FAILURE = "failure", "Exception"
|
|
CANCELLED = "cancelled", "Cancelled"
|
|
ERROR = "error", "Error"
|
|
|
|
order = models.ForeignKey(Order, on_delete=models.PROTECT, related_name="shipments")
|
|
status = models.CharField(
|
|
max_length=16, choices=Status.choices, default=Status.DRAFT
|
|
)
|
|
carrier = models.CharField(max_length=32, blank=True)
|
|
service = models.CharField(max_length=64, blank=True)
|
|
tracking_number = models.CharField(max_length=64, blank=True)
|
|
tracking_status = models.CharField(
|
|
max_length=32,
|
|
choices=TrackingStatus.choices,
|
|
default=TrackingStatus.UNKNOWN,
|
|
blank=True,
|
|
)
|
|
tracking_url = models.URLField(blank=True)
|
|
tracker_id = models.CharField(max_length=255, blank=True)
|
|
tracking_events = models.JSONField(default=list, blank=True)
|
|
last_tracked_at = models.DateTimeField(null=True, blank=True)
|
|
label_url = models.URLField(blank=True)
|
|
rate_amount = models.DecimalField(
|
|
max_digits=10, decimal_places=2, null=True, blank=True
|
|
)
|
|
currency = models.CharField(max_length=8, default="usd")
|
|
provider_shipment_id = models.CharField(max_length=255, blank=True)
|
|
rates = models.JSONField(default=list, blank=True)
|
|
weight_oz = models.PositiveIntegerField(default=16)
|
|
notes = models.TextField(blank=True)
|
|
|
|
class Meta:
|
|
ordering = ["-created_at"]
|
|
|
|
def __str__(self) -> str:
|
|
return f"{self.order.number} · {self.tracking_number or self.status}"
|