feat: добавлена интеграция синхронизации с Recommerce

This commit is contained in:
2026-01-12 21:45:31 +03:00
parent a5ab216934
commit 707b45b16d
13 changed files with 475 additions and 104 deletions

View File

@@ -1,3 +1,4 @@
import logging
import requests
from typing import Dict, Any, Optional, List
from .exceptions import (
@@ -6,6 +7,8 @@ from .exceptions import (
RecommerceAPIError
)
logger = logging.getLogger(__name__)
class RecommerceClient:
"""
@@ -26,12 +29,13 @@ class RecommerceClient:
token = self.api_token.encode('ascii', 'ignore').decode('ascii')
except (AttributeError, ValueError):
token = ''
return {
'x-auth-token': token,
'Accept': 'application/json',
'Content-Type': 'application/json', # В доках сказано form-data для POST, но обычно JSON тоже работает. Проверим.
# Если API строго требует form-data, то requests сам поставит нужный Content-Type, если передать files или data вместо json
# НЕ указываем Content-Type - requests сам поставит правильный:
# - application/x-www-form-urlencoded для data=...
# - application/json для json=...
}
def _request(self, method: str, endpoint: str, **kwargs) -> Dict[str, Any]:
@@ -79,6 +83,7 @@ class RecommerceClient:
if response.status_code in [401, 403]:
raise RecommerceAuthError(f"Auth Error: {response.status_code}")
logger.error(f"Recommerce API error {response.status_code}: {response.text}")
raise RecommerceAPIError(
status_code=response.status_code,
message=f"API Request failed: {url}",
@@ -97,13 +102,16 @@ class RecommerceClient:
return self._request('GET', f'catalog/products/{sku}')
def update_product(self, sku: str, data: Dict[str, Any]) -> Dict[str, Any]:
"""Обновить товар"""
# В документации POST используется для обновления
return self._request('POST', f'catalog/products/{sku}', json=data)
"""Обновить товар (использует form-data как указано в документации)"""
# Recommerce API требует form-data для POST запросов
# data должен быть плоским словарём с ключами вида price[amount], price[currency]
logger.info(f"Recommerce update_product {sku}: {data}")
return self._request('POST', f'catalog/products/{sku}', data=data)
def create_product(self, data: Dict[str, Any]) -> Dict[str, Any]:
"""Создать товар"""
return self._request('POST', 'catalog/products', json=data)
"""Создать товар (использует form-data как указано в документации)"""
# Recommerce API требует form-data для POST запросов
return self._request('POST', 'catalog/products', data=data)
def get_orders(self, updated_after: Optional[str] = None) -> List[Dict[str, Any]]:
"""