Рефакторинг моделей заказов и добавление методов оплаты
This commit is contained in:
@@ -1,7 +1,7 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
from django.contrib import admin
|
||||
from django.utils.html import format_html
|
||||
from .models import Order, OrderItem, Payment, Address, OrderStatus
|
||||
from .models import Order, OrderItem, Payment, PaymentMethod, Address, OrderStatus
|
||||
|
||||
|
||||
class PaymentInline(admin.TabularInline):
|
||||
@@ -94,7 +94,6 @@ class OrderAdmin(admin.ModelAdmin):
|
||||
}),
|
||||
('Оплата', {
|
||||
'fields': (
|
||||
'payment_method',
|
||||
'total_amount',
|
||||
'discount_amount',
|
||||
'amount_paid',
|
||||
@@ -376,3 +375,78 @@ class OrderStatusAdmin(admin.ModelAdmin):
|
||||
if obj.is_system or obj.orders_count > 0:
|
||||
return False
|
||||
return super().has_delete_permission(request, obj)
|
||||
|
||||
|
||||
@admin.register(PaymentMethod)
|
||||
class PaymentMethodAdmin(admin.ModelAdmin):
|
||||
"""
|
||||
Админ-панель для управления способами оплаты.
|
||||
"""
|
||||
list_display = [
|
||||
'order_display',
|
||||
'name',
|
||||
'code',
|
||||
'description',
|
||||
'is_active',
|
||||
'is_system',
|
||||
'payments_count',
|
||||
]
|
||||
|
||||
list_filter = [
|
||||
'is_active',
|
||||
'is_system',
|
||||
]
|
||||
|
||||
search_fields = [
|
||||
'name',
|
||||
'code',
|
||||
'description',
|
||||
]
|
||||
|
||||
readonly_fields = ['created_at', 'updated_at', 'created_by']
|
||||
|
||||
fieldsets = (
|
||||
('Основная информация', {
|
||||
'fields': ('code', 'name', 'description', 'order')
|
||||
}),
|
||||
('Настройки', {
|
||||
'fields': ('is_active', 'is_system')
|
||||
}),
|
||||
('Системная информация', {
|
||||
'fields': ('created_at', 'updated_at', 'created_by'),
|
||||
'classes': ('collapse',)
|
||||
}),
|
||||
)
|
||||
|
||||
ordering = ['order', 'name']
|
||||
|
||||
def get_readonly_fields(self, request, obj=None):
|
||||
"""Делаем код readonly для системных способов оплаты"""
|
||||
readonly = list(self.readonly_fields)
|
||||
if obj and obj.is_system:
|
||||
readonly.append('code')
|
||||
return readonly
|
||||
|
||||
def order_display(self, obj):
|
||||
"""Отображение порядкового номера с бейджем"""
|
||||
return format_html(
|
||||
'<span style="display: inline-block; background-color: #6c757d; color: white; padding: 2px 8px; border-radius: 10px; font-size: 11px;">{}</span>',
|
||||
obj.order
|
||||
)
|
||||
order_display.short_description = 'Порядок'
|
||||
|
||||
def payments_count(self, obj):
|
||||
"""Количество платежей этим способом"""
|
||||
count = obj.payments.count()
|
||||
if count == 0:
|
||||
return format_html('<span style="color: #999;">{}</span>', count)
|
||||
return format_html('<span style="font-weight: bold;">{}</span>', count)
|
||||
payments_count.short_description = 'Платежей'
|
||||
|
||||
def has_delete_permission(self, request, obj=None):
|
||||
"""Запрещаем удаление используемых способов оплаты"""
|
||||
if obj:
|
||||
# Разрешаем удаление только если нет связанных платежей
|
||||
if obj.payments.exists():
|
||||
return False
|
||||
return super().has_delete_permission(request, obj)
|
||||
|
||||
Reference in New Issue
Block a user