Fixed:
- Replace is_active with status='active' for Product filtering in IncomingModelForm
- Product model uses status field instead of is_active
Added:
- Showcase field to ProductKit for tracking showcase placement
- product_kit field to Reservation for tracking kit-specific reservations
- Disassemble button in POS terminal for showcase kits
- API endpoint for kit disassembly (release reservations, mark discontinued)
- Improved reservation filtering when dismantling specific kits
Changes:
- ShowcaseManager now links reservations to specific kit instances
- POS terminal modal shows disassemble button in edit mode
- Kit disassembly properly updates stock aggregates
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Change from ProductKit.all_objects.all() to super().get_queryset()
since ProductKit model doesn't have an all_objects manager.
Fixes AttributeError: type object 'ProductKit' has no attribute 'all_objects'
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Реализована трёхуровневая система статусов товаров и комплектов:
- 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>
Упрощена модель ProductTag:
- Удалены поля soft delete (is_deleted, deleted_at, deleted_by)
- Добавлено поле is_active для управления статусом
- Упрощены менеджеры и методы модели
Создан CRUD функционал:
- ProductTagForm: форма с автогенерацией slug
- Views: список, создание, просмотр, редактирование, удаление
- URL маршруты: /products/tags/*
- Шаблоны: list, form, detail, confirm_delete
Особенности:
- Поиск по названию и slug
- Фильтрация по статусу активности
- Статистика использования тегов в товарах/комплектах
- Пагинация (20 на страницу)
- Предупреждение при удалении с отображением связанных объектов
- Добавлена ссылка "Теги" в навигацию
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Проблема:
- Поле 'notes' было удалено из модели KitItem миграцией 0005
- Админка и другие части кода продолжали ссылаться на это поле
- Это вызывало FieldError при попытке редактирования ProductKit в админке
Решение:
Удалены все 6 упоминаний поля 'notes' из кода:
1. admin.py (2 места):
- KitItemInline: удалено 'notes' из fields
- KitItemAdmin: удалено 'notes' из fields
2. productkit_detail.html (2 места):
- Удален заголовок колонки "Примечание"
- Удален блок отображения item.notes
3. demo_variants.py (2 места):
- Удалено 'notes' из defaults для премиум букета
- Удалено 'notes' из defaults для эконом букета
Результат:
- Админка ProductKit теперь работает корректно
- Шаблоны не обращаются к несуществующим полям
- Демо-команды создания вариантов работают без ошибок
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Views:
- ProductKitListView: фильтр is_temporary=False
- CombinedProductListView: фильтр is_temporary=False для комплектов
- API search: фильтр is_temporary=False в поиске и популярных
Admin:
- Добавлен фильтр по is_temporary
- Добавлено отображение статуса временного комплекта в списке
- Добавлена ссылка на заказ для временных комплектов
- Добавлен раздел "Временный комплект" в fieldsets
Теперь временные комплекты не показываются в общем каталоге,
но доступны в админке и по прямой ссылке (для заказов).
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Исправлены 4 проблемы:
1. Расчёт цены первого товара - улучшена валидация в getProductPrice и calculateFinalPrice
2. Отображение actual_price в Select2 вместо обычной цены
3. Количество по умолчанию = 1 для новых форм компонентов
4. Auto-select текста при клике на поле количества для удобства редактирования
Изменённые файлы:
- products/forms.py: добавлен __init__ в KitItemForm для quantity.initial = 1
- products/templates/includes/select2-product-init.html: обновлена formatSelectResult
- products/templates/productkit_create.html: добавлен focus handler для auto-select
- products/templates/productkit_edit.html: добавлен focus handler для auto-select
🤖 Generated with Claude Code
Co-Authored-By: Claude <noreply@anthropic.com>
Реализовано:
- Создан набор переиспользуемых шаблонных тегов для отображения качества
- quality_badge_mini: маленький значок в углу фото
- quality_badge_full: полный индикатор с размером фото
- quality_indicator: включаемый тег с позиционированием
- quality_icon_only: только символ качества для списков
- Добавлены шаблонные теги в:
- product_detail.html: индикатор в углу миниатюр + в модальной галерее
- product_list.html: иконка качества в таблице товаров
- productkit_detail.html: индикатор в углу фото комплектов
- Создан CSS с ненавязчивыми стилями:
- Полупрозрачные индикаторы (opacity: 0.8)
- Компактные размеры (не отвлекает от фото)
- Отзывчивость на мобильных устройствах
- Анимации при наведении
- Обновлена админ панель:
- Добавлены 3 новых экшена для поиска товаров по качеству
- show_poor_quality_photos: фильтр на товары требующие обновления
- show_excellent_quality_photos: фильтр на товары с хорошим качеством
- show_all_quality_levels: статистика распределения качества
Интеграция в базу template tags:
- myproject/products/templatetags/quality_tags.py (новый файл)
- myproject/static/css/quality_indicator.css (новый файл)
- myproject/products/templates/products/includes/quality_badge.html (новый файл)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Override Django's delete_selected action to enforce soft deletion
(calls .delete() on each object instead of queryset.delete())
- Add hard_delete_selected action for safe permanent deletion
- Checks for dangerous relations (KitItem, etc.) before deleting
- Only allows deletion if no critical dependencies exist
- Safely deletes photos from media/ folder by explicitly calling
ProductPhoto.delete() which triggers ImageProcessor cleanup
- Add delete() and hard_delete() method overrides to ProductTag model
(Product, ProductKit, ProductCategory already had these)
- Integrate all three actions into admin classes:
ProductCategoryAdmin, ProductTagAdmin, ProductAdmin, ProductKitAdmin
- Add get_queryset() and get_deleted_status() methods to admin classes
for proper soft delete support
Now when admin clicks "Delete":
1. Regular "Удалить" = soft delete (is_deleted=True, stays in DB)
2. "Безопасно удалить" = hard delete (only if no dependencies, removes from DB)
3. "Восстановить" = restores soft-deleted items
Fixes issue where items were hard-deleted from admin instead of soft-deleted.
🤖 Generated with Claude Code
Co-Authored-By: Claude <noreply@anthropic.com>
- Keep only single photo preview per inline (large version 800x800)
- Removed all_versions_preview display from photo inlines
- Cleaner, more focused admin interface
- Confirmed all sizes are stored correctly:
* Large (800x800) verified
* Medium (400x400) verified
* Originals verified
- Use large_url() for preview in admin (best quality/size balance)