From 74d7d1186a6b4c87ce9293d0a725ca056fe9d3e3 Mon Sep 17 00:00:00 2001 From: Andrey Smakotin Date: Mon, 12 Jan 2026 23:26:29 +0300 Subject: [PATCH] =?UTF-8?q?fix(recommerce):=20=D1=81=D0=B1=D1=80=D0=BE?= =?UTF-8?q?=D1=81=20=D0=B7=D0=B0=D1=87=D0=B5=D1=80=D0=BA=D0=BD=D1=83=D1=82?= =?UTF-8?q?=D0=BE=D0=B9=20=D1=86=D0=B5=D0=BD=D1=8B=20=D1=87=D0=B5=D1=80?= =?UTF-8?q?=D0=B5=D0=B7=20price=5Fold=3D0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Передаем price_old[amount]="0" для сброса старой цены - Добавлены флаги is_new и is_popular в маппер - Добавлен debug логгер для отладки типов данных Co-Authored-By: Claude Opus 4.5 --- myproject/integrations/recommerce/client.py | 1 + myproject/integrations/recommerce/mappers.py | 11 +++++++++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/myproject/integrations/recommerce/client.py b/myproject/integrations/recommerce/client.py index 412cf40..8144886 100644 --- a/myproject/integrations/recommerce/client.py +++ b/myproject/integrations/recommerce/client.py @@ -106,6 +106,7 @@ class RecommerceClient: # Recommerce API требует form-data для POST запросов # data должен быть плоским словарём с ключами вида price[amount], price[currency] logger.info(f"Recommerce update_product {sku}: {data}") + logger.debug(f"Data types in update_product: {[(k, type(v).__name__) for k, v in data.items()]}") return self._request('POST', f'catalog/products/{sku}', data=data) def create_product(self, data: Dict[str, Any]) -> Dict[str, Any]: diff --git a/myproject/integrations/recommerce/mappers.py b/myproject/integrations/recommerce/mappers.py index b13ad98..b18bb68 100644 --- a/myproject/integrations/recommerce/mappers.py +++ b/myproject/integrations/recommerce/mappers.py @@ -62,12 +62,13 @@ def to_api_product( # price_old - как в рабочем скрипте (не old_price из документации) data['price_old[amount]'] = str(float(product.price)) data['price_old[currency]'] = 'BYN' - # TODO: is_special='true' принимается API но игнорируется при обновлении. - # Возможно работает только при создании товара. else: # Нет скидки: только основная цена data['price[amount]'] = str(float(product.price or 0)) data['price[currency]'] = 'BYN' + # Важно: передаем "0" для price_old, чтобы сбросить зачеркнутую цену (как в рабочем скрипте) + data['price_old[amount]'] = "0" + data['price_old[currency]'] = 'BYN' if 'content' in fields: # content включает название и описание @@ -87,6 +88,12 @@ def to_api_product( if photo.image: data[f'images[{idx}]'] = photo.image.url + # Обработка флагов товара (как строки "true"/"false" согласно документации API) + if hasattr(product, 'is_new'): + data['is_new'] = "true" if product.is_new else "false" + if hasattr(product, 'is_popular'): + data['is_popular'] = "true" if product.is_popular else "false" + return data