Улучшения в моделях заказов и комплектов
## Изменения: ### 1. ProductKit - расчет цены для вариантов товаров - Добавлена обработка variant_group в методах расчета base_price - Теперь учитываются варианты товаров при расчете стоимости комплекта ### 2. DraftOrderService - упрощение логики автосохранения - Удалена проверка is_draft() при обновлении (позволяет обновлять заказы в других статусах) - Улучшена документация метода update_draft ### 3. Шаблоны и скрипты - Обновлены шаблоны форм создания/редактирования комплектов - Обновлены скрипты автосохранения 🤖 Generated with Claude Code Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -64,7 +64,7 @@ class DraftOrderService:
|
||||
@staticmethod
|
||||
def update_draft(order_id, user, data):
|
||||
"""
|
||||
Обновляет существующий черновик заказа.
|
||||
Обновляет существующий заказ (автосохранение).
|
||||
|
||||
Args:
|
||||
order_id (int): ID заказа
|
||||
@@ -76,14 +76,11 @@ class DraftOrderService:
|
||||
|
||||
Raises:
|
||||
Order.DoesNotExist: Если заказ не найден
|
||||
ValidationError: Если заказ не является черновиком или данные невалидны
|
||||
ValidationError: Если данные невалидны
|
||||
"""
|
||||
with transaction.atomic():
|
||||
order = Order.objects.select_for_update().get(pk=order_id)
|
||||
|
||||
if not order.is_draft():
|
||||
raise ValidationError("Можно обновлять только черновики заказов")
|
||||
|
||||
# Обновляем только переданные поля
|
||||
# ForeignKey поля требуют специальной обработки
|
||||
fk_fields = {
|
||||
|
||||
@@ -18,7 +18,6 @@
|
||||
// Состояние модуля
|
||||
let autosaveTimer = null;
|
||||
let isAutosaving = false;
|
||||
let isDraft = false;
|
||||
let orderId = null;
|
||||
|
||||
/**
|
||||
@@ -43,12 +42,6 @@
|
||||
}
|
||||
orderId = urlMatch[1];
|
||||
|
||||
// Проверяем, является ли заказ черновиком
|
||||
isDraft = checkIfDraft();
|
||||
if (!isDraft) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Инициализируем UI индикатора
|
||||
initStatusIndicator();
|
||||
|
||||
@@ -56,25 +49,6 @@
|
||||
attachEventListeners();
|
||||
}
|
||||
|
||||
/**
|
||||
* Проверяет, является ли заказ черновиком
|
||||
*/
|
||||
function checkIfDraft() {
|
||||
// Проверяем через data-атрибут на форме
|
||||
const form = document.getElementById('order-form');
|
||||
if (form && form.dataset.isDraft === 'true') {
|
||||
return true;
|
||||
}
|
||||
|
||||
// Проверяем через заголовок страницы
|
||||
const title = document.querySelector('h1');
|
||||
if (title && title.textContent.includes('черновик')) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Создает индикатор статуса автосохранения
|
||||
*/
|
||||
|
||||
@@ -102,15 +102,6 @@
|
||||
<div class="col">
|
||||
<h1>{{ title }}</h1>
|
||||
</div>
|
||||
<div class="col-auto me-3 d-flex align-items-end gap-2">
|
||||
<label for="{{ form.status.id_for_label }}" class="form-label mb-0" style="white-space: nowrap;">Статус:</label>
|
||||
<div style="min-width: 200px;">
|
||||
{{ form.status }}
|
||||
{% if form.status.errors %}
|
||||
<div class="text-danger small">{{ form.status.errors }}</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-auto">
|
||||
<a href="{% url 'orders:order-list' %}" class="btn btn-secondary">
|
||||
<i class="bi bi-arrow-left"></i> Назад к списку
|
||||
@@ -139,6 +130,17 @@
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<div class="mb-3">
|
||||
<label for="{{ form.status.id_for_label }}" class="form-label">
|
||||
Статус <span class="text-danger">*</span>
|
||||
</label>
|
||||
{{ form.status }}
|
||||
{% if form.status.errors %}
|
||||
<div class="text-danger">{{ form.status.errors }}</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -1674,12 +1676,12 @@ if (!document.getElementById('notification-styles')) {
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Скрипты автосохранения -->
|
||||
{% if is_draft %}
|
||||
<!-- Автосохранение для черновиков -->
|
||||
<!-- Скрипты автосохранения и создания черновиков -->
|
||||
{% if order %}
|
||||
<!-- Автосохранение при редактировании заказа -->
|
||||
<script src="{% static 'orders/js/autosave.js' %}"></script>
|
||||
{% else %}
|
||||
<!-- Автосоздание черновика при создании заказа -->
|
||||
<!-- Автосоздание черновика при создании нового заказа -->
|
||||
<script src="{% static 'orders/js/draft-creator.js' %}"></script>
|
||||
{% endif %}
|
||||
{% endblock %}
|
||||
|
||||
@@ -252,13 +252,6 @@ def autosave_draft_order(request, pk):
|
||||
'error': 'Заказ не найден'
|
||||
}, status=404)
|
||||
|
||||
# Проверяем, что это черновик
|
||||
if not order.is_draft():
|
||||
return JsonResponse({
|
||||
'success': False,
|
||||
'error': 'Можно автосохранять только черновики'
|
||||
}, status=400)
|
||||
|
||||
# Используем DraftOrderService для обновления
|
||||
order = DraftOrderService.update_draft(
|
||||
order_id=pk,
|
||||
|
||||
Reference in New Issue
Block a user