- Добавлена реализация метода test_connection() с обработкой различных HTTP статусов - Реализованы вспомогательные методы _get_api_url() и _get_auth() для работы с API - Добавлена интеграция WooCommerceService в get_integration_service() - Настроены поля формы для WooCommerceIntegration в get_form_fields_meta() fix(inventory): исправить расчет цены продажи в базовых единицах - Исправлен расчет sale_price в SaleProcessor с учетом conversion_factor_snapshot - Обновлен расчет цены в сигнале create_sale_on_order_completion для корректной работы с sales_unit
76 lines
3.3 KiB
Python
76 lines
3.3 KiB
Python
import requests
|
||
from typing import Tuple
|
||
from .base import MarketplaceService
|
||
|
||
|
||
class WooCommerceService(MarketplaceService):
|
||
"""Сервис для работы с WooCommerce API"""
|
||
|
||
def _get_api_url(self) -> str:
|
||
"""Получить базовый URL для WooCommerce REST API"""
|
||
base = self.config.store_url.rstrip('/')
|
||
# WooCommerce REST API v3 endpoint
|
||
return f"{base}/wp-json/wc/v3/"
|
||
|
||
def _get_auth(self) -> tuple:
|
||
"""Получить кортеж для Basic Auth (consumer_key, consumer_secret)"""
|
||
return (self.config.consumer_key or '', self.config.consumer_secret or '')
|
||
|
||
def test_connection(self) -> Tuple[bool, str]:
|
||
"""
|
||
Проверить соединение с WooCommerce API.
|
||
|
||
Использует endpoint /wp-json/wc/v3/ для проверки.
|
||
Аутентификация через HTTP Basic Auth.
|
||
"""
|
||
if not self.config.store_url:
|
||
return False, 'Не указан URL магазина'
|
||
|
||
if not self.config.consumer_key or not self.config.consumer_secret:
|
||
return False, 'Не указаны ключи API'
|
||
|
||
url = self._get_api_url()
|
||
|
||
try:
|
||
# Пытаемся получить список товаров (limit=1) для проверки авторизации
|
||
# Это более надёжный способ проверки, чем просто обращение к корню API
|
||
response = requests.get(
|
||
f"{url}products",
|
||
params={'per_page': 1},
|
||
auth=self._get_auth(),
|
||
timeout=15
|
||
)
|
||
|
||
if response.status_code == 200:
|
||
return True, 'Соединение установлено успешно'
|
||
elif response.status_code == 401:
|
||
return False, 'Неверные ключи API (Consumer Key/Secret)'
|
||
elif response.status_code == 403:
|
||
return False, 'Доступ запрещён. Проверьте права API ключа'
|
||
elif response.status_code == 404:
|
||
return False, 'WooCommerce REST API не найден. Проверьте, что WooCommerce установлен и активирован'
|
||
else:
|
||
return False, f'Ошибка соединения: HTTP {response.status_code}'
|
||
|
||
except requests.exceptions.Timeout:
|
||
return False, 'Таймаут соединения (15 сек)'
|
||
except requests.exceptions.ConnectionError:
|
||
return False, 'Не удалось подключиться к серверу. Проверьте URL магазина'
|
||
except Exception as e:
|
||
return False, f'Ошибка: {str(e)}'
|
||
|
||
def sync(self) -> Tuple[bool, str]:
|
||
"""Выполнить синхронизацию с WooCommerce"""
|
||
# TODO: реализовать синхронизацию
|
||
return True, 'Синхронизация запущена (заглушка)'
|
||
|
||
def fetch_orders(self, limit: int = 50):
|
||
"""Получить заказы с WooCommerce"""
|
||
# TODO: реализовать
|
||
pass
|
||
|
||
def push_products(self, products):
|
||
"""Отправить товары на WooCommerce"""
|
||
# TODO: реализовать
|
||
pass
|