feat: a lot of a lot

This commit is contained in:
2024-09-01 01:05:11 +03:00
parent 867dfbe597
commit 4ae03284a3
43 changed files with 700 additions and 13 deletions

4
marketplaces/__init__.py Normal file
View File

@@ -0,0 +1,4 @@
from .wildberries import WildberriesController
from .ozon import OzonController
from .yandex import YandexController
from .factory import MarketplaceControllerFactory

View File

@@ -0,0 +1 @@
from .core import BaseMarketplaceController

25
marketplaces/base/core.py Normal file
View 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
View 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}")

View File

@@ -0,0 +1 @@
from .core import OzonController

View File

@@ -0,0 +1,6 @@
from marketplaces.base.core import BaseMarketplaceController
class OzonController(BaseMarketplaceController):
async def synchronize_products(self):
pass

View File

@@ -0,0 +1 @@
from .core import WildberriesController

View 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}')

View File

@@ -0,0 +1 @@
from .core import YandexController

View File

@@ -0,0 +1,6 @@
from marketplaces.base.core import BaseMarketplaceController
class YandexController(BaseMarketplaceController):
async def synchronize_products(self):
pass