Basket
Basket reference.
Models
Modifiers
To use the modifiers:
from salesman.basket.modifiers import basket_modifiers_pool
modifiers = basket_modifiers_pool.get_modifiers()
- class salesman.basket.modifiers.BasketModifier[source]
Basket modifier used to process the basket on every request. Modifier methods get called in top-to-bottom order as defined in this class.
All modifiers defined in
SALESMAN_BASKET_MODIFIERS
must extend this class.- setup_basket(basket: salesman.basket.models.BaseBasket, request: django.http.request.HttpRequest) None [source]
Initial modifier Basket setup before any processing.
- Parameters
basket (BaseBasket) – Basket instance
request (HttpRequest) – Django request
- setup_item(item: salesman.basket.models.BaseBasketItem, request: django.http.request.HttpRequest) None [source]
Initial modifier Basket item setup before any processing.
- Parameters
basket (BaseBasket) – Basket instance
request (HttpRequest) – Django request
- process_item(item: salesman.basket.models.BaseBasketItem, request: django.http.request.HttpRequest) None [source]
Process item. Add extra row to item using
self.add_extra_row()
method.- Parameters
item (BasketItem) – Basket item instance
request (HttpRequest) – Django request
- finalize_item(item: salesman.basket.models.BaseBasketItem, request: django.http.request.HttpRequest) None [source]
Finalize item after after all items were already processed.
- Parameters
item (BaseBasketItem) – Basket item instance
request (HttpRequest) – Django request
- process_basket(basket: salesman.basket.models.BaseBasket, request: django.http.request.HttpRequest) None [source]
Process basket. Add extra row to bakset using
self.add_extra_row()
method.- Parameters
basket (Basket) – Basket instance
request (HttpRequest) – Django request
- finalize_basket(basket: salesman.basket.models.BaseBasket, request: django.http.request.HttpRequest) None [source]
Finalize basket after after all items and basket were already processed.
- Parameters
item (BaseBasketItem) – Basket instance
request (HttpRequest) – Django request
- add_extra_row(obj: BaseBasket | BaseBasketItem, request: HttpRequest, label: str, amount: Decimal, extra: dict[str, Any] = {}, charge: bool = True, identifier: str | None = None) None [source]
Adds extra row to either the basket or item.
- Parameters
obj (BasketOrItem) – Basket or BasketItem instance
request (HttpRequest) – Django request
label (str) – Row label
amount (Decimal) – Row amount
extra (dict, optional) – Row extra data. Defaults to {}.
charge (bool, optional) – Whether to charge the amount. Defaults to True.
identifier (Optional[str], optional) – Extra row ID. Defaults to modifier ID.
- class salesman.basket.modifiers.BasketModifiersPool[source]
Pool for storing modifier instances.
- get_modifiers() List[salesman.basket.modifiers.BasketModifier] [source]
Returns modifier instances.
- Returns
Modifier instances
- Return type
list
Serializers
- class salesman.basket.serializers.ProductField(*args, **kwargs)[source]
Related product field that uses a serializer based on product type taken from
SALESMAN_PRODUCT_TYPES
setting.- to_representation(product: salesman.core.typing.Product) Any [source]
Object instance -> Dict of primitive datatypes.
- class salesman.basket.serializers.ExtraRowsField(*args, **kwargs)[source]
Field to display a list of
ExtraRowSerializer
instances.- to_representation(rows: dict[str, ExtraRowSerializer]) list[dict[str, Any]] [source]
Object instance -> Dict of primitive datatypes.
- class salesman.basket.serializers.ExtraRowSerializer(*args, **kwargs)[source]
Extra row serializer used for adding extra data to
extra_rows
dict on both the basket and basket item model. Mostly used when processing basket modifiers.
- class salesman.basket.serializers.BasketItemSerializer(*args, **kwargs)[source]
Serializer for basket item.
- class salesman.basket.serializers.BasketItemCreateSerializer(*args, **kwargs)[source]
Serializer used to add a new item to basket.
- create(validated_data: dict[str, Any]) BaseBasketItem [source]
We have a bit of extra checking around this in order to provide descriptive messages when something goes wrong, but this method is essentially just:
return ExampleModel.objects.create(**validated_data)
If there are many to many fields present on the instance then they cannot be set until the model is instantiated, in which case the implementation is like so:
example_relationship = validated_data.pop(‘example_relationship’) instance = ExampleModel.objects.create(**validated_data) instance.example_relationship = example_relationship return instance
The default implementation also does not handle nested relationships. If you want to support writable nested relationships you’ll need to write an explicit .create() method.
Utils
- salesman.basket.utils.validate_basket_item(attrs: dict[str, Any], context: dict[str, Any] = {}) dict[str, Any] [source]
Default basket item validator function. Can be overrider by providing a path to a function in
SALESMAN_BASKET_ITEM_VALIDATOR
setting.- Parameters
attrs (dict) – Attributes to be validated.
context (dict, optional) – Validator context data. Defaults to {}.
- Raises
ValidationError – In case data is not valid
- Returns
Validated attrs
- Return type
dict
- salesman.basket.utils.validate_extra(value: dict[str, Any], context: dict[str, Any] = {}) dict[str, Any] [source]
Default extra validator function. Can be overriden by providing a dotted path to a function in
SALESMAN_EXTRA_VALIDATOR
setting.- Parameters
value (str) – Extra dict to be validated
context (dict, optional) – Validator context data. Defaults to {}.
- Raises
ValidationError – In case data is not valid
- Returns
Validated value
- Return type
dict
Views
- class salesman.basket.views.BasketViewSet(**kwargs)[source]
Basket API endpoint.
- serializer_class
- get_view_name() str [source]
Return the view name, as used in OPTIONS responses and in the browsable API.
- get_queryset() django.db.models.query.QuerySet [source]
Get the list of items for this view. This must be an iterable, and may be a queryset. Defaults to using self.queryset.
This method should always be used rather than accessing self.queryset directly, as self.queryset gets evaluated only once, and those results are cached for all subsequent requests.
You may want to override this if you need to provide different querysets depending on the incoming request.
(Eg. return a list of items that is specific to the user)
- get_serializer_class() type[BaseSerializer] [source]
Return the class to use for the serializer. Defaults to using self.serializer_class.
You may want to override this if you need to provide different serializations depending on the incoming request.
(Eg. admins get full serialization, others get basic serialization)
- finalize_response(request: rest_framework.request.Request, response: rest_framework.response.Response, *args: Any, **kwargs: Any) rest_framework.response.Response [source]
Patch response to render the Basket when ?basket is present in the url.
- dispatch(request: django.http.request.HttpRequest, *args: Any, **kwargs: Any) django.http.response.HttpResponseBase [source]
.dispatch() is pretty much the same as Django’s regular dispatch, but with extra hooks for startup, finalize, and exception handling.
- list(request: rest_framework.request.Request, *args: Any, **kwargs: Any) rest_framework.response.Response [source]
Show basket and items.
- delete(request: rest_framework.request.Request, *args: Any, **kwargs: Any) rest_framework.response.Response [source]
Delete the basket.
- count(request: rest_framework.request.Request) rest_framework.response.Response [source]
Show basket item count.
- quantity(request: rest_framework.request.Request) rest_framework.response.Response [source]
Show basket total quantity.