feat(integrations): добавить поле primary_category и маппинг категорий для интеграций

Добавлена поддержка выбора основной категории (primary_category) для товаров и наборов, а также новая модель IntegrationCategoryMapping для связи категорий с внешними площадками. Теперь можно указать категорию товара, которая будет использоваться при экспорте на внешние площадки (Recommerce, WooCommerce и др.), с возможностью настройки маппинга категорий для каждого типа интеграции.
This commit is contained in:
2026-01-14 01:53:38 +03:00
parent 7fd361aaf8
commit 1fb280607a
14 changed files with 288 additions and 15 deletions

View File

@@ -0,0 +1,65 @@
"""
Модели для маппинга категорий на внешние площадки.
"""
from django.db import models
class IntegrationCategoryMapping(models.Model):
"""
Маппинг внутренней категории на внешнюю категорию маркетплейса.
Позволяет связать категории товаров с их аналогами на внешних площадках
(Recommerce, WooCommerce и др.).
"""
INTEGRATION_CHOICES = [
('recommerce', 'Recommerce'),
('woocommerce', 'WooCommerce'),
]
category = models.ForeignKey(
'products.ProductCategory',
on_delete=models.CASCADE,
related_name='integration_mappings',
verbose_name="Категория"
)
integration_type = models.CharField(
max_length=20,
choices=INTEGRATION_CHOICES,
verbose_name="Интеграция",
db_index=True
)
external_category_sku = models.CharField(
max_length=100,
verbose_name="Артикул категории во внешней системе",
help_text="SKU или ID категории на внешней площадке"
)
external_category_name = models.CharField(
max_length=200,
blank=True,
verbose_name="Название категории во внешней системе",
help_text="Для справки, не обязательно"
)
created_at = models.DateTimeField(
auto_now_add=True,
verbose_name="Создано"
)
updated_at = models.DateTimeField(
auto_now=True,
verbose_name="Обновлено"
)
class Meta:
verbose_name = "Маппинг категории"
verbose_name_plural = "Маппинги категорий"
unique_together = [['category', 'integration_type']]
indexes = [
models.Index(fields=['integration_type', 'external_category_sku']),
]
def __str__(self):
return f"{self.category.name}{self.get_integration_type_display()}:{self.external_category_sku}"