feat: ozon sync

This commit is contained in:
2024-09-02 19:19:41 +03:00
parent 82236a7750
commit d24be8fb7d
8 changed files with 337 additions and 39 deletions

View File

@@ -0,0 +1,40 @@
from abc import ABC, abstractmethod
from sqlalchemy.ext.asyncio import AsyncSession
from external.marketplace.base import BaseMarketplaceApi
from models import Product, ProductBarcode, ProductImage
class BaseProductSynchronizer(ABC):
products: list[Product] = []
barcodes: list[ProductBarcode] = []
images: list[ProductImage] = []
marketplace_products: list = []
api: BaseMarketplaceApi
session: AsyncSession
def __init__(self, session, marketplace, api):
self.session = session
self.marketplace = marketplace
self.api = api
self._clear()
def _clear(self):
self.products = []
self.barcodes = []
self.images = []
self.marketplace_products = []
async def _write(self):
instances = self.products + self.marketplace_products + self.barcodes + self.images
self.session.add_all(instances)
await self.session.commit()
@abstractmethod
async def create_products(self):
pass
@abstractmethod
async def synchronize_products(self):
pass

View File

@@ -1,15 +1,61 @@
from typing import AsyncIterator
from external.marketplace.base.core import BaseMarketplaceApi
from models import Marketplace
class OzonMarketplaceApi(BaseMarketplaceApi):
def __init__(self, marketplace: Marketplace):
pass
client_id = marketplace.auth_data.get('Client-Id')
api_key = marketplace.auth_data.get('Api-Key')
if not client_id or not api_key:
raise ValueError(
f"Client-Id or Api-Key is missing for Marketplace ID: {marketplace.id}. "
"Please check the marketplace credentials."
)
self.headers = marketplace.auth_data
self.marketplace = marketplace
@property
def get_headers(self) -> dict:
return {}
return self.headers
@property
def base_url(self) -> str:
return ""
return "https://api-seller.ozon.ru"
async def get_products(self, data: dict) -> dict:
method = '/v2/product/list'
response = await self._method('POST', method, json=data)
return response
async def get_all_products(self) -> AsyncIterator[dict]:
limit = 100
last_id = ''
while True:
data = {
'limit': limit,
'last_id': last_id,
}
response = await self.get_products(data)
if not response:
break
result = response.get('result')
if not result:
break
items = result.get('items')
if not items:
break
for item in items:
yield item
last_id = result.get('last_id')
if not last_id:
break
async def get_products_info(self, data: dict) -> dict:
method = '/v2/product/info/list'
response = await self._method('POST', method, json=data)
return response