# -*- coding: utf-8 -*- from django.contrib import admin from .models import Order, OrderItem, Payment, Address class PaymentInline(admin.TabularInline): """ Inline для управления платежами по заказу. """ model = Payment extra = 1 fields = ['amount', 'payment_method', 'payment_date', 'created_by', 'notes'] readonly_fields = ['payment_date'] 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', 'is_delivery', 'delivery_date', 'status', 'total_amount', 'payment_status', 'amount_paid', 'created_at', ] list_filter = [ 'status', 'is_delivery', 'payment_status', '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', 'amount_due', 'payment_status', ] fieldsets = ( ('Основная информация', { 'fields': ('order_number', 'customer', 'status') }), ('Доставка', { 'fields': ( 'is_delivery', 'customer_is_recipient', 'delivery_address', 'pickup_shop', 'delivery_date', 'delivery_time_start', 'delivery_time_end', 'delivery_cost', 'delivery_info', 'delivery_time_window', ) }), ('Оплата', { 'fields': ( 'payment_method', 'total_amount', 'discount_amount', 'amount_paid', 'amount_due', 'payment_status', ) }), ('Дополнительно', { 'fields': ('is_anonymous', 'special_instructions'), 'classes': ('collapse',) }), ('Системная информация', { 'fields': ('created_at', 'updated_at', 'modified_by'), 'classes': ('collapse',) }), ) inlines = [OrderItemInline, PaymentInline] 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(Payment) class PaymentAdmin(admin.ModelAdmin): """ Админ-панель для управления платежами. """ list_display = [ 'order', 'amount', 'payment_method', 'payment_date', 'created_by', ] list_filter = [ 'payment_method', 'payment_date', ] search_fields = [ 'order__order_number', 'notes', ] readonly_fields = ['payment_date'] fieldsets = ( ('Информация о платеже', { 'fields': ('order', 'amount', 'payment_method', 'payment_date') }), ('Дополнительно', { 'fields': ('created_by', 'notes') }), ) @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',) }), ) @admin.register(Address) class AddressAdmin(admin.ModelAdmin): """ Админ-панель для управления адресами доставки заказов. """ list_display = [ 'recipient_name', 'recipient_phone', 'full_address', 'entrance', 'floor', 'confirm_address_with_recipient', 'created_at', ] list_filter = [ 'confirm_address_with_recipient', 'created_at', ] search_fields = [ 'recipient_name', 'street', 'building_number', ] readonly_fields = ['created_at', 'updated_at'] fieldsets = ( ('Информация о получателе', { 'fields': ('recipient_name', 'recipient_phone') }), ('Адрес доставки', { 'fields': ('street', 'building_number', 'apartment_number', 'entrance', 'floor') }), ('Доступ в здание', { 'fields': ('intercom_code',), 'classes': ('collapse',) }), ('Дополнительная информация', { 'fields': ('delivery_instructions', 'confirm_address_with_recipient'), 'classes': ('collapse',) }), ('Даты', { 'fields': ('created_at', 'updated_at'), 'classes': ('collapse',) }), )