Skip to main content

Stock List

Stock List consists of product stocks that store the stock information for their related products. As mentioned at “Introduction”, they are used by catalogs.

However, in some cases, a catalog can also contain extra stock lists to switch between them depending on the condition. To give an example, we can consider an app that sells from retail stores by calculating the nearest retail store to the user. In this case, you have to separate stocks by retail stores for a product and you need to use extra stock lists.


Filter(omnitron.catalogs.resources.filters.StockListFilter)

Filter stock lists by their codes, names, created_date etc. via /api/v1/stock_list/.


ViewSet(omnitron.catalogs.resources.views.StockListViewSet)

Its structure allows for Excel import (AsyncExcelImportMixin). A development has been made to create while going to the service. A code has been defined for filtering. async_task = upsert_product_stock_list_task has been defined in order to meet the requirements in AsyncExcelImportMixin. This is a task that allows adding ProductPrice to a PriceList multiple times. The task of upsert_product_list used in this task is to create the relevant object using the cache with the selected object, serializer and service and the data to be created.

If is_auto_sync true and code is not defined, this raises the exception product_stock_400_2(PriceListCodeRequiredException) . Since another rest is used, Django REST’s status codes and exceptions will be returned.


Example Request & Response

GET Stock List

Sample HTTP request to get all stock lists from the system.

‘content_type’ header represents the response type.

The ‘Authorization’ header is required for authentication. Retrieve api_token by logging in.

Request

Path : /api/v1/stock_list/


import requests
url = "https://{customer_api_url}/api/v1/stock_list/"
api_token = "API TOKEN"
headers = {
'content-type': 'application/json',
'Authorization': 'Token {}'.format(api_token)
}
response = requests.get(url, headers=headers)
print(response.text)

Response

Returns all stock lists.


{
"count": 1,
"next": null,
"previous": null,
"results": [
{
"pk": 1,
"name":"default_stock_list",
"code":"default_stock_list",
"is_auto_sync": true,
"modified_date":"2018-01-22T12:12:24.317000Z",
"created_date":"2018-01-22T12:12:24.317000Z"
}]
}

POST Create Stock List

Records new objects in the StockList table. The StockListSerializer class defined at omnitron.catalogs.resources.serializers is used to validate the data.

‘content_type’ header represents the response type.

The ‘Authorization’ header is required for authentication. retrieve api_token by logging in.

Request

Path: /api/v1/stock_list/

import requests

url = "https://{customer_api_url}/api/v1/stock_list/"
api_token = "API TOKEN"

headers = {
'content-type': 'application/json',
'Authorization': 'Token {}'.format(api_token)
}

data = {
"name": "Test List"
}

response = requests.post(url, headers=headers, data=data)
print(response.text)

Response

The response status code will be 201 because a required field is specified.

{
"pk": 2,
"name": "Test List",
"code": null,
"is_auto_sync": true,
"modified_date": "2021-02-19T11:54:13.241159Z",
"created_date": "2021-02-19T11:54:13.241139Z"
}

PATCH Update Stock List

Update the object specified with the primary key in the StockList table.

‘content_type’ header represents the response type.

The ‘Authorization’ header is required for authentication. Retrieve api_token by logging in.

Request

Path: /api/v1/stock_list/{PK}/

import requests

url = "https://{customer_api_url}/api/v1/stock_list/{PK}/"
api_token = "API TOKEN"

headers = {
'content-type': 'application/json',
'Authorization': 'Token {}'.format(api_token)
}

data = {
"name": "Test List Updated"
}


response = requests.patch(url, headers=headers, data=data)
print(response.text)

Response

Response status code will be 200. Updated relevant fields will be returned because the mandatory field is specified.

{
"pk": 2,
"name": "Test List Updated",
"code": null,
"is_auto_sync": true,
"modified_date": "2021-02-19T11:54:13.241159Z",
"created_date": "2021-02-19T11:54:13.241139Z"
}

POST Bulk Create Stock Lists

Sample HTTP post request to create multiple stock lists at once. Make sure you have an acceptable dataset and file.

Request

alt_text

Figure 1: Request

Path: /api/v1/stock_list/{PK}/excel_import/

csv:product__sku,product__name,price_list__name,currency_type,tax_rate,retail_price,price2015227,GANT Man Black Sock,Demo Price List,usd,8.00,,10.00

Response

This is an asynchronous operation and the status of the operation can be followed when it sends a GET request at the endpoint where it will check the status with cache_key.

{
"cache_key":"37c7dad0-1efb-4a44-b10f-a1ac619a25b1"
}

Bad Response

If there is no valid file, this will raise the exception file_100_1(FileNotFoundException). Status codes and exceptions of Django RESTS are returned because another REST is used.

{
"non_field_errors": "File not found please provide an appropriate file",
"error_code": "file_100_1"
}

Check Status with Cache Key

Checking the status of the bulk creation process with the received cache key.

alt_text

Figure 2: Checking Status with Cache Key

Service(omnitron.catalogs.service.StockListService)

create_stock_list: A development has been made to ensure that if isauto_sync _True , located in the code.

bulk_upsert: A development has been made to add multiple ProductStocks.

Channel Redirections

As mentioned above, when the relevant StockList and Channel matching is performed, all ProductStocks linked to the relevant StockList are sent to the Channels.

For instance:

When inspected, the method at `omnitron.channels.integrations.omniweb.integration. Integration.qs__product_stock will show a filter such as _stock_list=catalog channel=self.channelid . All ProductStocks in the select query will be sent by accessing the channel through the catalog linked to the StockList and matching it with the relevant channel.

Data Source

With a similar principle to Channels; Products and Stocks can be used for DataSource. DataSource is the structure that enables selling between Omnitron and creates an environment like a marketplace. It is done by direct match over the DataSource model.