## Что сделано: ### 1. Фильтрация тегов по активности - ProductForm и ProductKitForm показывают только активные теги в селектах - ProductListView, ProductKitListView передают только активные теги в контекст фильтров ### 2. Отображение тегов на страницах товаров/комплектов - product_detail.html отображает только активные теги - productkit_detail.html отображает только активные теги ### 3. Логика отображения в деталях тега - Для активного тега: показываются только активные товары/комплекты - Для неактивного тега: показываются ВСЕ товары/комплекты (для возможности ручной очистки) ### 4. API endpoint для переключения статуса - Новый endpoint toggle_tag_status_api в api_views.py - POST /products/api/tags/<id>/toggle/ - Переключает is_active и возвращает новый статус ### 5. AJAX toggle switch в таблице тегов - Заменены бейджи на toggle switch в tag_list.html - Переключатель в 1.3x больше (масштабирование через CSS) - Мгновенное обновление без перезагрузки страницы - Показывает сообщение об успехе/ошибке ### 6. Связь в БД остаётся неизменной - При деактивации тег остаётся привязан к товарам в БД - Просто скрывается в интерфейсе - При реактивации вновь становится видимым 🤖 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-тесты для каждого модуля
- Создать отдельный модуль для миксинов и базовых классов