from __future__ import annotations
from django.contrib import admin
from django.db.models import QuerySet
from django.http import HttpRequest
from django.utils.translation import gettext_lazy as _
from salesman.conf import app_settings
from salesman.core.utils import get_salesman_model
from salesman.orders.models import BaseOrder, BaseOrderItem, BaseOrderPayment
from .filters import OrderIsPaidFilter, OrderStatusFilter
from .forms import OrderModelForm, OrderNoteModelForm, OrderPaymentModelForm
from .mixins import OrderAdminMixin, OrderAdminRefundMixin, OrderItemAdminMixin
Order = get_salesman_model("Order")
OrderItem = get_salesman_model("OrderItem")
OrderPayment = get_salesman_model("OrderPayment")
OrderNote = get_salesman_model("OrderNote")
[docs]class OrderItemInline(OrderItemAdminMixin, admin.TabularInline):
model = OrderItem
fields = [
"name",
"code",
"unit_price_display",
"quantity",
"subtotal_display",
"extra_rows_display",
"total_display",
"extra_display",
]
readonly_fields = fields
[docs] def get_queryset(self, request: HttpRequest) -> QuerySet[BaseOrderItem]:
self.model.request = request
return super().get_queryset(request)
[docs] def has_add_permission(
self,
request: HttpRequest,
obj: BaseOrderItem | None = None,
) -> bool:
return False
[docs] def has_delete_permission(
self,
request: HttpRequest,
obj: BaseOrderItem | None = None,
) -> bool:
return False
[docs]class OrderPaymentInline(admin.TabularInline):
model = OrderPayment
form = OrderPaymentModelForm
fields = ["amount", "transaction_id", "payment_method", "date_created"]
readonly_fields = ["date_created"]
extra = 0
[docs] def get_queryset(self, request: HttpRequest) -> QuerySet[BaseOrderPayment]:
self.model.request = request
return super().get_queryset(request)
[docs]class OrderNoteInline(admin.TabularInline):
model = OrderNote
form = OrderNoteModelForm
fields = ["message", "public", "date_created"]
readonly_fields = ["date_created"]
extra = 0
[docs]class BaseOrderAdmin(OrderAdminMixin, admin.ModelAdmin):
form = OrderModelForm
change_form_template = "salesman/admin/change_form.html"
date_hierarchy = "date_created"
list_display = [
"__str__",
"email",
"status_display",
"total_display",
"is_paid_display",
"date_created",
]
list_filter = [OrderStatusFilter, OrderIsPaidFilter, "date_created", "date_updated"]
search_fields = ["ref", "email", "token"]
readonly_fields = [
"user",
"ref",
"token",
"status_display",
"is_paid_display",
"date_created",
"date_updated",
"customer_display",
"email",
"shipping_address_display",
"billing_address_display",
"subtotal_display",
"total_display",
"amount_paid_display",
"amount_outstanding_display",
"extra_display",
"extra_rows_display",
]
fieldsets = [
(_("Info"), {"fields": ["ref", "token"]}),
(
_("Status"),
{"fields": ["status", "date_created", "date_updated", "is_paid_display"]},
),
(
_("Contact"),
{
"fields": [
"customer_display",
"email",
"shipping_address_display",
"billing_address_display",
]
},
),
(
_("Totals"),
{
"fields": [
"subtotal_display",
"extra_rows_display",
"total_display",
"amount_paid_display",
"amount_outstanding_display",
]
},
),
(_("Extra"), {"fields": ["extra_display"]}),
]
inlines = [OrderItemInline, OrderPaymentInline, OrderNoteInline]
[docs] def get_queryset(self, request: HttpRequest) -> QuerySet[BaseOrder]:
self.model.request = request
return super().get_queryset(request)
[docs] def has_add_permission(
self,
request: HttpRequest,
obj: BaseOrder | None = None,
) -> bool:
return False
[docs] def has_delete_permission(
self,
request: HttpRequest,
obj: BaseOrder | None = None,
) -> bool:
return False
[docs]class OrderAdmin(OrderAdminRefundMixin, BaseOrderAdmin):
"""
Default Order admin with refund functionality.
"""
if app_settings.SALESMAN_ADMIN_REGISTER:
admin.site.register(Order, OrderAdmin)