Files
octopus/myproject/integrations/services/marketplaces/woocommerce.py
Andrey Smakotin 9cd3796527 feat(woocommerce): реализовать проверку соединения с WooCommerce API
- Добавлена реализация метода 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
2026-01-20 23:05:18 +03:00

76 lines
3.3 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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