Configuration-Based Behavior
The Basket API behavior can be customized through various system settings. Below is a comprehensive list of all settings with their configuration methods:
Settings Configuration Methods
Dynamic Settings (Runtime Configurable via Admin Panel): These settings are registered with dj_dynamic_settings
and can be modified at runtime through the admin interface without code deployment:
From omnishop.baskets.settings.conf
:
✅
BASKET_MAX_ITEM_COUNT
- Can also be set via ENV or directly in settings.py✅
BASKET_ITEM_ATTRIBUTES_MAX_LENGTH_KB
- Dynamic setting only✅
IS_SUB_BASKET_ITEM_QUANTITY_SAME_AS_PARENT
- Can also be set via ENV or directly in settings.py✅
BASKET_VALIDATORS
- Can also be set via ENV or directly in settings.py✅
BASKET_ITEM_REMOTE_PRICE_CLIENT_CONF
- Dynamic setting only✅
BASKET_SERVICE_CONDITIONS
- Can also be set via ENV or directly in settings.py✅
BASKET_PRODUCT_MAX_QUANTITY_ATTRIBUTE
- Can also be set via ENV or directly in settings.py✅
BASKET_PRODUCT_USER_MAX_QUANTITY_ATTRIBUTE
- Can also be set via ENV or directly in settings.py✅
BASKET_NAMESPACE_VALIDATORS
- Can also be set via ENV or directly in settings.py✅
RESET_BASKET_ON_SEGMENT_CHANGE
- Can also be set via ENV or directly in settings.py
From omnishop.products.settings.conf
:
✅
IS_MARKETPLACE
- Can also be set via ENV or directly in settings.py✅
OFFER_MISCELLANEOUS_ATTRIBUTE_KEY
- Can also be set via ENV or directly in settings.py✅
REMOTE_PRICE_ATTRIBUTE_KEY
- Can also be set via ENV or directly in settings.py
Weight-Based Product Sales Settings: These settings can also be configured via environment variables:
🔧
BASKET_UNIT_VALUE_ATTRIBUTE
- ENV:BASKET_UNIT_VALUE_ATTRIBUTE
(default: 'basket_unit_value')🔧
UNIT_STEP_VALUE_ATTRIBUTE
- ENV:UNIT_STEP_VALUE_ATTRIBUTE
(default: 'unit_step_value')🔧
UNIT_REFERENCE_VALUE_ATTRIBUTE
- ENV:UNIT_REFERENCE_VALUE_ATTRIBUTE
(default: 'unit_reference_value')🔧
UNIT_PRODUCT_FLAG_ATTRIBUTE
- ENV:UNIT_PRODUCT_FLAG_ATTRIBUTE
(default: 'is_unit_product')🔧
UNIT_MINIMUM_VALUE_ATTRIBUTE
- ENV:UNIT_MINIMUM_VALUE_ATTRIBUTE
(default: 'unit_minimum_value')Detailed Documentation: https://docs.akinon.com/technical-guides/commerce/weight-based-product-sales
Core Settings
IS_MARKETPLACE
(boolean, default: false):
When enabled, datasource field becomes required for all basket operations
Products must be associated with a specific seller/datasource
Extra product pricing and stock information is included in responses
Enables multi-seller marketplace functionality
BASKET_ITEM_ATTRIBUTES_MAX_LENGTH_KB
(integer, default: 0):
Controls maximum size of custom attributes per basket item in kilobytes
Default 0 means no limit, typical value is 10KB
Prevents oversized data in gift notes, form fields, etc.
Returns validation error if limit exceeded
OFFER_MISCELLANEOUS_ATTRIBUTE_KEY
(string, default: "cannot_be_sold_alone"):
Determines which offer products can be added as miscellaneous sub-items
Controls validation of sub-items in basket operations
Used to identify promotional miscellaneous products
Basket Quantity Limits
BASKET_MAX_ITEM_COUNT
(integer, default: 80):
Total quantity limit of all items in the cart
Prevents baskets from becoming too large
Checked when adding/updating items
BASKET_PRODUCT_MAX_QUANTITY_ATTRIBUTE
(string, default: ""):
Product attribute key that defines maximum quantity per product
Applied globally across all users
Example: Product with
max_quantity: 10
cannot exceed 10 units in basket
BASKET_PRODUCT_USER_MAX_QUANTITY_ATTRIBUTE
(string, default: ""):
Product attribute key for maximum quantity per user within time window
Combined with
BASKET_PRODUCT_USER_MAX_QUANTITY_GAP_HOUR
(default: 24h)Includes both basket and recent orders in calculation
Prevents single user from purchasing excessive quantities
Sub-Item Behavior
IS_SUB_BASKET_ITEM_QUANTITY_SAME_AS_PARENT
(boolean, default: false):
When true, sub-product quantities automatically match parent product quantity
Affects extra products and miscellaneous items
When false, sub-items maintain independent quantities
Basket Validators
BASKET_VALIDATORS
(list of validator configurations, default: []):
Custom validation rules applied to basket before checkout
Each validator has:
condition_klass
,kwargs
,message
(multi-language)Available validators:
BasketItemQuantityValidator
: Validates quantity based on product attributesBasketItemBaseCodeQuantityValidator
: Validates quantity by product base code based on product attributesBasketItemSteppedQuantityValidator
: Enforces quantity steps (e.g., multiples of 6)AttributeValidator
: Validates product attribute valuesSingleDataSourceValidator
: Ensures all items from same seller (marketplace)
Errors returned during checkout validation
Service Conditions
BASKET_SERVICE_CONDITIONS
(list of condition paths, default: []):
Conditions checked when basket items are added/modified (runtime validation)
Applied during POST/PUT operations, not during checkout
Available conditions with detailed configuration examples:
1. basket_user_max_quantity
Purpose: Enforces per-user quantity limits over configurable time periods
Module:
omnishop.baskets.conditions.basket_user_max_quantity
Parameters: Requires product attributes:
max_user_quantity
: Maximum quantity user can orderAttribute name need to be set via
BASKET_PRODUCT_USER_MAX_QUANTITY_ATTRIBUTE
Use Case: Limit purchases per user to prevent abuse/scalping
Configuration Example:
BASKET_SERVICE_CONDITIONS = [ "omnishop.baskets.conditions.basket_user_max_quantity" ]
Product Attributes Example:
{ "max_user_quantity": 2 }
Behavior:
Queries user's order history for last N days
N is configurable via
BASKET_PRODUCT_USER_MAX_QUANTITY_GAP_HOUR
(default: 24 hours)
Sums quantities of same product
Rejects if adding current quantity exceeds limit
Example: User can only buy 2 units in 30 days
2. basket_item_max_count
Purpose: Enforces maximum total item count in basket
Module:
omnishop.baskets.conditions.basket_item_max_count
Use Case: Simplify order processing, limit basket items
Configuration Example:
BASKET_SERVICE_CONDITIONS = [ "omnishop.baskets.conditions.basket_item_max_count" ]
Behavior:
Counts basket items in quantity
Compares against
BASKET_MAX_ITEM_COUNT
settingPrevents adding new item if count exceeds max item count setting
Error: "Maximum of {max item count} items can be added to the cart."
3. bundle_type_compatibility_condition
Purpose: Validates bundle type compatibility between products
Module:
omnishop.baskets.conditions.bundle_type_compatibility_condition
Parameters: Requires
BUNDLE_TYPE_CONFIGURATION
static setting (configured in settings.py)Use Case: Prevent incompatible product bundles (e.g., subscription + one-time)
Configuration Example:
BASKET_SERVICE_CONDITIONS = [ "omnishop.baskets.conditions.bundle_type_compatibility_condition" ] BUNDLE_TYPE_CONFIGURATION = { "INCOMPATIBLE_BUNDLE_TYPES": ( ("subscription", "one_time_purchase"), ("recurring_payment", "prepaid") ), "ATTRIBUTE_NAME": "bundle_type" }
Product Attributes Example:
{ "bundle_type": "subscription" }
Behavior:
Reads
bundle_type
attribute from productsChecks against
INCOMPATIBLE_BUNDLE_TYPES
configurationPrevents adding product if bundle type conflicts with existing items
Error: "This product cannot be purchased with the other products in the basket. If you add this product to the basket, other product(s) will be removed."
Example: Cannot mix "subscription" and "one_time_purchase" products
4. extra_product_quantity_condition
Purpose: Prevents quantity changes for basket items that have extra products/sub-items attached
Module:
omnishop.baskets.conditions.extra_product_quantity_condition
Parameters: None (automatic detection of items with sub-items)
Use Case: Protect parent-child relationships (warranties, gift wrapping, accessories, etc.)
Configuration Example:
BASKET_SERVICE_CONDITIONS = [ "omnishop.baskets.conditions.extra_product_quantity_condition" ]
Behavior:
Detects if basket item has sub-items (extra products) attached to it
Prevents direct quantity modification of the parent item when sub-items exist
User must remove sub-items first, then modify parent quantity
Error: "The orders related to miscellaneous product do not accept changing quantity"
Example:
User adds Laptop (qty: 1)
User adds Extended Warranty as extra product (attached to laptop as sub-item)
User tries to change Laptop quantity from 1 to 2 → BLOCKED
User must first remove the warranty, then change laptop quantity, then re-add warranty if desired
Namespace Settings
BASKET_NAMESPACE_VALIDATORS
(list of validator configurations, default: see below):
Validators for namespace-based basket operations
Default validators:
NullNamespaceValidator
: Prevents namespace from being NoneActiveBasketCountValidator
: Limits number of active baskets (default: 5)NamespaceDataSourceValidator
: Validates namespace matches datasourceDefaultNamespaceValidator
: Prevents namespace string "null"
Each validator can have custom
kwargs
for configuration
RESET_BASKET_ON_SEGMENT_CHANGE
(boolean, default: true):
When true, basket is cleared when user segment changes
Segment changes affect pricing/stock lists
Prevents price inconsistencies across segments
Remote Pricing
BASKET_ITEM_REMOTE_PRICE_CLIENT_CONF
(dict, default: {"headers": {"Authorization": "Bearer test_token"}, "url": "http://localhost:8000/"}):
Configuration for remote price calculation service
Contains
url
andheaders
for remote APIUsed when pricing comes from external systems
Detailed Documentation: https://docs.akinon.com/technical-guides/commerce/remote-price
Was this helpful?