Enforce parameter binding requirement for ConfigurableKitProduct variants
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>
This commit is contained in:
44
check_kit_bindings.py
Normal file
44
check_kit_bindings.py
Normal file
@@ -0,0 +1,44 @@
|
||||
#!/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}")
|
||||
Reference in New Issue
Block a user