Реализована трёхуровневая система статусов товаров и комплектов: - active (Активный) - товар доступен для продажи - archived (Архивный) - скрыт, можно восстановить в следующем сезоне - discontinued (Снят) - морально устарел, готов к удалению Изменения: 1. Модели (BaseProductEntity, Product, ProductKit): - Заменено поле is_deleted (Boolean) на status (CharField) - Добавлены архивные метаданные (archived_at, archived_by) - Обновлены методы: archive(), restore(), discontinue(), delete() - Уникальное ограничение изменено на conditional (status='active') 2. Менеджеры (ActiveManager, SoftDeleteQuerySet): - Полиморфная поддержка обеих систем (status и is_active) - Использует hasattr() для совместимости с наследниками - Методы: archive(), restore(), discontinue(), archived_only(), active_only() 3. Формы (ProductForm, ProductKitForm): - Включены поле status в формы - Валидация уникальности по status='active' - CSS классы для статус-селектора 4. Admin панель: - DeletedFilter переименован в StatusFilter с тремя опциями - get_status_display() с цветным отображением статуса - Actions: restore_items, hard_delete_selected, delete_selected - Readonly поля для архивирования 5. Представления: - ProductListView: фильтр status вместо is_active - CombinedProductListView: поддержка фильтра status для товаров и комплектов - API views обновлены для работы со статусом 6. Шаблоны: - product_form.html: form.status вместо form.is_active - productkit_create.html: form.status вместо form.is_active - productkit_edit.html: form.status вместо form.is_active 7. Миграции: - Удалены все старые миграции (чистый перезапуск по требованию пользователя) - Создана новая миграция 0001_initial с полной структурой status-системы - Удален старый код преобразования is_deleted -> status Проведённые проверки: - Django system check passed ✓ - Полиморфные менеджеры работают с обеими системами - Уникальные ограничения корректно работают с условиями - История заказов сохраняется даже после архивирования товара (django-simple-history) 🤖 Generated with Claude Code Co-Authored-By: Claude <noreply@anthropic.com>
Структура модуля views
Файл products/views.py был разбит на несколько специализированных модулей для улучшения читаемости и поддерживаемости кода.
Статистика оптимизации
До рефакторинга:
- Файлов: 1 (
views.py) - Строк кода: 1202
- Дублированный код: ~400 строк (12 функций управления фото + 3 функции обработки фото)
После рефакторинга:
- Файлов: 7 модулей
- Строк кода: 1284 (включая документацию)
- Дублированный код: УСТРАНЁН
- Экономия: ~400 строк дублированного кода заменены на универсальные функции
Структура модулей
1. __init__.py (112 строк)
Экспортирует все представления для обратной совместимости с urls.py.
Позволяет использовать импорты вида: from products.views import ProductListView
2. utils.py (73 строки)
Утилиты для работы с фотографиями:
validate_photo()- валидация загружаемого фотоhandle_photos()- УНИВЕРСАЛЬНАЯ функция обработки фото (заменяет 3 дублирующиеся функции)
3. photo_management.py (310 строк)
Универсальные функции управления фотографиями:
- 4 базовые функции:
generic_photo_delete(),generic_photo_set_main(),generic_photo_move_up(),generic_photo_move_down() - 12 оберток для Product, ProductKit и Category (заменяют 12 дублирующихся функций из оригинала)
Устранённое дублирование:
- Было: 12 отдельных функций (по 4 для каждой модели)
- Стало: 4 универсальные функции + 12 простых оберток
4. product_views.py (182 строки)
CRUD представления для товаров (Product):
ProductListView- список товаров с фильтрацией и поискомProductCreateView- создание товараProductDetailView- просмотр товараProductUpdateView- редактирование товараProductDeleteView- удаление товара
5. productkit_views.py (249 строк)
CRUD представления для комплектов (ProductKit):
ProductKitListView- список комплектовProductKitCreateView- создание комплекта с компонентамиProductKitDetailView- просмотр комплектаProductKitUpdateView- редактирование комплектаProductKitDeleteView- удаление комплекта
6. category_views.py (280 строк)
CRUD представления для категорий (ProductCategory):
TreeItem- класс для элемента дерева категорийProductCategoryListView- иерархическое дерево категорий с товарами и комплектамиProductCategoryCreateView- создание категорииProductCategoryDetailView- просмотр категорииProductCategoryUpdateView- редактирование категорииProductCategoryDeleteView- удаление категории
7. api_views.py (78 строк)
API представления:
search_products_and_variants()- поиск товаров и групп вариантов для автокомплита
Преимущества новой структуры
✅ Устранено дублирование
- 12 функций управления фото → 4 универсальные + 12 простых оберток
- 3 функции обработки фото → 1 универсальная функция
✅ Улучшена организация
- Логическое разделение по функциональным областям
- Каждый модуль отвечает за свою сущность (Product, ProductKit, Category)
- Легко найти нужный код
✅ Упрощена поддержка
- Изменения в одном типе представлений не затрагивают другие
- Проще тестировать отдельные компоненты
- Легче добавлять новый функционал
✅ Обратная совместимость
- Все импорты в
urls.pyработают без изменений - Благодаря
__init__.pyвнешний API не изменился
✅ Следование принципам
- SRP (Single Responsibility Principle) - каждый модуль отвечает за одну область
- DRY (Don't Repeat Yourself) - устранено дублирование кода
- Separation of Concerns - разделение по ответственности
Примеры использования
Импорт представлений (работает как раньше):
from products.views import ProductListView, ProductCreateView
from products.views import productkit_photo_delete
from products.views import search_products_and_variants
Импорт из конкретного модуля (новая возможность):
from products.views.product_views import ProductListView
from products.views.photo_management import generic_photo_delete
from products.views.utils import validate_photo
Изменения в коде
Удалено:
- Неиспользуемый импорт
import json - Комментарий-мусор "Временный файл для добавления в views.py"
Добавлено:
- Docstrings для всех модулей
- Комментарии к универсальным функциям
- Документация параметров функций
Тестирование
После рефакторинга рекомендуется:
- Запустить Django сервер:
python manage.py runserver - Проверить все CRUD операции для Product, ProductKit и Category
- Проверить управление фотографиями (upload, delete, set main, move up/down)
- Проверить API endpoint для поиска товаров
Потенциальные улучшения
В будущем можно:
- Добавить базовый класс
BasePhotoViewдля дальнейшего упрощения - Вынести общую логику ListView в миксины
- Добавить unit-тесты для каждого модуля
- Создать отдельный модуль для миксинов и базовых классов