# 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.

## `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/`

```python

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.

```json

{
"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/`

```python
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.

```json
{
    "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}/`

```python
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.

```json
{
    "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**

*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.

```json
{
    "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.

<figure><img src="https://694447771-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FVufPVrRNtGmK1TUsnRU3%2Fuploads%2FwGGhHL4SjQxuxO4S0xv1%2Fimage.png?alt=media&#x26;token=860abc84-147d-4083-89d8-ff7c1e267c10" alt=""><figcaption></figcaption></figure>

**Service(omnitron.catalogs.service.StockListService)**

`create_stock_list`: A development has been made to ensure that if is\_auto\_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.channel`*`id`* . 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.
