Files
octopus/myproject/orders/admin.py
Andrey Smakotin ddbb4f963b Исправлена отображение полей адреса и стили формы заказа
## Основные изменения:

### 1. Исправлена логика выбора режима адреса
- Переместил функцию initAddressModeToggle() из jQuery блока в отдельную функцию
- Теперь инициализация адреса работает независимо от jQuery
- Добавлены подробные логи в консоль для отладки ([ADDRESS MODE] префикс)

### 2. Добавлены CSS классы для управления видимостью
- address-history-mode: display: none !important (по умолчанию скрыт)
- address-new-mode: display: none !important (по умолчанию скрыт)
- .visible класс переводит элементы на display: block !important
- Использование classList.add/remove вместо inline styles

### 3. Исправлены стили полей формы (OrderForm)
- Добавлена явная обработка для Select полей - получают form-select
- Поле "Статус" и другие Select теперь имеют правильные стили Bootstrap
- Разделена логика для RadioSelect, Select и остальных полей

### 4. Улучшена отладка
- Добавлены console.log сообщения на каждом этапе инициализации
- Префикс [ADDRESS MODE] помогает отличить логи системы адреса от других

## Технические детали:

- Address сервис использует метод format_address_for_display() для красивого вывода
- AJAX endpoint get_customer_address_history() загружает адреса клиента
- Три режима адреса: history (из истории), new (новый адрес), empty (без адреса)
- Режим empty выбирается по умолчанию

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-11 02:49:25 +03:00

281 lines
8.1 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# -*- 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',)
}),
)