Files
Sipro-Stocks/sender/yandexmarket.py
2025-05-11 07:46:57 +03:00

52 lines
1.6 KiB
Python

import asyncio
import logging
import time
from typing import TYPE_CHECKING
from sender.base import BaseStocksSender, SendStockStatus
if TYPE_CHECKING:
from updaters.base import BaseMarketplaceUpdater
class YandexmarketStocksSender(BaseStocksSender):
def __init__(self, updater: "BaseMarketplaceUpdater"):
super().__init__(updater)
self.start_time = time.time()
self.total_stocks_sent = 0
@property
def max_retries(self) -> int:
return 5
@property
def chunk_size(self) -> int:
return 2000
async def _process_chunk(self, chunk: list[dict]) -> SendStockStatus:
response = await self.api.update_stocks(chunk)
status_code = response.status
if status_code == 200:
self.total_stocks_sent += len(chunk)
return SendStockStatus.SUCCESS
if status_code == 420:
time_to_sleep = 60 - (time.time() - self.start_time)
await asyncio.sleep(time_to_sleep)
return SendStockStatus.SHOULD_RETRY
response_text = await response.text()
logging.error(f'[{self.updater.marketplace.id}]: {response_text}')
return SendStockStatus.ERROR
async def after_chunk_processed(self):
time_delta = time.time() - self.start_time
if self.total_stocks_sent >= 100_000 and time_delta < 60:
time_to_sleep = 60 - time_delta
await asyncio.sleep(time_to_sleep)
self.start_time = time.time()
self.total_stocks_sent = 0
async def before_chunk_processed(self):
pass