diff --git a/myproject/products/admin.py b/myproject/products/admin.py index db9a96d..c9d67a0 100644 --- a/myproject/products/admin.py +++ b/myproject/products/admin.py @@ -6,6 +6,7 @@ import nested_admin from .models import ProductCategory, ProductTag, Product, ProductKit, KitItem from .models import ProductPhoto, ProductKitPhoto, ProductCategoryPhoto from .models import ProductVariantGroup, KitItemPriority, SKUCounter, CostPriceHistory +from .models import ConfigurableProduct, ConfigurableProductOption, ConfigurableProductAttribute from .admin_displays import ( format_quality_badge, format_quality_display, @@ -940,3 +941,57 @@ admin.site.register(ProductCategory, ProductCategoryAdminWithPhotos) admin.site.register(ProductTag, ProductTagAdmin) admin.site.register(Product, ProductAdminWithPhotos) admin.site.register(ProductKit, ProductKitAdminWithItemsAndPhotos) + + +# === Админка для ConfigurableProduct === + +class ConfigurableProductOptionInline(admin.TabularInline): + """Инлайн для вариантов вариативного товара""" + model = ConfigurableProductOption + extra = 0 + fields = ('kit', 'product', 'variant_sku', 'is_default', 'attributes') + readonly_fields = ('variant_sku',) + verbose_name = "Вариант" + verbose_name_plural = "Варианты" + + +class ConfigurableProductAttributeInline(admin.TabularInline): + """Инлайн для атрибутов родительского товара""" + model = ConfigurableProductAttribute + extra = 0 + fields = ('name', 'option', 'kit', 'product', 'position', 'visible') + verbose_name = "Атрибут" + verbose_name_plural = "Атрибуты" + + +@admin.register(ConfigurableProduct) +class ConfigurableProductAdmin(admin.ModelAdmin): + """Админка для вариативных товаров""" + list_display = ('name', 'sku', 'status', 'get_options_count', 'created_at') + list_filter = ('status', 'created_at') + search_fields = ('name', 'sku', 'description') + readonly_fields = ('created_at', 'updated_at', 'slug') + inlines = [ConfigurableProductOptionInline, ConfigurableProductAttributeInline] + + fieldsets = ( + ('Основная информация', { + 'fields': ('name', 'sku', 'slug', 'status') + }), + ('Описание', { + 'fields': ('short_description', 'description') + }), + ('Служебная информация', { + 'fields': ('created_at', 'updated_at'), + 'classes': ('collapse',) + }), + ) + + def get_options_count(self, obj): + """Количество вариантов""" + count = obj.options.count() + return format_html( + '{}', + '#28a745' if count > 0 else '#6c757d', + count + ) + get_options_count.short_description = 'Вариантов'