from django.contrib import admin from .models import Order, OrderItem class OrderItemInline(admin.TabularInline): model = OrderItem extra = 0 readonly_fields = ('product', 'quantity', 'price', 'get_total_price') fields = ('product', 'quantity', 'price', 'get_total_price') def get_total_price(self, obj): if obj.pk: return f"${obj.price * obj.quantity:.2f}" return "-" get_total_price.short_description = "Total" @admin.register(Order) class OrderAdmin(admin.ModelAdmin): list_display = ('order_number', 'user', 'status', 'payment_status', 'total_amount', 'created_at') list_filter = ('status', 'payment_status', 'created_at', 'updated_at') search_fields = ('order_number', 'user__username', 'user__email', 'user__first_name', 'user__last_name') readonly_fields = ('order_number', 'total_amount', 'created_at', 'updated_at', 'get_items_count') inlines = [OrderItemInline] list_per_page = 25 date_hierarchy = 'created_at' fieldsets = ( ('Order Information', { 'fields': ('order_number', 'user', 'get_items_count', 'total_amount'), 'classes': ('wide',) }), ('Status & Payment', { 'fields': ('status', 'payment_method', 'payment_status'), 'classes': ('wide',) }), ('Shipping Information', { 'fields': ('shipping_address',), 'classes': ('collapse',) }), ('Timestamps', { 'fields': ('created_at', 'updated_at'), 'classes': ('collapse',) }), ) def get_items_count(self, obj): return obj.items.count() get_items_count.short_description = "Number of Items" def get_queryset(self, request): """Optimize queries by prefetching related objects""" return super().get_queryset(request).select_related('user').prefetch_related('items') actions = ['mark_as_confirmed', 'mark_as_shipped', 'mark_as_delivered'] def mark_as_confirmed(self, request, queryset): updated = queryset.update(status='confirmed') self.message_user(request, f'{updated} orders marked as confirmed.') mark_as_confirmed.short_description = "Mark selected orders as confirmed" def mark_as_shipped(self, request, queryset): updated = queryset.update(status='shipped') self.message_user(request, f'{updated} orders marked as shipped.') mark_as_shipped.short_description = "Mark selected orders as shipped" def mark_as_delivered(self, request, queryset): updated = queryset.update(status='delivered') self.message_user(request, f'{updated} orders marked as delivered.') mark_as_delivered.short_description = "Mark selected orders as delivered" # Disable adding new orders - orders should only be created through checkout def has_add_permission(self, request): return False # Optional: Also disable deletion to prevent accidental data loss def has_delete_permission(self, request, obj=None): return False