Changes: 1. Removed unused attributesMetadata container from configurablekit_form.html - Dead code from old formset-based attribute system - 10 lines of unused HTML and templating removed 2. Enhanced formset validation in BaseConfigurableKitOptionFormSet.clean(): - If product HAS parameters: variants MUST select values for ALL parameters - If product HAS NO parameters: variants MUST NOT be created - Error message guides user to add parameters first Business logic: - ConfigurableKitProduct variants (options) are ALWAYS bound to attribute values - You cannot create orphan variants without parameter selections - Each variant must have a value for every product parameter User experience: - Clear error message if trying to add variant without parameters - Enforces proper product structure: parameters first, then variants 🤖 Generated with Claude Code Co-Authored-By: Claude <noreply@anthropic.com>
45 lines
1.6 KiB
Python
45 lines
1.6 KiB
Python
#!/usr/bin/env python
|
|
"""
|
|
Check existing kit bindings in database
|
|
"""
|
|
import os
|
|
import sys
|
|
import django
|
|
|
|
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproject.settings')
|
|
django.setup()
|
|
|
|
from products.models.kits import ConfigurableKitProduct, ConfigurableKitProductAttribute
|
|
from django_tenants.utils import tenant_context
|
|
from tenants.models import Client
|
|
|
|
try:
|
|
client = Client.objects.get(schema_name='grach')
|
|
except Client.DoesNotExist:
|
|
print("Tenant 'grach' not found")
|
|
sys.exit(1)
|
|
|
|
with tenant_context(client):
|
|
print("=" * 80)
|
|
print("Current ConfigurableKitProduct items in database:")
|
|
print("=" * 80)
|
|
|
|
for product in ConfigurableKitProduct.objects.all().order_by('-id')[:5]:
|
|
attrs_count = product.parent_attributes.count()
|
|
kit_bound = product.parent_attributes.filter(kit__isnull=False).count()
|
|
|
|
print(f"\nID {product.id}: {product.name} (SKU: {product.sku})")
|
|
print(f" Total attributes: {attrs_count}")
|
|
print(f" Kit-bound attributes: {kit_bound}")
|
|
|
|
if attrs_count > 0:
|
|
print(" Attribute breakdown:")
|
|
params = product.parent_attributes.values('name').distinct()
|
|
for param in params:
|
|
param_name = param['name']
|
|
values = product.parent_attributes.filter(name=param_name).values_list('option', 'kit__name')
|
|
print(f" - {param_name}:")
|
|
for value, kit_name in values:
|
|
kit_info = f"Kit: {kit_name}" if kit_name else "(no kit)"
|
|
print(f" * {value} -> {kit_info}")
|