Объединение списков товаров и комплектов в единый интерфейс

- Создан единый шаблон products_list.html для отображения товаров и комплектов
- Удалены дублирующиеся шаблоны (product_list, productkit_list, products_unified_list, all_products_list)
- Добавлены фильтры: тип (все/товары/комплекты), категория, статус, наличие, теги
- Обновлен CombinedProductListView с поддержкой фильтрации по типу и тегам
- Изменены URL маршруты: главная страница /products/ теперь показывает объединенный список
- Обновлены success_url во всех CRUD представлениях для редиректа на объединенный список
- Добавлена фильтрация по тегам с отображением количества выбранных элементов
- Улучшена UX: компактный select для тегов с счетчиком выбранных
- Все комментарии в коде переведены на русский язык
This commit is contained in:
2025-11-15 22:48:34 +03:00
parent 9363527e50
commit b8185f2f6c
8 changed files with 409 additions and 768 deletions

View File

@@ -6,35 +6,37 @@ from .views import photo_status_api
app_name = 'products'
urlpatterns = [
# Combined view for products and kits
path('', views.CombinedProductListView.as_view(), name='all-products'),
# Main unified list for products and kits (default view)
path('', views.CombinedProductListView.as_view(), name='products-list'),
# Legacy URLs for backward compatibility
path('all/', views.CombinedProductListView.as_view(), name='all-products'),
path('products/', views.ProductListView.as_view(), name='product-list-legacy'),
path('kits/', views.ProductKitListView.as_view(), name='productkit-list'),
# CRUD URLs for Product
path('products/', views.ProductListView.as_view(), name='product-list'),
path('create/', views.ProductCreateView.as_view(), name='product-create'),
path('<int:pk>/', views.ProductDetailView.as_view(), name='product-detail'),
path('<int:pk>/update/', views.ProductUpdateView.as_view(), name='product-update'),
path('<int:pk>/delete/', views.ProductDeleteView.as_view(), name='product-delete'),
path('product/create/', views.ProductCreateView.as_view(), name='product-create'),
path('product/<int:pk>/', views.ProductDetailView.as_view(), name='product-detail'),
path('product/<int:pk>/update/', views.ProductUpdateView.as_view(), name='product-update'),
path('product/<int:pk>/delete/', views.ProductDeleteView.as_view(), name='product-delete'),
# Photo management
path('photo/<int:pk>/delete/', views.product_photo_delete, name='product-photo-delete'),
path('photo/<int:pk>/set-main/', views.product_photo_set_main, name='product-photo-set-main'),
path('photo/<int:pk>/move-up/', views.product_photo_move_up, name='product-photo-move-up'),
path('photo/<int:pk>/move-down/', views.product_photo_move_down, name='product-photo-move-down'),
# Photo management for Product
path('product/photo/<int:pk>/delete/', views.product_photo_delete, name='product-photo-delete'),
path('product/photo/<int:pk>/set-main/', views.product_photo_set_main, name='product-photo-set-main'),
path('product/photo/<int:pk>/move-up/', views.product_photo_move_up, name='product-photo-move-up'),
path('product/photo/<int:pk>/move-down/', views.product_photo_move_down, name='product-photo-move-down'),
# CRUD URLs for ProductKit (комплекты/букеты)
path('kits/', views.ProductKitListView.as_view(), name='productkit-list'),
path('kits/create/', views.ProductKitCreateView.as_view(), name='productkit-create'),
path('kits/<int:pk>/', views.ProductKitDetailView.as_view(), name='productkit-detail'),
path('kits/<int:pk>/update/', views.ProductKitUpdateView.as_view(), name='productkit-update'),
path('kits/<int:pk>/delete/', views.ProductKitDeleteView.as_view(), name='productkit-delete'),
path('kits/<int:pk>/make-permanent/', views.ProductKitMakePermanentView.as_view(), name='productkit-make-permanent'),
path('kit/create/', views.ProductKitCreateView.as_view(), name='productkit-create'),
path('kit/<int:pk>/', views.ProductKitDetailView.as_view(), name='productkit-detail'),
path('kit/<int:pk>/update/', views.ProductKitUpdateView.as_view(), name='productkit-update'),
path('kit/<int:pk>/delete/', views.ProductKitDeleteView.as_view(), name='productkit-delete'),
path('kit/<int:pk>/make-permanent/', views.ProductKitMakePermanentView.as_view(), name='productkit-make-permanent'),
# Photo management for ProductKit
path('kits/photo/<int:pk>/delete/', views.productkit_photo_delete, name='productkit-photo-delete'),
path('kits/photo/<int:pk>/set-main/', views.productkit_photo_set_main, name='productkit-photo-set-main'),
path('kits/photo/<int:pk>/move-up/', views.productkit_photo_move_up, name='productkit-photo-move-up'),
path('kits/photo/<int:pk>/move-down/', views.productkit_photo_move_down, name='productkit-photo-move-down'),
path('kit/photo/<int:pk>/delete/', views.productkit_photo_delete, name='productkit-photo-delete'),
path('kit/photo/<int:pk>/set-main/', views.productkit_photo_set_main, name='productkit-photo-set-main'),
path('kit/photo/<int:pk>/move-up/', views.productkit_photo_move_up, name='productkit-photo-move-up'),
path('kit/photo/<int:pk>/move-down/', views.productkit_photo_move_down, name='productkit-photo-move-down'),
# API endpoints
path('api/search-products-variants/', views.search_products_and_variants, name='api-search-products-variants'),