feat: ym sync
This commit is contained in:
119
external/marketplace/yandex/core.py
vendored
119
external/marketplace/yandex/core.py
vendored
@@ -1,15 +1,128 @@
|
||||
from typing import AsyncIterator, Optional
|
||||
|
||||
from external.marketplace.base.core import BaseMarketplaceApi
|
||||
from models import Marketplace
|
||||
from utils.list_utils import chunk_list
|
||||
|
||||
|
||||
class YandexMarketplaceApi(BaseMarketplaceApi):
|
||||
def __init__(self, marketplace: Marketplace):
|
||||
pass
|
||||
token = marketplace.auth_data.get('Api-Key')
|
||||
if not token:
|
||||
raise ValueError(
|
||||
f"Authorization token is missing for Marketplace ID: {marketplace.id}. "
|
||||
"Please check the marketplace credentials."
|
||||
)
|
||||
self.token = token
|
||||
self.headers = {'Api-Key': token}
|
||||
self.marketplace = marketplace
|
||||
|
||||
@property
|
||||
def get_headers(self) -> dict:
|
||||
return {}
|
||||
return self.headers
|
||||
|
||||
@property
|
||||
def base_url(self) -> str:
|
||||
return ""
|
||||
return 'https://api.partner.market.yandex.ru'
|
||||
|
||||
def _get_campaign_id(self) -> Optional[int]:
|
||||
campaign_id: Optional[str] = self.marketplace.auth_data.get('CampaignId')
|
||||
if not campaign_id:
|
||||
return None
|
||||
if not str(campaign_id).isdigit():
|
||||
return None
|
||||
return int(campaign_id)
|
||||
|
||||
async def get_campaigns(self) -> AsyncIterator[dict]:
|
||||
method = '/campaigns'
|
||||
page = 1
|
||||
while True:
|
||||
params = {
|
||||
'page': page,
|
||||
}
|
||||
response = await self._method('GET', method, params=params)
|
||||
if not response:
|
||||
break
|
||||
campaigns = response.get('campaigns')
|
||||
if not campaigns:
|
||||
break
|
||||
for campaign in campaigns:
|
||||
yield campaign
|
||||
|
||||
pager = response.get('pager')
|
||||
if not pager:
|
||||
break
|
||||
pages_count = pager.get('pagesCount')
|
||||
if not pages_count:
|
||||
break
|
||||
if page >= pages_count:
|
||||
break
|
||||
page += 1
|
||||
|
||||
async def get_business_id(self, campaign_id: int) -> Optional[int]:
|
||||
async for campaign in self.get_campaigns():
|
||||
if campaign['id'] == campaign_id:
|
||||
return campaign['business']['id']
|
||||
return None
|
||||
|
||||
async def get_all_products(self) -> AsyncIterator[dict]:
|
||||
campaign_id = self._get_campaign_id()
|
||||
if not campaign_id:
|
||||
return
|
||||
business_id = await self.get_business_id(campaign_id)
|
||||
if not business_id:
|
||||
return
|
||||
|
||||
method = f'/businesses/{business_id}/offer-mappings'
|
||||
limit = 200
|
||||
page_token = ''
|
||||
while True:
|
||||
params = {
|
||||
'limit': limit,
|
||||
'page_token': page_token,
|
||||
}
|
||||
response = await self._method('POST', method, params=params)
|
||||
if not response:
|
||||
break
|
||||
response = response.get('result')
|
||||
if not response:
|
||||
break
|
||||
offers = response.get('offerMappings')
|
||||
if not offers:
|
||||
break
|
||||
for offer in offers:
|
||||
yield offer
|
||||
paging = response.get('paging')
|
||||
if not paging:
|
||||
break
|
||||
|
||||
next_page_token = paging.get('nextPageToken')
|
||||
if not next_page_token:
|
||||
break
|
||||
page_token = next_page_token
|
||||
|
||||
async def get_products_by_offer_ids(self, offer_ids: list[str]) -> AsyncIterator[dict]:
|
||||
campaign_id = self._get_campaign_id()
|
||||
if not campaign_id:
|
||||
return
|
||||
business_id = await self.get_business_id(campaign_id)
|
||||
if not business_id:
|
||||
return
|
||||
|
||||
method = f'/businesses/{business_id}/offer-mappings'
|
||||
limit = 200
|
||||
for chunk in chunk_list(offer_ids, limit):
|
||||
params = {
|
||||
'offer_ids': chunk,
|
||||
}
|
||||
response = await self._method('POST', method, params=params)
|
||||
if not response:
|
||||
break
|
||||
response = response.get('result')
|
||||
if not response:
|
||||
break
|
||||
offers = response.get('offerMappings')
|
||||
if not offers:
|
||||
break
|
||||
for offer in offers:
|
||||
yield offer
|
||||
|
||||
Reference in New Issue
Block a user