generated from westfarn/web_django_template
## Summary - Slim the public contact form to email, interest, and message. Name, phone, and address live on the customer profile instead. - Customers can register, sign in, save shipping details, and view order history. Logged-in checkout creates a Stripe Customer and saves cards on Stripe (`setup_future_usage`); we only store `stripe_customer_id`. - Shipment tracking: EasyPost tracker lookup + webhook, plus paste-in numbers from Pirate Ship/Shippo. Customers see carrier status on their orders; `dispatch_due` refreshes open shipments. - Product reviews (1–5) only after a paid/fulfilled purchase of that product. Fixes #7 ## Test plan - [ ] Contact form submits with only email + message; extra name/phone/address fields are ignored - [ ] Register, sign in, save profile (name/phone/shipping) - [ ] Guest checkout still works; after signup, prior orders with that email show in history - [ ] Logged-in checkout prefills shipping and does not collect card data locally - [ ] Portal: buy label or paste a Pirate Ship tracking number, confirm status/events; customer order page shows tracking - [ ] Product page: non-buyers cannot review; buyers can leave one 1–5 star review - [ ] Non-staff users hitting `/portal/` redirect to `/account/` Reviewed-on: #8
53 lines
1.3 KiB
Python
53 lines
1.3 KiB
Python
from django.contrib import admin
|
|
|
|
from shop.models import (
|
|
Order,
|
|
OrderItem,
|
|
Product,
|
|
ProductColor,
|
|
ProductImage,
|
|
ProductReview,
|
|
)
|
|
|
|
|
|
class ProductColorInline(admin.TabularInline):
|
|
model = ProductColor
|
|
extra = 0
|
|
|
|
|
|
class ProductImageInline(admin.TabularInline):
|
|
model = ProductImage
|
|
extra = 0
|
|
|
|
|
|
@admin.register(Product)
|
|
class ProductAdmin(admin.ModelAdmin):
|
|
list_display = ("name", "sku", "price", "stock_qty", "fulfillment", "is_published")
|
|
list_filter = ("fulfillment", "is_published")
|
|
search_fields = ("name", "sku")
|
|
prepopulated_fields = {"slug": ("name",)}
|
|
inlines = [ProductColorInline, ProductImageInline]
|
|
|
|
|
|
@admin.register(ProductReview)
|
|
class ProductReviewAdmin(admin.ModelAdmin):
|
|
list_display = ("product", "user", "rating", "created_at")
|
|
list_filter = ("rating",)
|
|
search_fields = ("product__name", "user__email", "title")
|
|
|
|
|
|
class OrderItemInline(admin.TabularInline):
|
|
model = OrderItem
|
|
extra = 0
|
|
fields = ("name", "sku", "color_name", "quantity", "unit_price")
|
|
readonly_fields = ("color_name",)
|
|
|
|
|
|
@admin.register(Order)
|
|
class OrderAdmin(admin.ModelAdmin):
|
|
list_display = ("number", "email", "amount", "status", "created_at")
|
|
list_filter = ("status",)
|
|
search_fields = ("number", "email", "customer_name")
|
|
raw_id_fields = ("user",)
|
|
inlines = [OrderItemInline]
|