rewritten crap

This commit is contained in:
2025-05-11 08:00:23 +03:00
parent b5110ec69a
commit 2e3245c8f9
8 changed files with 72 additions and 60 deletions

View File

@@ -15,7 +15,7 @@ class BaseMarketplaceApi(ABC):
pass pass
@abstractmethod @abstractmethod
async def update_stocks(self, data: Union[list, dict]) -> ClientResponse: async def update_stocks(self, data: Union[list, dict]) -> (ClientSession, ClientResponse):
pass pass
@abstractmethod @abstractmethod
@@ -29,13 +29,12 @@ class BaseMarketplaceApi(ABC):
async def _method(self, http_method: Literal['POST', 'GET', 'PATCH', 'PUT', 'DELETE'], async def _method(self, http_method: Literal['POST', 'GET', 'PATCH', 'PUT', 'DELETE'],
method: str, method: str,
data: dict) -> ClientResponse: data: dict) -> (ClientSession, ClientResponse):
self.session = ClientSession() session = ClientSession()
response = await self.session.request( response = await session.request(
http_method, http_method,
f'{self.api_url}{method}', f'{self.api_url}{method}',
json=data, json=data,
headers=self.get_headers() headers=self.get_headers()
) )
await self.session.close() return session, response
return response

View File

@@ -2,7 +2,7 @@ import json
import logging import logging
from typing import Union from typing import Union
from aiohttp import ClientResponse from aiohttp import ClientResponse, ClientSession
from database import Marketplace from database import Marketplace
from marketplaces.base import BaseMarketplaceApi from marketplaces.base import BaseMarketplaceApi
@@ -34,5 +34,5 @@ class OzonMarketplaceApi(BaseMarketplaceApi):
def api_url(self): def api_url(self):
return 'https://api-seller.ozon.ru' return 'https://api-seller.ozon.ru'
async def update_stocks(self, data: Union[list, dict]) -> ClientResponse: async def update_stocks(self, data: Union[list, dict]) -> (ClientSession, ClientResponse):
return await self._method('POST', '/v2/products/stocks', data={'stocks': data}) return await self._method('POST', '/v2/products/stocks', data={'stocks': data})

View File

@@ -3,6 +3,7 @@ import logging
from typing import Union from typing import Union
import jwt import jwt
from aiohttp import ClientSession, ClientResponse
from database import Marketplace from database import Marketplace
from marketplaces.base import BaseMarketplaceApi from marketplaces.base import BaseMarketplaceApi
@@ -36,7 +37,7 @@ class WildberriesMarketplaceApi(BaseMarketplaceApi):
def api_url(self): def api_url(self):
return 'https://marketplace-api.wildberries.ru' return 'https://marketplace-api.wildberries.ru'
async def update_stocks(self, data: Union[list, dict]): async def update_stocks(self, data: Union[list, dict])-> (ClientSession, ClientResponse):
warehouse_id = self.marketplace.warehouse_id warehouse_id = self.marketplace.warehouse_id
return await self._method('PUT', f'/api/v3/stocks/{warehouse_id}', data={'stocks': data}) return await self._method('PUT', f'/api/v3/stocks/{warehouse_id}', data={'stocks': data})

View File

@@ -3,6 +3,8 @@ import json
import logging import logging
from typing import Union from typing import Union
from aiohttp import ClientResponse, ClientSession
from backend.config import YANDEX_CLIENT_ID from backend.config import YANDEX_CLIENT_ID
from database import Marketplace from database import Marketplace
from limiter import BatchLimiter from limiter import BatchLimiter
@@ -43,7 +45,7 @@ class YandexmarketMarketplaceApi(BaseMarketplaceApi):
def api_url(self): def api_url(self):
return 'https://api.partner.market.yandex.ru/v2' return 'https://api.partner.market.yandex.ru/v2'
async def update_stocks(self, data: Union[list, dict]): async def update_stocks(self, data: Union[list, dict]) -> (ClientSession, ClientResponse):
campaign_id = self.marketplace.campaign_id campaign_id = self.marketplace.campaign_id
return await self._method('PUT', return await self._method('PUT',
f'/campaigns/{campaign_id}/offers/stocks', f'/campaigns/{campaign_id}/offers/stocks',

View File

@@ -16,7 +16,8 @@ class OzonStocksSender(BaseStocksSender):
return 100 return 100
async def _process_chunk(self, chunk: list[dict]) -> SendStockStatus: async def _process_chunk(self, chunk: list[dict]) -> SendStockStatus:
response = await self.api.update_stocks(data=chunk) session ,response = await self.api.update_stocks(data=chunk)
try:
status_code = response.status status_code = response.status
if status_code == 200: if status_code == 200:
return SendStockStatus.SUCCESS return SendStockStatus.SUCCESS
@@ -35,7 +36,8 @@ class OzonStocksSender(BaseStocksSender):
]: ]:
return SendStockStatus.SHOULD_RETRY return SendStockStatus.SHOULD_RETRY
return SendStockStatus.ERROR return SendStockStatus.ERROR
finally:
await session.close()
async def after_chunk_processed(self): async def after_chunk_processed(self):
return await asyncio.sleep(80 / 100) return await asyncio.sleep(80 / 100)

View File

@@ -19,7 +19,8 @@ class WildberriesStocksSender(BaseStocksSender):
return 5 return 5
async def _process_chunk(self, chunk: list[dict]) -> SendStockStatus: async def _process_chunk(self, chunk: list[dict]) -> SendStockStatus:
response = await self.api.update_stocks(chunk) session,response = await self.api.update_stocks(chunk)
try:
headers = response.headers headers = response.headers
status_code = response.status status_code = response.status
@@ -39,7 +40,8 @@ class WildberriesStocksSender(BaseStocksSender):
return SendStockStatus.SHOULD_RETRY return SendStockStatus.SHOULD_RETRY
self.remaining = int(headers.get('X-Ratelimit-Remaining', 0)) self.remaining = int(headers.get('X-Ratelimit-Remaining', 0))
return SendStockStatus.SUCCESS return SendStockStatus.SUCCESS
finally:
await session.close()
async def after_chunk_processed(self): async def after_chunk_processed(self):
if self.remaining <= 0: if self.remaining <= 0:
await asyncio.sleep(self.sleep_time) await asyncio.sleep(self.sleep_time)

View File

@@ -26,7 +26,8 @@ class YandexmarketStocksSender(BaseStocksSender):
return 2000 return 2000
async def _process_chunk(self, chunk: list[dict]) -> SendStockStatus: async def _process_chunk(self, chunk: list[dict]) -> SendStockStatus:
response = await self.api.update_stocks(chunk) session, response = await self.api.update_stocks(chunk)
try:
status_code = response.status status_code = response.status
if status_code == 200: if status_code == 200:
self.total_stocks_sent += len(chunk) self.total_stocks_sent += len(chunk)
@@ -38,6 +39,8 @@ class YandexmarketStocksSender(BaseStocksSender):
response_text = await response.text() response_text = await response.text()
logging.error(f'[{self.updater.marketplace.id}]: {response_text}') logging.error(f'[{self.updater.marketplace.id}]: {response_text}')
return SendStockStatus.ERROR return SendStockStatus.ERROR
finally:
await session.close()
async def after_chunk_processed(self): async def after_chunk_processed(self):
time_delta = time.time() - self.start_time time_delta = time.time() - self.start_time

View File

@@ -73,6 +73,7 @@ class BaseMarketplaceUpdater(ABC):
return {} return {}
async def filter_stocks_data(self, stock_data_list: list[StockData]) -> list[StockData]: async def filter_stocks_data(self, stock_data_list: list[StockData]) -> list[StockData]:
return stock_data_list
cached_stocks: dict = await self.redis_client.hgetall(self.get_cache_key()) cached_stocks: dict = await self.redis_client.hgetall(self.get_cache_key())
cached_stocks = {int(k): int(v) for k, v in cached_stocks.items()} cached_stocks = {int(k): int(v) for k, v in cached_stocks.items()}
result = [] result = []
@@ -86,6 +87,8 @@ class BaseMarketplaceUpdater(ABC):
async def after_sender_sent(self, stock_requests: list[StockRequest], invalid_product_ids: list[int]): async def after_sender_sent(self, stock_requests: list[StockRequest], invalid_product_ids: list[int]):
stock_requests = list(filter(lambda stock: stock['product_id'] not in invalid_product_ids, stock_requests)) stock_requests = list(filter(lambda stock: stock['product_id'] not in invalid_product_ids, stock_requests))
mapping = {stock['product_id']: stock['full_stock'] for stock in stock_requests} mapping = {stock['product_id']: stock['full_stock'] for stock in stock_requests}
if not mapping:
return
await self.redis_client.hset(self.get_cache_key(), mapping=mapping) await self.redis_client.hset(self.get_cache_key(), mapping=mapping)
async def get_marketplace_updates(self, stock_data_list: list[StockData]) -> list[StockRequest]: async def get_marketplace_updates(self, stock_data_list: list[StockData]) -> list[StockRequest]: