Убрал лишние иморты и библиотеки из pyproject.toml
This commit is contained in:
parent
6d5a19c3b0
commit
7c66c6ccbc
64
bpiek/api.py
64
bpiek/api.py
|
@ -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
|
||||||
|
|
136
bpiek/models.py
136
bpiek/models.py
|
@ -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]
|
||||||
|
|
|
@ -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"
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user