Убрал лишние иморты и библиотеки из pyproject.toml

This commit is contained in:
Павел Синицин 2024-06-22 18:55:10 +03:00
parent 6d5a19c3b0
commit 7c66c6ccbc
Signed by: spavelit
GPG Key ID: 2FEC8CEAE5A95DD1
3 changed files with 89 additions and 112 deletions

View File

@ -1,10 +1,10 @@
import requests import requests
from bpiek import models from bpiek import models
AUTH_URL = "https://bp.iek.ru/oauth/login" AUTH_URL = "https://bp.iek.ru/oauth/login"
API_URL = "https://bp.iek.ru/api/catalog/v1/" API_URL = "https://bp.iek.ru/api/catalog/v1/"
class BPIekApi: class BPIekApi:
def __init__(self, username, password) -> None: def __init__(self, username, password) -> None:
self.session = requests.Session() self.session = requests.Session()
@ -16,25 +16,15 @@ class BPIekApi:
def _login(self) -> None: def _login(self) -> None:
auth = self.session.post( auth = self.session.post(
url=f"{AUTH_URL}", url=f"{AUTH_URL}",
headers={ headers={"Content-Type": "application/x-www-form-urlencoded"},
"Content-Type": "application/x-www-form-urlencoded" data={"username": self.username, "password": self.password},
},
data={
"username": self.username,
"password": self.password
}
) )
def _instance(self, endpoint, params: dict = {}): def _instance(self, endpoint, params: dict = {}):
response = self.session.get( response = self.session.get(
url=API_URL + endpoint, url=API_URL + endpoint,
headers={ headers={"Content-Type": "application/json"},
"Content-Type": "application/json" params={"format": "json", **params},
},
params={
"format": "json",
**params
}
) )
return response.json() return response.json()
@ -43,9 +33,7 @@ class BPIekApi:
try: try:
result: models.ParentCategoriesResponse = ( result: models.ParentCategoriesResponse = (
models models.ParentCategoriesResponse.model_validate(response)
.ParentCategoriesResponse
.model_validate(response)
) )
return result.categories return result.categories
@ -57,25 +45,23 @@ class BPIekApi:
response = self._instance(f"client/products/{article}") response = self._instance(f"client/products/{article}")
try: try:
result: models.Product = ( result: models.Product = models.Product.model_validate(response)
models
.Product
.model_validate(response)
)
return result return result
except Exception as e: except Exception as e:
return models.Error(code=400, message=str(e)) return models.Error(code=400, message=str(e))
def get_categories_and_products_by_slug_parent_category(self, slug) -> models.CategoriesAndProductsBySlugParentCategory | models.Error: def get_categories_and_products_by_slug_parent_category(
self, slug
) -> models.CategoriesAndProductsBySlugParentCategory | models.Error:
response = self._instance(f"client/category/{slug}/json") response = self._instance(f"client/category/{slug}/json")
try: try:
result: models.CategoriesAndProductsBySlugParentCategory = ( result: models.CategoriesAndProductsBySlugParentCategory = (
models models.CategoriesAndProductsBySlugParentCategory.model_validate(
.CategoriesAndProductsBySlugParentCategory response
.model_validate(response) )
) )
return result return result
@ -88,20 +74,16 @@ class BPIekApi:
sortBy: str = "article", sortBy: str = "article",
sortOrder: str = "asc", sortOrder: str = "asc",
pageSize: int = 10, pageSize: int = 10,
page: int = 1 page: int = 1,
) -> models.NewProductsResponse | models.Error: ) -> models.NewProductsResponse | models.Error:
response = self._instance("new-products", { response = self._instance(
sortBy: sortBy, "new-products",
sortOrder: sortOrder, {sortBy: sortBy, sortOrder: sortOrder, pageSize: pageSize, page: page},
pageSize: pageSize, )
page: page
})
try: try:
result: models.NewProductsResponse = ( result: models.NewProductsResponse = (
models models.NewProductsResponse.model_validate(response)
.NewProductsResponse
.model_validate(response)
) )
return result return result
@ -109,14 +91,14 @@ class BPIekApi:
except Exception as e: except Exception as e:
return models.Error(code=400, message=str(e)) return models.Error(code=400, message=str(e))
def get_remains_and_planresidues(self, slug) -> models.RemainsAndPlanresiduesResponse | models.Error: def get_remains_and_planresidues(
self, slug
) -> models.RemainsAndPlanresiduesResponse | models.Error:
response = self._instance(f"client/category/{slug}/balances-json") response = self._instance(f"client/category/{slug}/balances-json")
try: try:
result: models.RemainsAndPlanresiduesResponse = ( result: models.RemainsAndPlanresiduesResponse = (
models models.RemainsAndPlanresiduesResponse.model_validate(response)
.RemainsAndPlanresiduesResponse
.model_validate(response)
) )
return result return result

View File

@ -3,12 +3,12 @@ from pydantic import BaseModel, ConfigDict, Field
from pydantic.types import UUID1 from pydantic.types import UUID1
class Category(BaseModel): class Category(BaseModel):
slug: str # Слаг категории slug: str # Слаг категории
name: str # Название категории name: str # Название категории
url: str # Относительный адрес категории url: str # Относительный адрес категории
apiUrl: str # Ссылка на скачивание файла с содержимым категории apiUrl: str # Ссылка на скачивание файла с содержимым категории
class ProductShort(BaseModel): class ProductShort(BaseModel):
class WarehouseData(BaseModel): class WarehouseData(BaseModel):
@ -16,55 +16,53 @@ class ProductShort(BaseModel):
dateBegan: str | None dateBegan: str | None
dateEnd: str | None dateEnd: str | None
amount: int amount: int
type: str # Enum: "production" "shipping" Тип поступления, production - поступление после производства, shipping - доставка на склад type: str # Enum: "production" "shipping" Тип поступления, production - поступление после производства, shipping - доставка на склад
warehouseId: UUID1 warehouseId: UUID1
warehouseName: str warehouseName: str
availableAmount: int availableAmount: int
incoming: list[Incoming] incoming: list[Incoming]
article: str # Артикул товара
article: str # Артикул товара name: str # Полное наименование товара
name: str # Полное наименование товара multiplicity: int | None # Кратность продажи
multiplicity: int | None # Кратность продажи priceBase: float | None # Базовая цена с НДС
priceBase: float | None # Базовая цена с НДС priceRrc: float | None # Рекомендованная розничная цена (РРЦ) с НДС
priceRrc: float | None # Рекомендованная розничная цена (РРЦ) с НДС available: int | None # Значение остатка
available: int | None # Значение остатка units: str | None # Единицы измерения
units: str | None # Единицы измерения
warehouseData: list[WarehouseData] warehouseData: list[WarehouseData]
class Product(ProductShort): class Product(ProductShort):
class ImageVariant(BaseModel): class ImageVariant(BaseModel):
url: str # Ссылка url: str # Ссылка
ext: str # Расширение ext: str # Расширение
width: int # Ширина width: int # Ширина
class Etim(BaseModel): class Etim(BaseModel):
class EtimClass(BaseModel): class EtimClass(BaseModel):
id: str id: str
name: str # Название класса name: str # Название класса
class EtimFeatures(BaseModel): class EtimFeatures(BaseModel):
id: str id: str
name: str # Название свойства name: str # Название свойства
sort: int | None # Порядок сортировки по умолчанию sort: int | None # Порядок сортировки по умолчанию
unit: str | None # Единицы измерения unit: str | None # Единицы измерения
value: str # Значение свойства value: str # Значение свойства
value_union: str # Код значения value_union: str # Код значения
etim_class: EtimClass = Field(alias="class") etim_class: EtimClass = Field(alias="class")
features: list[EtimFeatures] features: list[EtimFeatures]
class Complects(BaseModel): class Complects(BaseModel):
article: str # Артикул article: str # Артикул
name: str # Наименование name: str # Наименование
quantity: int # Количество quantity: int # Количество
class LeftPeriod(BaseModel): class LeftPeriod(BaseModel):
name: str # Название характеристики name: str # Название характеристики
value: str # Значение характеристики value: str # Значение характеристики
class LeftPeriodRaw(BaseModel): class LeftPeriodRaw(BaseModel):
class Lifespan(BaseModel): class Lifespan(BaseModel):
@ -101,11 +99,10 @@ class Product(ProductShort):
description: str description: str
class Videos(BaseModel): class Videos(BaseModel):
name: str name: str
description: str description: str
url: str url: str
type: str # Enum: "url" "file" type: str # Enum: "url" "file"
class Software(BaseModel): class Software(BaseModel):
name: str name: str
@ -113,54 +110,51 @@ class Product(ProductShort):
url: str url: str
size: str size: str
shortName: str # Краткое название
description: str | None # Описание
categoryName: str | None # Название категории
shortName: str # Краткое название category: str # Относительный путь до категории в каталоге
description: str | None # Описание slug: str # Слаг товара
categoryName: str | None # Название категории tm: str # Торговая марка
category: str # Относительный путь до категории в каталоге url: str # Ссылка на товар
slug: str # Слаг товара isArchived: bool # Архивный или нет
tm: str # Торговая марка imageUrl: str # Фото товара (основное)
url: str # Ссылка на товар imageUrls: list[str] # Все фото товара
isArchived: bool # Архивный или нет imageVariants: list[ImageVariant] # Все вариации изображений
imageUrl: str # Фото товара (основное) advantages: str | None # Преимущества
imageUrls: list[str] # Все фото товара etim: Etim # EIM характеристики товара
imageVariants: list[ImageVariant] # Все вариации изображений complects: list[Complects] # Комплектация и сопутствующие товары
advantages: str | None # Преимущества complectations: str | None # Комплектация
etim: Etim # EIM характеристики товара files: list[Any] # Список файлов, относящихся к товару (ГЧ, КД, CAD-модели и т.д.)
complects: list[Complects] # Комплектация и сопутствующие товары leftPeriod: list[LeftPeriod] | None # Характеристики срока службы
complectations: str | None # Комплектация leftPeriodRaw: LeftPeriodRaw # Гарантийные показатели
files: list[Any] # Список файлов, относящихся к товару (ГЧ, КД, CAD-модели и т.д.) logisticParams: list[LogisticParams] # Логистические характеристики
leftPeriod: list[LeftPeriod] | None # Характеристики срока службы logisticParamsData: (
leftPeriodRaw: LeftPeriodRaw # Гарантийные показатели LogisticParamsData | None
logisticParams: list[LogisticParams] # Логистические характеристики ) # Подробные логистические характеристики
logisticParamsData: LogisticParamsData | None # Подробные логистические характеристики novelty: bool # Новинка или нет
novelty: bool # Новинка или нет designFeatures: list[DesignFeatures] # Отличительные особенности
designFeatures: list[DesignFeatures] # Отличительные особенности videos: list[Videos] # Видео по товару
videos: list[Videos] # Видео по товару software: list[Software] # ПО по товару
software: list[Software] # ПО по товару banner: str | None # Текст баннера
banner: str | None # Текст баннера lastModified: str | None # Дата последнего изменения
lastModified: str | None # Дата последнего изменения countryOfProduction: str | None # Страна производства
countryOfProduction: str | None # Страна производства firstSaleDate: str | None # Дата начала продаж
firstSaleDate: str | None # Дата начала продаж feacn: str | None # Код ТН ВЭД
feacn: str | None # Код ТН ВЭД
family: str | Any | None family: str | Any | None
series: str | Any | None series: str | Any | None
indPacking: list[str] # Ссылки на фото упаковки indPacking: list[str] # Ссылки на фото упаковки
analogs: list["Product"] # Аналоги analogs: list["Product"] # Аналоги
related: list["Product"] # Совместно применяемые изделия related: list["Product"] # Совместно применяемые изделия
qrCode: str | None = Field(default=None) qrCode: str | None = Field(default=None)
isOutOfAssortment: bool isOutOfAssortment: bool
isOutOfProduction: bool isOutOfProduction: bool
class ParentCategoriesResponse(BaseModel): class ParentCategoriesResponse(BaseModel):
categories: list[Category] categories: list[Category]
class CategoriesAndProductsBySlugParentCategory(BaseModel): class CategoriesAndProductsBySlugParentCategory(BaseModel):
date: str date: str
slug: str slug: str
@ -169,6 +163,7 @@ class CategoriesAndProductsBySlugParentCategory(BaseModel):
categories: list[Category] categories: list[Category]
products: list[Product] products: list[Product]
class NewProductsResponse(BaseModel): class NewProductsResponse(BaseModel):
class Data(BaseModel): class Data(BaseModel):
products: list[Product] products: list[Product]
@ -182,6 +177,7 @@ class NewProductsResponse(BaseModel):
data: Data data: Data
_meta: Meta _meta: Meta
class RemainsAndPlanresiduesResponse(BaseModel): class RemainsAndPlanresiduesResponse(BaseModel):
date: str date: str
products: list[ProductShort] products: list[ProductShort]

View File

@ -8,7 +8,6 @@ readme = "README.md"
[tool.poetry.dependencies] [tool.poetry.dependencies]
python = "^3.12" python = "^3.12"
requests = "^2.32.3" requests = "^2.32.3"
loguru = "^0.7.2"
pydantic = "^2.7.4" pydantic = "^2.7.4"