feat: a lot of a lot
This commit is contained in:
4
marketplaces/__init__.py
Normal file
4
marketplaces/__init__.py
Normal file
@@ -0,0 +1,4 @@
|
||||
from .wildberries import WildberriesController
|
||||
from .ozon import OzonController
|
||||
from .yandex import YandexController
|
||||
from .factory import MarketplaceControllerFactory
|
||||
1
marketplaces/base/__init__.py
Normal file
1
marketplaces/base/__init__.py
Normal file
@@ -0,0 +1 @@
|
||||
from .core import BaseMarketplaceController
|
||||
25
marketplaces/base/core.py
Normal file
25
marketplaces/base/core.py
Normal file
@@ -0,0 +1,25 @@
|
||||
from abc import ABC, abstractmethod
|
||||
from typing import Union
|
||||
|
||||
from sqlalchemy.ext.asyncio import AsyncSession
|
||||
|
||||
from external.marketplace.factory import MarketplaceApiFactory
|
||||
from external.marketplace.ozon.core import OzonMarketplaceApi
|
||||
from external.marketplace.wildberries.core import WildberriesMarketplaceApi
|
||||
from external.marketplace.yandex.core import YandexMarketplaceApi
|
||||
from models import Marketplace
|
||||
|
||||
|
||||
class BaseMarketplaceController(ABC):
|
||||
api: Union[WildberriesMarketplaceApi, OzonMarketplaceApi, YandexMarketplaceApi]
|
||||
marketplace: Marketplace
|
||||
session: AsyncSession
|
||||
|
||||
def __init__(self, session: AsyncSession, marketplace: Marketplace):
|
||||
self.api = MarketplaceApiFactory.get_marketplace_api(marketplace)
|
||||
self.marketplace = marketplace
|
||||
self.session = session
|
||||
|
||||
@abstractmethod
|
||||
async def synchronize_products(self):
|
||||
pass
|
||||
28
marketplaces/factory.py
Normal file
28
marketplaces/factory.py
Normal file
@@ -0,0 +1,28 @@
|
||||
from audioop import ratecv
|
||||
from typing import Union
|
||||
|
||||
from sqlalchemy.ext.asyncio import AsyncSession
|
||||
|
||||
from enums.base_marketplace import BaseMarketplace
|
||||
from marketplaces.ozon.core import OzonController
|
||||
from marketplaces.wildberries.core import WildberriesController
|
||||
from marketplaces.yandex.core import YandexController
|
||||
from models import Marketplace
|
||||
|
||||
|
||||
class MarketplaceControllerFactory:
|
||||
@staticmethod
|
||||
def get_controller(session: AsyncSession, marketplace: Marketplace) -> Union[
|
||||
WildberriesController,
|
||||
OzonController,
|
||||
YandexController
|
||||
]:
|
||||
match marketplace.base_marketplace_key:
|
||||
case BaseMarketplace.WILDBERRIES:
|
||||
return WildberriesController(session, marketplace)
|
||||
case BaseMarketplace.OZON:
|
||||
return OzonController(session, marketplace)
|
||||
case BaseMarketplace.YANDEX_MARKET:
|
||||
return YandexController(session, marketplace)
|
||||
case _:
|
||||
raise ValueError(f"Unsupported marketplace: {marketplace.base_marketplace_key}")
|
||||
1
marketplaces/ozon/__init__.py
Normal file
1
marketplaces/ozon/__init__.py
Normal file
@@ -0,0 +1 @@
|
||||
from .core import OzonController
|
||||
6
marketplaces/ozon/core.py
Normal file
6
marketplaces/ozon/core.py
Normal file
@@ -0,0 +1,6 @@
|
||||
from marketplaces.base.core import BaseMarketplaceController
|
||||
|
||||
|
||||
class OzonController(BaseMarketplaceController):
|
||||
async def synchronize_products(self):
|
||||
pass
|
||||
1
marketplaces/wildberries/__init__.py
Normal file
1
marketplaces/wildberries/__init__.py
Normal file
@@ -0,0 +1 @@
|
||||
from .core import WildberriesController
|
||||
76
marketplaces/wildberries/core.py
Normal file
76
marketplaces/wildberries/core.py
Normal file
@@ -0,0 +1,76 @@
|
||||
import time
|
||||
|
||||
from sqlalchemy import select
|
||||
|
||||
from external.marketplace.wildberries.core import WildberriesMarketplaceApi
|
||||
from marketplaces.base.core import BaseMarketplaceController
|
||||
from models import Product, ProductBarcode, ProductImage, WildberriesProduct
|
||||
|
||||
|
||||
class WildberriesController(BaseMarketplaceController):
|
||||
api: WildberriesMarketplaceApi
|
||||
|
||||
async def synchronize_products(self):
|
||||
products = []
|
||||
barcodes = []
|
||||
images = []
|
||||
wildberries_products = []
|
||||
|
||||
marketplace_id: int = self.marketplace.id
|
||||
synchronized_nm_uuids = set(
|
||||
(
|
||||
await self.session.scalars(
|
||||
select(
|
||||
WildberriesProduct.nm_uuid
|
||||
)
|
||||
.where(
|
||||
WildberriesProduct.marketplace_id == marketplace_id
|
||||
)
|
||||
)
|
||||
).all()
|
||||
)
|
||||
|
||||
async for card in self.api.get_all_products():
|
||||
nm_uuid = card['nmUUID']
|
||||
if nm_uuid in synchronized_nm_uuids:
|
||||
continue
|
||||
sizes: list[dict] = card.get('sizes') or []
|
||||
for size in sizes:
|
||||
tech_size = size.get('techSize')
|
||||
wb_size = size.get('wbSize')
|
||||
size_value = tech_size or wb_size
|
||||
product = Product(
|
||||
client_id=self.marketplace.client_id,
|
||||
name=card['title'],
|
||||
article=card['vendorCode'],
|
||||
size=size_value
|
||||
)
|
||||
skus = size.get('skus') or []
|
||||
for sku in skus:
|
||||
barcode = ProductBarcode(
|
||||
product=product,
|
||||
barcode=sku
|
||||
)
|
||||
barcodes.append(barcode)
|
||||
photos = card.get('photos') or []
|
||||
for photo in photos:
|
||||
image = ProductImage(
|
||||
product=product,
|
||||
image_url=photo['big']
|
||||
)
|
||||
images.append(image)
|
||||
break
|
||||
wildberries_product = WildberriesProduct(
|
||||
marketplace_id=self.marketplace.id,
|
||||
product=product,
|
||||
nm_uuid=nm_uuid
|
||||
)
|
||||
wildberries_products.append(
|
||||
wildberries_product
|
||||
)
|
||||
products.append(product)
|
||||
instances = products + wildberries_products + barcodes + images
|
||||
start = time.time()
|
||||
self.session.add_all(instances)
|
||||
await self.session.commit()
|
||||
print(f'Add and commit elapsed: {time.time() - start}')
|
||||
1
marketplaces/yandex/__init__.py
Normal file
1
marketplaces/yandex/__init__.py
Normal file
@@ -0,0 +1 @@
|
||||
from .core import YandexController
|
||||
6
marketplaces/yandex/core.py
Normal file
6
marketplaces/yandex/core.py
Normal file
@@ -0,0 +1,6 @@
|
||||
from marketplaces.base.core import BaseMarketplaceController
|
||||
|
||||
|
||||
class YandexController(BaseMarketplaceController):
|
||||
async def synchronize_products(self):
|
||||
pass
|
||||
Reference in New Issue
Block a user