Price List
The name of product prices is ProductPrice. PriceList is used to create multiple lists to link to channels and similar operations. On the Shop side, when linked to the channel, the price list continues to flow without a PriceList defined in that section.
The description above is valid for the conventional loop. Multiple PriceList & StockList developments allow for the definition of multiple price lists on the basis of RetailStore.
The concept of extra price list is created to add PriceList in multiple ways. Thanks to this structure linked to the catalogs, the linked extra_price_list
and ProductPrice
values are sent to the shop that is matched with the relevant catalog.
Model(omnitron.catalogs.models.PriceList)
name = models.CharField(max_length=64, unique=True)
code = models.CharField(max_length=64, null=True, blank=True, unique=True)
is_auto_sync = models.BooleanField(default=False)
currency = EnumField(CurrencyType)
The model structure is specified above. There are also different validations with certain developments. For instance, the create_price_list
section in Service.
Filter(omnitron.catalogs.resources.filters.PriceListFilter)
It serves to filter the data registered in the system with certain features. Filtering is available for each model and field that is linked to the PriceList
model. The filter list is as follows:
{
`lookups= ['gt', 'gte', 'lt', 'lte','date__gt', 'date__gte','date__lt', 'date__lte']`
}
ViewSet(omnitron.catalogs.resources.views.PriceListViewSet)
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_price_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 no code is defined, this raises the exception product_price_300_2
(PriceListCodeRequiredException). Django rest's status codes and exceptions are returned because another rest is used.
Example Requests & Responses
GET
Price List
Sample HTTP request to get all price lists from the system.
‘content_type’ header represents the response type.
The ‘Authorization’ header is required for authentication. You can retrieve api_token
by logging in.
Request
Path: /api/v1/price_list
import requests
url = "https://{customer_api_url}/api/v1/price_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
{
"count": 1,
"next": null,
"previous": null,
"results": [
{
"pk": 1,
"name": "default_price_list",
"code": "default_price_list",
"is_auto_sync": true,
"modified_date": "2017-01-22T12:14:44.637000Z",
"created_date": "2017-01-22T12:14:44.637000Z",
"currency": "try"
}
]
}
POST
Create Price List
Records new objects in the PriceList
table. The PriceListSerializer
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. You can retrieve api_token
by logging in.
Request
Path: /api/v1/price_list/
import requests
url = "https://{customer_api_url}/api/v1/price_list/"
api_token = "API TOKEN"
headers = {
'content-type': 'application/json',
'Authorization': 'Token {}'.format(api_token)
}
data = {
"name": "Test List",
"code": "test_list",
"is_auto_sync": True
}
response = requests.post(url, headers=headers, data=data)
print(response.text)
Response
{
"pk": 2,
"name": "Test List",
"code": "test_list",
"is_auto_sync": true,
"modified_date": "2021-02-18T11:55:03.741159Z",
"created_date": "2021-02-18T11:55:03.741139Z",
"Currency": "try"
}
PATCH
Update Price List
Update the object specified with the primary key in the PriceList
table.
‘content_type’ header represents the response type.
The ‘Authorization’ header is required for authentication. You can retrieve api_token
by logging in.
Request
Path: /api/v1/price_list/{PK}/
import requests
url = "https://{customer_api_url}/api/v1/price_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
{
"pk": 2,
"name": "Test List Updated",
"code": "test_list",
"is_auto_sync": true,
"currency": "try"
"modified_date": "2021-02-18T12:02:40.890103Z",
"created_date": "2021-02-18T11:55:03.741139Z"
}
POST
Bulk Upsert Price List
Sample HTTP post request to create multiple price lists at once. Make sure you have an acceptable dataset and file.
Request
Path: /api/v1/price_list/{PK}/excel_import/
csv file should contain the following headers and their values:
csv[headers]: product__sku,price, retail_price, price_list, tax_rate
csv[values]: 1, 43.2, 86.4, 1, 18.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
. It should be noted that only 1 cache key is returned in the response.
cache_key: Unique cache key to status lookup.
{
"cache_key":"b6b0828c-34ec-445b-9c06-5ae060ad1029"
}
Check Status with Cache Key
Checking the status of the bulk upsert process with the received cache key.
status: This is representing the process of excel import status and can be waiting, in_progress and completed.
chunk_size: In default, it is set to 100, indicating the number of times the entered line count is divided into 100-sized chunks. For example, if 300 data is entered and the chunk size is 3, it would mean that it was divided into 100-sized chunks three times.
Path: /api/v1/price_list/{CACHE_KEY}/excel_import_status/
Waiting Status:
Completed Status: Bad Response
If there is no valid file, this will raise the exception file_100_1(FileNotFoundException). Django REST's status codes and exceptions are returned because another REST is used.
{
"non_field_errors": "File not found please provide an appropriate file",
"error_code": "file_100_1"
}
Service(omnitron.catalogs.service.PriceListService)
create_price_list:
Improvements have been made to ensure that is_auto_sync
is True in code.
bulk_upsert:
Improvements have been made to add multiple ProductPrices
.
Channel Redirections
As mentioned above, when the relevant PriceList and Channel matching is performed, all ProductPrices linked to the relevant PriceList are sent to the Channels.
For instance;
When inspected, the method at omnitron.channels.integrations.omniweb.integration. Integration.qs__product_price
will show a filter such as price_listcatalogchannel=self.channel_id
. All ProductPrices
in the select query will be sent by accessing the channel through the catalog linked to the PriceList
and matching it with the relevant channel.
Data Source
Just like the principle in Channels, ProductPrices
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.