Simple django cart manager for your django projects.
Project description
dj-shop-cart
A simple and flexible cart manager for your django projects.
This is a work in progress, expect api breaking changes, pin the exact version you are using
Features
- Add, remove, decrement and clear items from cart
- Authenticated users cart can be saved to database
- Write custom methods to easily hook into the items add / remove flow
- Custom get_price method to ensure that the cart always have an up-to-date products price
- Each item in the cart hold a reference to the associated product
- Metadata data can be attached to cart items
- Supports specification of product variation details
- Available context processor for easy access to the user cart in all your django templates
Installation
Install dj-shop-cart with pip or poetry.
pip install dj-shop-cart
Usage/Examples
# settings.py
INSTALLED_APPS = [
...,
"dj_shop_cart", # If you want the cart to be stored in the database when users are authenticated
...,
]
TEMPLATES = [
{
"OPTIONS": {
"context_processors": [
...,
"dj_shop_cart.context_processors.cart", # If you want access to the cart instance in all templates
],
},
}
]
# models.py
from django.db import models
from dj_shop_cart.cart import CartItem
from decimal import Decimal
class Product(models.Model):
...
def get_price(self, item:CartItem)->Decimal:
"""The only requirements of the dj_shop_cart package apart from the fact that the products you add
to the cart must be instances of django based models. You can use a different name for this method
but be sure to update the corresponding setting (see Configuration). Even if you change the name the
function signature should match this one.
"""
# views.py
from dj_shop_cart.cart import get_cart_manager_class
from django.http import HttpRequest
from django.views.decorators.http import require_POST
# This function has nothing to do with the package itself
from .helpers import collect_params
Cart = get_cart_manager_class()
@require_POST
def add_product(request: HttpRequest):
product, quantity = collect_params(request)
cart = Cart.new(request)
cart.add(product, quantity=quantity)
...
@require_POST
def remove_product(request: HttpRequest):
product, quantity = collect_params(request)
cart = Cart.new(request)
cart.remove(product, quantity=quantity)
...
@require_POST
def empty_cart(request: HttpRequest):
Cart.new(request).empty()
...
Configuration
Configure the cart behaviour in your Django settings. All settings are optional.
Name | Type | Description | Default |
---|---|---|---|
CART_SESSION_KEY | str | The key used to store the cart in session | CART-ID |
CART_MANAGER_CLASS | str | The path to a custom Cart manager class. The custom class need to be a subclass of dj_shop_cart.cart.Cart | None |
CART_PRODUCT_GET_PRICE | str | The method name to use to dynamically get the price on the product instance | get_price |
Development
Poetry is required (not really, you can set up the environment however you want and install the requirements manually) to set up a virtualenv, install it then run the following:
poetry install
pre-commit install --install-hooks
Tests can then be run quickly in that environment:
pytest
Feedback
If you have any feedback, please reach out to me at degnonfrancis@gmail.com
Todos
- Add api reference in readme
- Add Used by section to readme
- Add a redis storage backend and rework the api for easy integration of custom storage backends
- More examples
- Complete the example project
- Write more tests
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
dj-shop-cart-3.0.5.tar.gz
(10.1 kB
view hashes)
Built Distribution
Close
Hashes for dj_shop_cart-3.0.5-py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | bbb965c2c40b66c6699b9f4091b04a1bc2ef291c3bf8d2127f421c18a54a0c11 |
|
MD5 | 28d952e556bd9bce7c33d690af9285dc |
|
BLAKE2b-256 | 247027ae8d5567defb4ef1c763230060bc93e6901215e5cf7d5bc468ade180dd |