# -*- coding: utf-8 -*- from django.contrib import admin from .models import Order, OrderItem class OrderItemInline(admin.TabularInline): """ Inline для управления позициями заказа прямо в форме заказа. """ model = OrderItem extra = 1 fields = ['product', 'product_kit', 'quantity', 'price'] readonly_fields = [] def get_readonly_fields(self, request, obj=None): """Делаем цену readonly для существующих позиций""" if obj and obj.pk: return ['price'] return [] @admin.register(Order) class OrderAdmin(admin.ModelAdmin): """ Админ-панель для управления заказами. """ list_display = [ 'order_number', 'customer', 'delivery_type', 'delivery_date', 'status', 'total_amount', 'is_paid', 'created_at', ] list_filter = [ 'status', 'delivery_type', 'is_paid', 'delivery_date', 'created_at', ] search_fields = [ 'order_number', 'customer__name', 'customer__phone', 'customer__email', 'delivery_address__recipient_name', 'delivery_address__street', ] readonly_fields = [ 'order_number', 'created_at', 'updated_at', 'delivery_info', 'delivery_time_window', ] fieldsets = ( ('Основная информация', { 'fields': ('order_number', 'customer', 'status') }), ('Доставка', { 'fields': ( 'delivery_type', 'delivery_address', 'pickup_shop', 'delivery_date', 'delivery_time_start', 'delivery_time_end', 'delivery_cost', 'delivery_info', 'delivery_time_window', ) }), ('Оплата', { 'fields': ('payment_method', 'is_paid', 'total_amount') }), ('Дополнительно', { 'fields': ('is_anonymous', 'special_instructions'), 'classes': ('collapse',) }), ('Системная информация', { 'fields': ('created_at', 'updated_at'), 'classes': ('collapse',) }), ) inlines = [OrderItemInline] actions = [ 'mark_as_confirmed', 'mark_as_in_assembly', 'mark_as_in_delivery', 'mark_as_delivered', 'mark_as_paid', ] def mark_as_confirmed(self, request, queryset): """Отметить заказы как подтвержденные""" updated = queryset.update(status='confirmed') self.message_user(request, f'{updated} заказ(ов) отмечено как подтвержденные') mark_as_confirmed.short_description = 'Отметить как подтвержденные' def mark_as_in_assembly(self, request, queryset): """Отметить заказы как в сборке""" updated = queryset.update(status='in_assembly') self.message_user(request, f'{updated} заказ(ов) отмечено как в сборке') mark_as_in_assembly.short_description = 'Отметить как в сборке' def mark_as_in_delivery(self, request, queryset): """Отметить заказы как в доставке""" updated = queryset.update(status='in_delivery') self.message_user(request, f'{updated} заказ(ов) отмечено как в доставке') mark_as_in_delivery.short_description = 'Отметить как в доставке' def mark_as_delivered(self, request, queryset): """Отметить заказы как доставленные""" updated = queryset.update(status='delivered') self.message_user(request, f'{updated} заказ(ов) отмечено как доставленные') mark_as_delivered.short_description = 'Отметить как доставленные' def mark_as_paid(self, request, queryset): """Отметить заказы как оплаченные""" updated = queryset.update(is_paid=True) self.message_user(request, f'{updated} заказ(ов) отмечено как оплаченные') mark_as_paid.short_description = 'Отметить как оплаченные' @admin.register(OrderItem) class OrderItemAdmin(admin.ModelAdmin): """ Админ-панель для управления позициями заказов. """ list_display = [ 'order', 'item_name', 'quantity', 'price', 'get_total_price', ] list_filter = [ 'order__status', 'order__created_at', ] search_fields = [ 'order__order_number', 'product__name', 'product_kit__name', ] readonly_fields = ['created_at', 'get_total_price'] fieldsets = ( ('Заказ', { 'fields': ('order',) }), ('Товар/Комплект', { 'fields': ('product', 'product_kit') }), ('Информация', { 'fields': ('quantity', 'price', 'get_total_price') }), ('Системная информация', { 'fields': ('created_at',), 'classes': ('collapse',) }), )