55 lines
1.8 KiB
Python
55 lines
1.8 KiB
Python
import asyncio
|
|
import json
|
|
import logging
|
|
from typing import Union
|
|
|
|
import utils
|
|
from database import Marketplace
|
|
from limiter import BatchLimiter
|
|
from marketplaces.base import BaseMarketplaceApi
|
|
|
|
|
|
class OzonMarketplaceApi(BaseMarketplaceApi):
|
|
|
|
def __init__(self, marketplace: Marketplace):
|
|
self.marketplace = marketplace
|
|
auth_data = json.loads(marketplace.auth_data)
|
|
|
|
self.headers = {
|
|
'Client-Id': auth_data.get('clientId'),
|
|
'Api-Key': auth_data.get('clientToken')
|
|
}
|
|
|
|
def get_headers(self):
|
|
return self.headers
|
|
|
|
@property
|
|
def api_url(self):
|
|
return 'https://api-seller.ozon.ru'
|
|
|
|
async def update_stocks(self, data: Union[list, dict]):
|
|
if type(data) is not list:
|
|
return
|
|
max_stocks = 100
|
|
chunks = utils.chunk_list(data, max_stocks)
|
|
limiter = BatchLimiter(max_requests=80, period=60)
|
|
|
|
async def send_stock_chunk(chunk):
|
|
try:
|
|
await limiter.acquire()
|
|
request_data = {'stocks': chunk}
|
|
response = await self._method('POST', '/v2/products/stocks', data=request_data)
|
|
print(request_data)
|
|
response = await response.json()
|
|
error_message = response.get('message')
|
|
error_code = response.get('code')
|
|
if error_message:
|
|
logging.warning(
|
|
f'Error occurred when sending stocks to [{self.marketplace.id}]: {error_message} ({error_code})')
|
|
except Exception as e:
|
|
logging.error(
|
|
f'Exception occurred while sending stocks to marketplace ID [{self.marketplace.id}]: {str(e)}')
|
|
|
|
tasks = [send_stock_chunk(chunk) for chunk in chunks]
|
|
await asyncio.gather(*tasks)
|