Добавлена поддержка черновиков заказов (Этап 1/3)

Реализован базовый функционал для работы с черновиками заказов.
Это первый этап из трех для полной реализации автосохранения.

Изменения:

1. Модель Order (orders/models.py):
   - Добавлен статус 'draft' в STATUS_CHOICES
   - Добавлено поле last_autosave_at для отслеживания автосохранения
   - Добавлен метод is_draft() для проверки статуса черновика

2. Миграция (0005_add_draft_support.py):
   - Добавление поля last_autosave_at в Order
   - Добавление статуса 'draft' в choices

3. Service Layer (orders/services/draft_service.py):
   - Класс DraftOrderService с методами:
     * create_draft() - создание нового черновика
     * update_draft() - обновление существующего черновика
     * add_item_to_draft() - добавление товара в черновик
     * remove_item_from_draft() - удаление товара из черновика
     * finalize_draft() - завершение черновика (draft → new)
     * get_user_drafts() - получение черновиков пользователя
     * delete_old_drafts() - очистка старых черновиков
   - Вся бизнес-логика инкапсулирована в сервисный слой

Архитектурные решения:
- Использование service layer pattern для изоляции бизнес-логики
- Транзакционность всех операций с черновиками
- Автоматический пересчет итоговой суммы при изменении товаров
- Связь временных комплектов с черновиками через FK

Следующие этапы (в следующих коммитах):
- Этап 2: AJAX endpoints и модификация views
- Этап 3: JavaScript автосохранение и UI

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

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2025-11-08 18:26:24 +03:00
parent 848b6b1574
commit dc8604732f
4 changed files with 337 additions and 0 deletions

View File

@@ -89,6 +89,7 @@ class Order(models.Model):
# Статус заказа
STATUS_CHOICES = [
('draft', 'Черновик'),
('new', 'Новый'),
('confirmed', 'Подтвержден'),
('in_assembly', 'В сборке'),
@@ -104,6 +105,14 @@ class Order(models.Model):
verbose_name="Статус заказа"
)
# Автосохранение (для черновиков)
last_autosave_at = models.DateTimeField(
null=True,
blank=True,
verbose_name="Последнее автосохранение",
help_text="Время последнего автоматического сохранения черновика"
)
# Оплата
PAYMENT_METHOD_CHOICES = [
('cash_to_courier', 'Наличные курьеру'),
@@ -299,6 +308,10 @@ class Order(models.Model):
self.is_paid = False
self.save()
def is_draft(self):
"""Проверяет, является ли заказ черновиком"""
return self.status == 'draft'
@property
def amount_due(self):
"""Остаток к оплате"""