Template
## Summary - Closes #9. Port shop-gated buyer accounts (register/login/profile, password reset, order history), purchase-gated reviews, and Stripe customer ids. Cards stay on Stripe. - Slim public contact form to email + interest + message. Shipping tracking status, scan events, paste-in numbers, and EasyPost webhook when FEATURE_SHIPPING is on. - Add template-neutral `seed_demo` (generic SKUs, demo shoppers, guest orders, tracking stubs). Prod refused. `--reset` deletes tagged demo rows after invoices. ## Test plan - [ ] `cd site && uv run python manage.py test` (173 tests passed locally) - [ ] Shop on: `/account/register`, login, profile, password reset, claim guest orders by email - [ ] Shop off: `/account/` URLs absent; Sign in / Account links hidden - [ ] Checkout as logged-in buyer stores `Order.user` and Stripe customer id; product review only after paid purchase - [ ] Shipping on: portal paste-in tracking + EasyPost webhook updates status; shipping off: orders still work without tracking UI - [ ] `seed_demo` refused in prod; `--reset` rebuilds tagged catalog/shoppers without deleting staff invoices Reviewed-on: #10
40 lines
941 B
Python
40 lines
941 B
Python
from core.registry import (
|
|
register_dashboard_collector,
|
|
register_dispatcher,
|
|
register_feature,
|
|
register_portal_nav,
|
|
)
|
|
|
|
|
|
def register() -> None:
|
|
register_feature("shipping")
|
|
register_portal_nav(
|
|
section="shipping",
|
|
label="Shipping",
|
|
url_name="shipping:shipment_list",
|
|
group="Retail",
|
|
order=50,
|
|
)
|
|
register_dashboard_collector(_dashboard)
|
|
register_dispatcher(_sync_tracking)
|
|
|
|
|
|
def _dashboard(request) -> dict:
|
|
from shipping.models import Shipment
|
|
from shop.models import Order
|
|
|
|
labeled = Shipment.objects.filter(status=Shipment.Status.LABELED).values_list(
|
|
"order_id", flat=True
|
|
)
|
|
return {
|
|
"unshipped_orders": Order.objects.filter(status=Order.Status.PAID)
|
|
.exclude(pk__in=labeled)
|
|
.count()
|
|
}
|
|
|
|
|
|
def _sync_tracking() -> int:
|
|
from shipping.services import sync_open_tracking
|
|
|
|
return sync_open_tracking()
|