Добавлена автогенерация артикулов вариантов для ConfigurableProduct

Добавлено поле variant_sku в модель ConfigurableProductOption.
Артикул варианта генерируется автоматически в формате VAR-XXXXXX-V1, VAR-XXXXXX-V2 и т.д.
Счетчик не переиспользуется при удалении вариантов для защиты интеграций.
Переименован property variant_sku в variant_base_sku для основного SKU.
Обновлен шаблон с колонкой артикула варианта.
Создана миграция для добавления поля и data migration для существующих записей.
Назначение: дополнительный артикул для интеграций с внешними площадками.
This commit is contained in:
2025-12-30 11:20:02 +03:00
parent 889834c694
commit 4cbc2f23e3
4 changed files with 116 additions and 3 deletions

View File

@@ -0,0 +1,22 @@
# Generated by Django 5.0.10 on 2025-12-30 08:17
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('products', '0002_add_configurable_sku_counter'),
]
operations = [
migrations.AddField(
model_name='configurableproductoption',
name='variant_sku',
field=models.CharField(blank=True, help_text='Дополнительный артикул для внешних площадок. Генерируется автоматически.', max_length=50, verbose_name='Артикул варианта'),
),
migrations.AddIndex(
model_name='configurableproductoption',
index=models.Index(fields=['variant_sku'], name='products_co_variant_2da938_idx'),
),
]

View File

@@ -0,0 +1,41 @@
# Generated by Django 5.0.10 on 2025-12-30 08:17
import re
from django.db import migrations
def populate_variant_sku(apps, schema_editor):
"""
Генерируем variant_sku для существующих вариантов.
Формат: {parent.sku}-V{counter}
"""
ConfigurableProductOption = apps.get_model('products', 'ConfigurableProductOption')
ConfigurableProduct = apps.get_model('products', 'ConfigurableProduct')
# Получаем все родительские товары
for parent in ConfigurableProduct.objects.all():
# Получаем все варианты этого родителя
options = ConfigurableProductOption.objects.filter(parent=parent).order_by('id')
for idx, option in enumerate(options, start=1):
# Генерируем variant_sku только если он пустой
if not option.variant_sku:
option.variant_sku = f"{parent.sku}-V{idx}"
option.save(update_fields=['variant_sku'])
def reverse_populate(apps, schema_editor):
"""Очистка variant_sku при откате миграции"""
ConfigurableProductOption = apps.get_model('products', 'ConfigurableProductOption')
ConfigurableProductOption.objects.all().update(variant_sku='')
class Migration(migrations.Migration):
dependencies = [
('products', '0003_add_variant_sku'),
]
operations = [
migrations.RunPython(populate_variant_sku, reverse_populate),
]