diff --git a/check_kit_bindings.py b/check_kit_bindings.py new file mode 100644 index 0000000..713aded --- /dev/null +++ b/check_kit_bindings.py @@ -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}") diff --git a/myproject/check_kit_bindings.py b/myproject/check_kit_bindings.py new file mode 100644 index 0000000..d4b65cf --- /dev/null +++ b/myproject/check_kit_bindings.py @@ -0,0 +1,27 @@ +#!/usr/bin/env python +import os, sys, django +os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproject.settings') +django.setup() + +from products.models.kits import ConfigurableKitProduct +from django_tenants.utils import tenant_context +from tenants.models import Client + +client = Client.objects.get(schema_name='grach') +with tenant_context(client): + print("=" * 80) + print("ConfigurableKitProduct items with kit bindings:") + print("=" * 80) + + for product in ConfigurableKitProduct.objects.all().order_by('-id')[:5]: + attrs = product.parent_attributes.all() + if attrs.exists(): + kit_bound = attrs.filter(kit__isnull=False).count() + print(f"\nID {product.id}: {product.name}") + print(f" Total attrs: {attrs.count()} | Kit-bound: {kit_bound}") + for param_name in attrs.values_list('name', flat=True).distinct(): + vals = attrs.filter(name=param_name) + print(f" {param_name}:") + for attr in vals: + kit = attr.kit.name if attr.kit else "(no kit)" + print(f" - {attr.option} -> {kit}") diff --git a/myproject/products/forms.py b/myproject/products/forms.py index 25f3b62..43de98b 100644 --- a/myproject/products/forms.py +++ b/myproject/products/forms.py @@ -722,7 +722,7 @@ class BaseConfigurableKitOptionFormSet(forms.BaseInlineFormSet): parent = self.instance if parent and parent.pk: # Получаем все уникальные названия атрибутов родителя - attribute_names = ( + attribute_names = list( parent.parent_attributes .all() .order_by('position', 'name') @@ -730,17 +730,24 @@ class BaseConfigurableKitOptionFormSet(forms.BaseInlineFormSet): .values_list('name', flat=True) ) - # Проверяем что каждый атрибут выбран - missing_attributes = [] - for attr_name in attribute_names: - field_name = f'attribute_{attr_name}' - if field_name not in form.cleaned_data or not form.cleaned_data[field_name]: - missing_attributes.append(attr_name) + # Если у товара есть параметры, вариант ОБЯЗАН иметь значения для них + if attribute_names: + # Проверяем что каждый атрибут выбран + missing_attributes = [] + for attr_name in attribute_names: + field_name = f'attribute_{attr_name}' + if field_name not in form.cleaned_data or not form.cleaned_data[field_name]: + missing_attributes.append(attr_name) - if missing_attributes: - attrs_str = ', '.join(f'"{attr}"' for attr in missing_attributes) + if missing_attributes: + attrs_str = ', '.join(f'"{attr}"' for attr in missing_attributes) + raise forms.ValidationError( + f'Вариант {idx + 1}: необходимо заполнить атрибут(ы) {attrs_str}.' + ) + else: + # Если у товара нет параметров, вариант без привязки к параметрам бессмысленен raise forms.ValidationError( - f'Вариант {idx + 1}: необходимо заполнить атрибут(ы) {attrs_str}.' + f'Вариант {idx + 1}: сначала добавьте параметры товара в разделе "Параметры товара".' ) # Проверяем, что не более одного "is_default" diff --git a/myproject/products/templates/products/configurablekit_form.html b/myproject/products/templates/products/configurablekit_form.html index b6c293e..2391fb3 100644 --- a/myproject/products/templates/products/configurablekit_form.html +++ b/myproject/products/templates/products/configurablekit_form.html @@ -258,17 +258,6 @@ input[name*="DELETE"] { {% endfor %} - - -