Исправлена отображение полей адреса и стили формы заказа
## Основные изменения: ### 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>
This commit is contained in:
@@ -6,10 +6,11 @@ from django.http import JsonResponse
|
||||
from django.views.decorators.http import require_http_methods
|
||||
from django.contrib.auth.decorators import login_required
|
||||
from django.core.exceptions import ValidationError
|
||||
from .models import Order, OrderItem
|
||||
from .models import Order, OrderItem, Address
|
||||
from .forms import OrderForm, OrderItemFormSet
|
||||
from .filters import OrderFilter
|
||||
from .services import DraftOrderService
|
||||
from .services.address_service import AddressService
|
||||
import json
|
||||
|
||||
|
||||
@@ -67,6 +68,15 @@ def order_create(request):
|
||||
if form.is_valid() and formset.is_valid():
|
||||
order = form.save(commit=False)
|
||||
|
||||
# Обрабатываем адрес доставки
|
||||
if order.is_delivery:
|
||||
address = AddressService.process_address_from_form(order, form.cleaned_data)
|
||||
if address:
|
||||
# Если адрес не существует в БД, сохраняем его
|
||||
if not address.pk:
|
||||
address.save()
|
||||
order.delivery_address = address
|
||||
|
||||
# Если нажата кнопка "Сохранить как черновик", создаем черновик
|
||||
if 'save_as_draft' in request.POST:
|
||||
order.status = 'draft'
|
||||
@@ -125,6 +135,31 @@ def order_update(request, pk):
|
||||
form = OrderForm(instance=order)
|
||||
formset = OrderItemFormSet(instance=order)
|
||||
else:
|
||||
# Обрабатываем адрес доставки
|
||||
if order.is_delivery:
|
||||
address = AddressService.process_address_from_form(order, form.cleaned_data)
|
||||
if address:
|
||||
# Если адрес не существует в БД, сохраняем его
|
||||
if not address.pk:
|
||||
address.save()
|
||||
order.delivery_address = address
|
||||
else:
|
||||
# Если режим "без адреса", удаляем существующий адрес
|
||||
if order.delivery_address:
|
||||
old_address = order.delivery_address
|
||||
order.delivery_address = None
|
||||
# Удаляем старый адрес, если он больше не используется
|
||||
if old_address and not old_address.order:
|
||||
old_address.delete()
|
||||
else:
|
||||
# Если не доставка, удаляем адрес если он был
|
||||
if order.delivery_address:
|
||||
old_address = order.delivery_address
|
||||
order.delivery_address = None
|
||||
# Удаляем старый адрес
|
||||
if old_address and not old_address.order:
|
||||
old_address.delete()
|
||||
|
||||
order.modified_by = request.user
|
||||
order.save()
|
||||
formset.save()
|
||||
@@ -380,6 +415,69 @@ def create_draft_from_form(request):
|
||||
}, status=500)
|
||||
|
||||
|
||||
@require_http_methods(["GET"])
|
||||
@login_required
|
||||
def get_customer_address_history(request):
|
||||
"""
|
||||
AJAX endpoint для получения истории адресов клиента.
|
||||
|
||||
GET параметры:
|
||||
- customer_id: ID клиента
|
||||
|
||||
Возвращает JSON со списком адресов из истории заказов клиента.
|
||||
"""
|
||||
try:
|
||||
customer_id = request.GET.get('customer_id')
|
||||
|
||||
if not customer_id:
|
||||
return JsonResponse({
|
||||
'success': False,
|
||||
'error': 'customer_id не указан'
|
||||
}, status=400)
|
||||
|
||||
from customers.models import Customer
|
||||
|
||||
try:
|
||||
customer = Customer.objects.get(pk=customer_id)
|
||||
except Customer.DoesNotExist:
|
||||
return JsonResponse({
|
||||
'success': False,
|
||||
'error': 'Клиент не найден'
|
||||
}, status=404)
|
||||
|
||||
# Получаем адреса из истории заказов
|
||||
addresses = AddressService.get_customer_address_history(customer)
|
||||
|
||||
# Форматируем для отправки клиенту
|
||||
addresses_data = [
|
||||
{
|
||||
'id': addr.id,
|
||||
'display': AddressService.format_address_for_display(addr),
|
||||
'street': addr.street,
|
||||
'building_number': addr.building_number,
|
||||
'apartment_number': addr.apartment_number,
|
||||
'entrance': addr.entrance,
|
||||
'floor': addr.floor,
|
||||
'intercom_code': addr.intercom_code,
|
||||
'recipient_name': addr.recipient_name,
|
||||
'recipient_phone': addr.recipient_phone,
|
||||
}
|
||||
for addr in addresses
|
||||
]
|
||||
|
||||
return JsonResponse({
|
||||
'success': True,
|
||||
'addresses': addresses_data,
|
||||
'count': len(addresses_data)
|
||||
})
|
||||
|
||||
except Exception as e:
|
||||
return JsonResponse({
|
||||
'success': False,
|
||||
'error': f'Ошибка сервера: {str(e)}'
|
||||
}, status=500)
|
||||
|
||||
|
||||
# === ВРЕМЕННЫЕ КОМПЛЕКТЫ ===
|
||||
# УДАЛЕНО: Логика создания временных комплектов перенесена в products.services.kit_service
|
||||
# Используйте API endpoint: products:api-temporary-kit-create
|
||||
|
||||
Reference in New Issue
Block a user