ozonapi-async 0.1.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- ozonapi/__init__.py +9 -0
- ozonapi/seller/__init__.py +29 -0
- ozonapi/seller/common/__init__.py +0 -0
- ozonapi/seller/common/enumerations/__init__.py +0 -0
- ozonapi/seller/common/enumerations/delivery.py +16 -0
- ozonapi/seller/common/enumerations/localization.py +39 -0
- ozonapi/seller/common/enumerations/postings.py +205 -0
- ozonapi/seller/common/enumerations/products.py +225 -0
- ozonapi/seller/common/enumerations/requests.py +26 -0
- ozonapi/seller/common/enumerations/warehouses.py +54 -0
- ozonapi/seller/core/__init__.py +14 -0
- ozonapi/seller/core/config.py +88 -0
- ozonapi/seller/core/core.py +404 -0
- ozonapi/seller/core/exceptions.py +32 -0
- ozonapi/seller/core/method_rate_limiter.py +199 -0
- ozonapi/seller/core/rate_limiter.py +174 -0
- ozonapi/seller/core/sessions.py +75 -0
- ozonapi/seller/methods/__init__.py +15 -0
- ozonapi/seller/methods/attributes_and_characteristics.py +177 -0
- ozonapi/seller/methods/barcodes.py +84 -0
- ozonapi/seller/methods/fbs.py +69 -0
- ozonapi/seller/methods/prices_and_stocks.py +147 -0
- ozonapi/seller/methods/products.py +673 -0
- ozonapi/seller/methods/warehouses.py +80 -0
- ozonapi/seller/schemas/__init__.py +0 -0
- ozonapi/seller/schemas/attributes_and_characteristics/__init__.py +21 -0
- ozonapi/seller/schemas/attributes_and_characteristics/base.py +52 -0
- ozonapi/seller/schemas/attributes_and_characteristics/v1__description_category_attribute.py +108 -0
- ozonapi/seller/schemas/attributes_and_characteristics/v1__description_category_attribute_values.py +38 -0
- ozonapi/seller/schemas/attributes_and_characteristics/v1__description_category_attribute_values_search.py +36 -0
- ozonapi/seller/schemas/attributes_and_characteristics/v1__description_category_tree.py +61 -0
- ozonapi/seller/schemas/barcodes/__init__.py +12 -0
- ozonapi/seller/schemas/barcodes/v1__barcode_add.py +66 -0
- ozonapi/seller/schemas/barcodes/v1__barcode_generate.py +46 -0
- ozonapi/seller/schemas/base.py +94 -0
- ozonapi/seller/schemas/fbs/__init__.py +9 -0
- ozonapi/seller/schemas/fbs/v3__posting_fbs_unfulfilled_list.py +764 -0
- ozonapi/seller/schemas/prices_and_stocks/__init__.py +16 -0
- ozonapi/seller/schemas/prices_and_stocks/base.py +26 -0
- ozonapi/seller/schemas/prices_and_stocks/v1__product_info_stocks_by_warehouse_fbs.py +55 -0
- ozonapi/seller/schemas/prices_and_stocks/v4__product_info_stocks.py +113 -0
- ozonapi/seller/schemas/prices_and_stocks/v5__product_info_prices.py +292 -0
- ozonapi/seller/schemas/products/__init__.py +51 -0
- ozonapi/seller/schemas/products/base.py +162 -0
- ozonapi/seller/schemas/products/v1__product_archive.py +20 -0
- ozonapi/seller/schemas/products/v1__product_attributes_update.py +79 -0
- ozonapi/seller/schemas/products/v1__product_import_by_sku.py +71 -0
- ozonapi/seller/schemas/products/v1__product_import_info.py +103 -0
- ozonapi/seller/schemas/products/v1__product_info_subscription.py +39 -0
- ozonapi/seller/schemas/products/v1__product_rating_by_sku.py +116 -0
- ozonapi/seller/schemas/products/v1__product_related_sku_get.py +81 -0
- ozonapi/seller/schemas/products/v1__product_unarchive.py +20 -0
- ozonapi/seller/schemas/products/v1__product_update_offer_id.py +52 -0
- ozonapi/seller/schemas/products/v2__product_pictures_info.py +73 -0
- ozonapi/seller/schemas/products/v2__products_delete.py +57 -0
- ozonapi/seller/schemas/products/v3__product_import.py +142 -0
- ozonapi/seller/schemas/products/v3__product_info_list.py +482 -0
- ozonapi/seller/schemas/products/v3__product_list.py +107 -0
- ozonapi/seller/schemas/products/v4__product_info_attributes.py +137 -0
- ozonapi/seller/schemas/warehouses/__init__.py +11 -0
- ozonapi/seller/schemas/warehouses/v1__delivery_method_list.py +95 -0
- ozonapi/seller/schemas/warehouses/v1__warehouse_list.py +109 -0
- ozonapi_async-0.1.0.dist-info/METADATA +648 -0
- ozonapi_async-0.1.0.dist-info/RECORD +67 -0
- ozonapi_async-0.1.0.dist-info/WHEEL +5 -0
- ozonapi_async-0.1.0.dist-info/licenses/LICENSE +21 -0
- ozonapi_async-0.1.0.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
from ..core import APIManager
|
|
2
|
+
from ..core.method_rate_limiter import method_rate_limit
|
|
3
|
+
from ..schemas.barcodes import BarcodeGenerateRequest, BarcodeGenerateResponse
|
|
4
|
+
from ..schemas.barcodes import BarcodeAddRequest, BarcodeAddResponse
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class SellerBarcodeAPI(APIManager):
|
|
8
|
+
"""Реализует методы раздела Штрихкоды товаров.
|
|
9
|
+
|
|
10
|
+
References:
|
|
11
|
+
https://docs.ozon.ru/api/seller/#tag/BarcodeAPI
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
@method_rate_limit(limit_requests=20, interval_seconds=60)
|
|
15
|
+
async def barcode_add(
|
|
16
|
+
self: "SellerBarcodeAPI",
|
|
17
|
+
request: BarcodeAddRequest
|
|
18
|
+
) -> BarcodeAddResponse:
|
|
19
|
+
"""Если у товара есть штрихкод, который не указан в системе Ozon, привяжите его с помощью этого метода.
|
|
20
|
+
Если штрихкода нет, вы можете создать его через метод `barcode_generate()`.
|
|
21
|
+
|
|
22
|
+
Notes:
|
|
23
|
+
• За один запрос вы можете назначить штрихкод не больше чем на `100` товаров.
|
|
24
|
+
• На одном товаре может быть до `100` штрихкодов.
|
|
25
|
+
• С одного аккаунта продавца можно использовать метод не больше `20` раз в минуту.
|
|
26
|
+
|
|
27
|
+
References:
|
|
28
|
+
https://docs.ozon.ru/api/seller/#operation/add-barcode
|
|
29
|
+
|
|
30
|
+
Args:
|
|
31
|
+
request: Данные для добавления штрих-кодов по схеме `BarcodeAddRequest`
|
|
32
|
+
|
|
33
|
+
Returns:
|
|
34
|
+
Ответ с результатом добавления штрих-кодов по схеме `BarcodeAddResponse`
|
|
35
|
+
|
|
36
|
+
Example:
|
|
37
|
+
async with SellerAPI(client_id, api_key) as api:
|
|
38
|
+
barcodes = [BarcodeAddItem.model_validate({"barcode": "4321012345678", "sku": 0}), ]
|
|
39
|
+
|
|
40
|
+
result = await api.barcode_add(BarcodeAddRequest(barcodes=barcodes))
|
|
41
|
+
"""
|
|
42
|
+
response = await self._request(
|
|
43
|
+
method="post",
|
|
44
|
+
api_version="v1",
|
|
45
|
+
endpoint="barcode/add",
|
|
46
|
+
json=request.model_dump(),
|
|
47
|
+
)
|
|
48
|
+
return BarcodeAddResponse(**response)
|
|
49
|
+
|
|
50
|
+
async def barcode_generate(
|
|
51
|
+
self: "SellerBarcodeAPI",
|
|
52
|
+
request: BarcodeGenerateRequest,
|
|
53
|
+
) -> BarcodeGenerateResponse:
|
|
54
|
+
"""Если у товара нет штрихкода, вы можете создать его с помощью этого метода.
|
|
55
|
+
Если штрихкод уже есть, но он не указан в системе Ozon, вы можете привязать его через метод `barcode_add()`.
|
|
56
|
+
|
|
57
|
+
Notes:
|
|
58
|
+
• За один запрос вы можете создать штрихкоды не больше чем для `100` товаров.
|
|
59
|
+
• С одного аккаунта продавца можно использовать метод не больше `20` раз в минуту.
|
|
60
|
+
|
|
61
|
+
References:
|
|
62
|
+
https://docs.ozon.ru/api/seller/#operation/generate-barcode
|
|
63
|
+
|
|
64
|
+
Args:
|
|
65
|
+
request: Массив с product_id для создания штрих-кодов по схеме `BarcodeGenerateRequest`
|
|
66
|
+
|
|
67
|
+
Returns:
|
|
68
|
+
Массив с описанием ошибок при создании штрихкодов по схеме `BarcodeGenerateResponse`
|
|
69
|
+
|
|
70
|
+
Example:
|
|
71
|
+
async with SellerAPI(client_id, api_key) as api:
|
|
72
|
+
result = await api.barcode_generate(
|
|
73
|
+
BarcodeGenerateRequest(
|
|
74
|
+
product_ids=[12345, 67890, ]
|
|
75
|
+
)
|
|
76
|
+
)
|
|
77
|
+
"""
|
|
78
|
+
response = await self._request(
|
|
79
|
+
method="post",
|
|
80
|
+
api_version="v1",
|
|
81
|
+
endpoint="barcode/generate",
|
|
82
|
+
json=request.model_dump(),
|
|
83
|
+
)
|
|
84
|
+
return BarcodeGenerateResponse(**response)
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
from ..core import APIManager
|
|
2
|
+
from ..schemas.fbs import PostingFBSUnfulfilledListRequest, PostingFBSUnfulfilledListResponse
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
class SellerFBSAPI(APIManager):
|
|
6
|
+
"""Реализует методы раздела Обработка заказов FBS и rFBS.
|
|
7
|
+
|
|
8
|
+
References:
|
|
9
|
+
https://docs.ozon.ru/api/seller/?__rr=1#tag/FBS
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
async def posting_fbs_unfulfilled_list(
|
|
13
|
+
self: "SellerFBSAPI",
|
|
14
|
+
request: PostingFBSUnfulfilledListRequest
|
|
15
|
+
) -> PostingFBSUnfulfilledListResponse:
|
|
16
|
+
"""Метод для получения списка необработанных отправлений за указанный период времени.
|
|
17
|
+
|
|
18
|
+
Notes:
|
|
19
|
+
• Период должен быть не больше одного года.
|
|
20
|
+
• Обязательно используйте фильтр либо по времени сборки — `cutoff`, либо по дате передачи отправления в доставку — `delivering_date`.
|
|
21
|
+
• Если использовать фильтры `cutoff` и `delivering_date` вместе, в ответе вернётся ошибка.
|
|
22
|
+
• Чтобы использовать фильтр по времени сборки, заполните поля `cutoff_from` и `cutoff_to`.
|
|
23
|
+
• Чтобы использовать фильтр по дате передачи отправления в доставку, заполните поля `delivering_date_from` и `delivering_date_to`.
|
|
24
|
+
• Для пагинации используйте `offset`.
|
|
25
|
+
|
|
26
|
+
References:
|
|
27
|
+
https://docs.ozon.ru/api/seller/#tag/FBS
|
|
28
|
+
|
|
29
|
+
Args:
|
|
30
|
+
request: Запрос на получение информации о необработанных отправлениях FBS и rFBS за указанный период времени по схеме `PostingFBSUnfulfilledListRequest`
|
|
31
|
+
|
|
32
|
+
Returns:
|
|
33
|
+
Список необработанных отправлений за указанный период времени по схеме `PostingFBSUnfulfilledListResponse`
|
|
34
|
+
|
|
35
|
+
Example:
|
|
36
|
+
async with SellerAPI(client_id, api_key) as api:
|
|
37
|
+
# noinspection PyArgumentList
|
|
38
|
+
|
|
39
|
+
result = await api.posting_fbs_unfulfilled_list(
|
|
40
|
+
PostingFBSUnfulfilledListRequest(
|
|
41
|
+
filter=PostingFBSUnfulfilledListFilter(
|
|
42
|
+
cutoff_from=None,
|
|
43
|
+
cutoff_to=None,
|
|
44
|
+
delivering_date_from=datetime.datetime.now() - datetime.timedelta(days=30),
|
|
45
|
+
delivering_date_to=datetime.datetime.now(),
|
|
46
|
+
delivery_method_id=[],
|
|
47
|
+
is_quantum=False,
|
|
48
|
+
provider_id=[],
|
|
49
|
+
status=None,
|
|
50
|
+
warehouse_id=[],
|
|
51
|
+
last_changed_status_date=None
|
|
52
|
+
),
|
|
53
|
+
dir=SortingDirection.DESC,
|
|
54
|
+
limit=10,
|
|
55
|
+
offset=0,
|
|
56
|
+
with_=PostingFBSUnfulfilledListFilterWith(
|
|
57
|
+
barcodes=True,
|
|
58
|
+
financial_data=True
|
|
59
|
+
)
|
|
60
|
+
)
|
|
61
|
+
)
|
|
62
|
+
"""
|
|
63
|
+
response = await self._request(
|
|
64
|
+
method="post",
|
|
65
|
+
api_version="v3",
|
|
66
|
+
endpoint="posting/fbs/unfulfilled/list",
|
|
67
|
+
json=request.model_dump(by_alias=True)
|
|
68
|
+
)
|
|
69
|
+
return PostingFBSUnfulfilledListResponse(**response)
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
from ..core import APIManager
|
|
2
|
+
|
|
3
|
+
from ..schemas.prices_and_stocks import (
|
|
4
|
+
ProductInfoPricesRequest,
|
|
5
|
+
ProductInfoPricesResponse,
|
|
6
|
+
ProductInfoStocksRequest,
|
|
7
|
+
ProductInfoStocksResponse,
|
|
8
|
+
ProductInfoStocksByWarehouseFBSRequest,
|
|
9
|
+
ProductInfoStocksByWarehouseFBSResponse,
|
|
10
|
+
)
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class SellerPricesAndStocksAPI(APIManager):
|
|
14
|
+
"""Реализует методы раздела Цены и остатки товаров.
|
|
15
|
+
|
|
16
|
+
References:
|
|
17
|
+
https://docs.ozon.ru/api/seller/#tag/PricesandStocksAPI
|
|
18
|
+
"""
|
|
19
|
+
|
|
20
|
+
async def product_info_prices(
|
|
21
|
+
self: "SellerPricesAndStocksAPI",
|
|
22
|
+
request: ProductInfoPricesRequest = ProductInfoPricesRequest.model_construct(),
|
|
23
|
+
) -> ProductInfoPricesResponse:
|
|
24
|
+
"""Метод для получения информации о ценах и комиссиях товаров по их идентификаторам.
|
|
25
|
+
|
|
26
|
+
Notes:
|
|
27
|
+
• Можно вообще ничего не передавать - выберет всё по максимальному лимиту.
|
|
28
|
+
• Можно передавать до `1000` значений суммарно по `offer_id` и `product_id` или не передавать их вовсе, чтобы выбрать всё.
|
|
29
|
+
• Максимум `1000` товаров на страницу, если не заданы `offer_id` и `product_id`.
|
|
30
|
+
• Для пагинации используйте `cursor` из ответа, передав его в следующий запрос.
|
|
31
|
+
|
|
32
|
+
References:
|
|
33
|
+
https://docs.ozon.ru/api/seller/#operation/ProductAPI_GetProductInfoPrices
|
|
34
|
+
|
|
35
|
+
Args:
|
|
36
|
+
request: Содержит товарные идентификаторы для получения информации о ценах и комиссиях по схеме `ProductInfoPricesRequest`
|
|
37
|
+
|
|
38
|
+
Returns:
|
|
39
|
+
Ответ с информацией о ценах и комиссиях по схеме `ProductInfoPricesResponse`
|
|
40
|
+
|
|
41
|
+
Example:
|
|
42
|
+
Базовый запрос:
|
|
43
|
+
async with SellerAPI(client_id, api_key) as api:
|
|
44
|
+
result = await api.product_info_prices()
|
|
45
|
+
|
|
46
|
+
Запрос с настройками выборки:
|
|
47
|
+
async with SellerAPI(client_id, api_key) as api:
|
|
48
|
+
result = await api.product_info_prices(
|
|
49
|
+
ProductInfoPricesRequest(
|
|
50
|
+
cursor="",
|
|
51
|
+
filter=ProductInfoPricesFilter(
|
|
52
|
+
offer_id=[],
|
|
53
|
+
product_id=[],
|
|
54
|
+
visibility = Visibility.VISIBLE,
|
|
55
|
+
),
|
|
56
|
+
limit=100
|
|
57
|
+
)
|
|
58
|
+
)
|
|
59
|
+
"""
|
|
60
|
+
response = await self._request(
|
|
61
|
+
method="post",
|
|
62
|
+
api_version="v5",
|
|
63
|
+
endpoint="product/info/prices",
|
|
64
|
+
json=request.model_dump(),
|
|
65
|
+
)
|
|
66
|
+
return ProductInfoPricesResponse(**response)
|
|
67
|
+
|
|
68
|
+
async def product_info_stocks(
|
|
69
|
+
self: "SellerPricesAndStocksAPI",
|
|
70
|
+
request: ProductInfoStocksRequest = ProductInfoStocksRequest.model_construct()
|
|
71
|
+
) -> ProductInfoStocksResponse:
|
|
72
|
+
"""Метод для получения информации о количестве общих складских остатков и зарезервированном количестве для схем FBS и rFBS по товарным идентификаторам.
|
|
73
|
+
Чтобы получить информацию об остатках по схеме FBO, используйте метод `analytics_stocks()`.
|
|
74
|
+
|
|
75
|
+
Notes:
|
|
76
|
+
• Можно использовать без параметров - выберет всё по максимальному лимиту.
|
|
77
|
+
• Можно передавать до `1000` значений суммарно по `offer_id` и `product_id` или не передавать их вовсе, чтобы выбрать всё.
|
|
78
|
+
• Максимум `1000` товаров на страницу, если не заданы `offer_id` и `product_id`.
|
|
79
|
+
• Для пагинации передайте полученный `cursor` в следующий запрос.
|
|
80
|
+
|
|
81
|
+
References:
|
|
82
|
+
https://docs.ozon.ru/api/seller/#operation/ProductAPI_GetProductInfoStocks
|
|
83
|
+
|
|
84
|
+
Args:
|
|
85
|
+
request: Данные для получения информации об общих остатках FBS и rFBS по схеме `ProductInfoStocksRequest`
|
|
86
|
+
|
|
87
|
+
Returns:
|
|
88
|
+
Ответ с информацией об общих остатках FBS и rFBS по схеме `ProductInfoStocksResponse`
|
|
89
|
+
|
|
90
|
+
Examples:
|
|
91
|
+
Базовый запрос:
|
|
92
|
+
async with SellerAPI(client_id, api_key) as api:
|
|
93
|
+
result = await api.product_info_stocks()
|
|
94
|
+
|
|
95
|
+
Запрос с настройками выборки (товары не в наличии):
|
|
96
|
+
async with SellerAPI(client_id, api_key) as api:
|
|
97
|
+
result = await api.product_info_stocks(
|
|
98
|
+
ProductInfoStocksRequest(
|
|
99
|
+
cursor="",
|
|
100
|
+
filter=ProductInfoStocksFilter(
|
|
101
|
+
offer_id=[],
|
|
102
|
+
product_id=[],
|
|
103
|
+
visibility = Visibility.EMPTY_STOCK,
|
|
104
|
+
with_quants=None
|
|
105
|
+
),
|
|
106
|
+
limit=100
|
|
107
|
+
)
|
|
108
|
+
)
|
|
109
|
+
"""
|
|
110
|
+
response = await self._request(
|
|
111
|
+
method="post",
|
|
112
|
+
api_version="v4",
|
|
113
|
+
endpoint="product/info/stocks",
|
|
114
|
+
json=request.model_dump(),
|
|
115
|
+
)
|
|
116
|
+
return ProductInfoStocksResponse(**response)
|
|
117
|
+
|
|
118
|
+
async def product_info_stocks_by_warehouse_fbs(
|
|
119
|
+
self: "SellerPricesAndStocksAPI",
|
|
120
|
+
request: ProductInfoStocksByWarehouseFBSRequest
|
|
121
|
+
) -> ProductInfoStocksByWarehouseFBSResponse:
|
|
122
|
+
"""Метод для получения информации о складских остатках и зарезервированном кол-ве в разбивке по складам продавца (FBS и rFBS) по SKU.
|
|
123
|
+
|
|
124
|
+
References:
|
|
125
|
+
https://docs.ozon.ru/api/seller/#operation/ProductAPI_ProductStocksByWarehouseFbs
|
|
126
|
+
|
|
127
|
+
Args:
|
|
128
|
+
request: Список SKU для получения информации о товарах о складских остатках и зарезервированном кол-ве в разбивке по складам продавца (FBS и rFBS) по схеме `ProductInfoStocksByWarehouseFBSRequest`
|
|
129
|
+
|
|
130
|
+
Returns:
|
|
131
|
+
Ответ с информацией о складских остатках и зарезервированном кол-ве в разбивке по складам продавца (FBS и rFBS) по схеме `ProductInfoStocksByWarehouseFBSResponse`
|
|
132
|
+
|
|
133
|
+
Example:
|
|
134
|
+
async with SellerAPI(client_id, api_key) as api:
|
|
135
|
+
result = await api.product_info_stocks_by_warehouse_fbs(
|
|
136
|
+
ProductInfoStocksByWarehouseFBSRequest(
|
|
137
|
+
sku=[9876543210, ]
|
|
138
|
+
)
|
|
139
|
+
)
|
|
140
|
+
"""
|
|
141
|
+
response = await self._request(
|
|
142
|
+
method="post",
|
|
143
|
+
api_version="v1",
|
|
144
|
+
endpoint="product/info/stocks-by-warehouse/fbs",
|
|
145
|
+
json=request.model_dump(),
|
|
146
|
+
)
|
|
147
|
+
return ProductInfoStocksByWarehouseFBSResponse(**response)
|