Files
octopus/check_kit_bindings.py
Andrey Smakotin 29859503a7 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>
2025-11-18 21:46:58 +03:00

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}")