# dj-shop-cart
A simple and flexible cart manager for your django projects.
[![pypi](https://badge.fury.io/py/dj-shop-cart.svg)](https://pypi.org/project/dj-shop-cart/)
[![python](https://img.shields.io/pypi/pyversions/dj-shop-cart)](https://github.com/Tobi-De/dj-shop-cart)
[![django](https://img.shields.io/pypi/djversions/dj-shop-cart)](https://github.com/Tobi-De/dj-shop-cart)
[![MIT License](https://img.shields.io/badge/license-MIT-blue.svg?)](https://github.com/Tobi-De/dj-shop-cart/blob/master/LICENSE)
[![black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black)
✨📚✨ [Read the full documentation](https://tobi-de.github.io/dj-shop-cart/)
## 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
- Swappable backend storage, with session and database provided by default
## Installation
Install **dj-shop-cart** with pip or poetry.
```bash
pip install dj-shop-cart
```
## Quickstart
```python3
# settings.py
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 dj_shop_cart.protocols import Numeric
class Product(models.Model):
...
def get_price(self, item:CartItem) -> Numeric:
"""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_class
from django.http import HttpRequest
from django.views.decorators.http import require_POST
from django.shortcuts import get_object_or_404
from .models import Product
Cart = get_cart_class()
@require_POST
def add_product(request: HttpRequest, product_id:int):
product = get_object_or_404(Product.objects.all(), pk=product_id)
quantity = int(request.POST.get("quantity"))
cart = Cart.new(request)
cart.add(product, quantity=quantity)
...
@require_POST
def remove_product(request: HttpRequest):
item_id = request.POST.get("item_id")
quantity = int(request.POST.get("quantity"))
cart = Cart.new(request)
cart.remove(item_id=item_id, quantity=quantity)
...
@require_POST
def empty_cart(request: HttpRequest):
Cart.new(request).empty()
...
```
## Used By
This project is used by the following companies:
- [Fêmy bien être](https://www.femybienetre.com/)
- [Bjørn Art](https://bjornart.dk/)
## 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:
```sh
poetry install
pre-commit install --install-hooks
```
Tests can then be run quickly in that environment:
```sh
pytest
```
## Feedback
If you have any feedback, please reach out to me at tobidegnon@proton.me.
Raw data
{
"_id": null,
"home_page": "https://tobi-de.github.io/dj-shop-cart/",
"name": "dj-shop-cart",
"maintainer": null,
"docs_url": null,
"requires_python": "<4.0,>=3.10",
"maintainer_email": null,
"keywords": "django, python, cart, shop, ecommerce",
"author": "Tobi DEGNON",
"author_email": "tobidegnon@protonmail.com",
"download_url": "https://files.pythonhosted.org/packages/cb/39/b5890c1daa7f588d64ddfe1379b8018d3ae22f2022a6c434140ed74c68a1/dj_shop_cart-7.1.1.tar.gz",
"platform": null,
"description": "# dj-shop-cart\n\nA simple and flexible cart manager for your django projects.\n\n[![pypi](https://badge.fury.io/py/dj-shop-cart.svg)](https://pypi.org/project/dj-shop-cart/)\n[![python](https://img.shields.io/pypi/pyversions/dj-shop-cart)](https://github.com/Tobi-De/dj-shop-cart)\n[![django](https://img.shields.io/pypi/djversions/dj-shop-cart)](https://github.com/Tobi-De/dj-shop-cart)\n[![MIT License](https://img.shields.io/badge/license-MIT-blue.svg?)](https://github.com/Tobi-De/dj-shop-cart/blob/master/LICENSE)\n[![black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black)\n\n\u2728\ud83d\udcda\u2728 [Read the full documentation](https://tobi-de.github.io/dj-shop-cart/)\n\n## Features\n\n- Add, remove, decrement and clear items from cart\n- Authenticated users cart can be saved to database\n- Write custom methods to easily hook into the items add / remove flow\n- Custom **get_price** method to ensure that the cart always have an up-to-date products price\n- Each item in the cart hold a reference to the associated product\n- Metadata data can be attached to cart items\n- Supports specification of product variation details\n- Available context processor for easy access to the user cart in all your django templates\n- Swappable backend storage, with session and database provided by default\n\n\n## Installation\n\nInstall **dj-shop-cart** with pip or poetry.\n\n```bash\n pip install dj-shop-cart\n```\n\n## Quickstart\n\n```python3\n\n# settings.py\n\nTEMPLATES = [\n {\n \"OPTIONS\": {\n \"context_processors\": [\n ...,\n \"dj_shop_cart.context_processors.cart\", # If you want access to the cart instance in all templates\n ],\n },\n }\n]\n\n# models.py\n\nfrom django.db import models\nfrom dj_shop_cart.cart import CartItem\nfrom dj_shop_cart.protocols import Numeric\n\nclass Product(models.Model):\n ...\n\n def get_price(self, item:CartItem) -> Numeric:\n \"\"\"The only requirements of the dj_shop_cart package apart from the fact that the products you add\n to the cart must be instances of django based models. You can use a different name for this method\n but be sure to update the corresponding setting (see Configuration). Even if you change the name the\n function signature should match this one.\n \"\"\"\n\n\n# views.py\n\nfrom dj_shop_cart.cart import get_cart_class\nfrom django.http import HttpRequest\nfrom django.views.decorators.http import require_POST\nfrom django.shortcuts import get_object_or_404\n\nfrom .models import Product\n\nCart = get_cart_class()\n\n\n@require_POST\ndef add_product(request: HttpRequest, product_id:int):\n product = get_object_or_404(Product.objects.all(), pk=product_id)\n quantity = int(request.POST.get(\"quantity\"))\n cart = Cart.new(request)\n cart.add(product, quantity=quantity)\n ...\n\n\n@require_POST\ndef remove_product(request: HttpRequest):\n item_id = request.POST.get(\"item_id\")\n quantity = int(request.POST.get(\"quantity\"))\n cart = Cart.new(request)\n cart.remove(item_id=item_id, quantity=quantity)\n ...\n\n\n@require_POST\ndef empty_cart(request: HttpRequest):\n Cart.new(request).empty()\n ...\n\n```\n\n## Used By\n\nThis project is used by the following companies:\n\n- [F\u00eamy bien \u00eatre](https://www.femybienetre.com/)\n- [Bj\u00f8rn Art](https://bjornart.dk/)\n\n## Development\n\nPoetry is required (not really, you can set up the environment however you want and install the requirements\nmanually) to set up a virtualenv, install it then run the following:\n\n```sh\npoetry install\npre-commit install --install-hooks\n```\n\nTests can then be run quickly in that environment:\n\n```sh\npytest\n```\n\n## Feedback\n\nIf you have any feedback, please reach out to me at tobidegnon@proton.me.\n\n",
"bugtrack_url": null,
"license": "MIT",
"summary": "Simple django cart manager for your django projects.",
"version": "7.1.1",
"project_urls": {
"Homepage": "https://tobi-de.github.io/dj-shop-cart/",
"Repository": "https://github.com/Tobi-De/dj-shop-cart"
},
"split_keywords": [
"django",
" python",
" cart",
" shop",
" ecommerce"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "b93fa320b80d376e414a5ad688732c0b312aac7edf87ecf917b6d29f31512ead",
"md5": "87723160eee192454f2eda094bd60a9c",
"sha256": "24f30739f2ea627d803156c396eeb9cfea67a3c1403c43f4ee677cdb827613c8"
},
"downloads": -1,
"filename": "dj_shop_cart-7.1.1-py3-none-any.whl",
"has_sig": false,
"md5_digest": "87723160eee192454f2eda094bd60a9c",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": "<4.0,>=3.10",
"size": 11287,
"upload_time": "2024-06-07T10:02:51",
"upload_time_iso_8601": "2024-06-07T10:02:51.634972Z",
"url": "https://files.pythonhosted.org/packages/b9/3f/a320b80d376e414a5ad688732c0b312aac7edf87ecf917b6d29f31512ead/dj_shop_cart-7.1.1-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "cb39b5890c1daa7f588d64ddfe1379b8018d3ae22f2022a6c434140ed74c68a1",
"md5": "f69e39552f85cee83ea827b5dad8c682",
"sha256": "86ae57458bf5fad3091705c5d604a5c2e21498296efad9824602a2c42ad79694"
},
"downloads": -1,
"filename": "dj_shop_cart-7.1.1.tar.gz",
"has_sig": false,
"md5_digest": "f69e39552f85cee83ea827b5dad8c682",
"packagetype": "sdist",
"python_version": "source",
"requires_python": "<4.0,>=3.10",
"size": 9805,
"upload_time": "2024-06-07T10:02:53",
"upload_time_iso_8601": "2024-06-07T10:02:53.641338Z",
"url": "https://files.pythonhosted.org/packages/cb/39/b5890c1daa7f588d64ddfe1379b8018d3ae22f2022a6c434140ed74c68a1/dj_shop_cart-7.1.1.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2024-06-07 10:02:53",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "Tobi-De",
"github_project": "dj-shop-cart",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"lcname": "dj-shop-cart"
}