feat: добавлена интеграция синхронизации с Recommerce
This commit is contained in:
@@ -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]]:
|
||||
"""
|
||||
|
||||
Reference in New Issue
Block a user