Package: django-ok-cart
Django Cart.InstallationInstall with pip:$pipinstalldjango-ok-cartdjangorestframeworkUpdate INSTALLED_APPS:INSTALLED_APPS=[...'ok_cart','rest_framework',...]Apply migrations:pythonmanage.pymigrateAvailable settingsCART_ADD_PIPELINES- Functions to run after adding each passed item to the cart.# settings.pyCART_ADD_PIPELINES=('apps.store.contrib.cart.pipelines.save_shop_id_to_cart_parameters',)# apps.store.contrib.cart.pipelines.pydefsave_shop_id_to_cart_parameters(cart:'Cart',user:'User',content_object:'Model',cart_item:'CartItem',cart_group:'CartGroup',**kwargs):ifisinstance(content_object,Product)andcart_group:cart_group.parameters['shop_id']=content_object.shop_idcart_group.save(update_fields=['parameters'])cart_item.parameters['shop_id']=content_object.shop_idcart_item.save(update_fields=['parameters'])CART_POST_ADD_PIPELINES- Functions to run after adding all passed items to the cart.Note: To save cart items prices you need to implement your custom pipeline like in example below.# settings.pyCART_POST_ADD_PIPELINES=('apps.store.contrib.cart.pipelines.apply_product_prices_to_cart',)# apps.store.contrib.cart.pipelines.pyfromok_cart.selectorsimportget_cart_items_by_cartfromapps.store.modelsimportProductfromapps.store.selectorsimportget_product_pricefromshared.utilsimportget_content_typedefget_product_cart_items(*,cart:'Cart',with_related:bool=True)->'QuerySet':cart_items=(get_cart_items_by_cart(cart=cart,with_related=with_related).filter(content_type=get_content_type(Product)))returncart_itemsdefget_cart_item_price(*,content_object:'Model',user:'User',cart:'Cart',**kwargs)->Decimal:"""
    Return price for specific type of object
    """price=Noneifisinstance(content_object,Product):price=get_product_price(product=content_object)returnpricedefapply_product_prices_to_cart(*,cart:'Cart',user:'User',**kwargs):cart_items=(get_product_cart_items(cart=cart,with_related=False))forcart_itemincart_items:price=(get_cart_item_price(content_object=cart_item.content_object,user=user,cart=cart,))cart_item.price=pricecart_item.save()CART_ELEMENT_REPRESENTATION_SERIALIZERS- Serializers to represent cart items objects.# settings.pyCART_ELEMENT_REPRESENTATION_SERIALIZERS={'store.Product':'api.rest.store.serializers.product.retrieve.ProductCartRetrieveSerializer',}CART_ELEMENT_ALLOWED_TYPES- Tuple of tuples of cart items allowed types.# settings.pyCART_ELEMENT_ALLOWED_TYPES=(('store','product'),)CART_PRICE_PROCESSOR- Function to modify cart prices, like converting to another currency.# settings.pyCART_PRICE_PROCESSOR='apps.store.contrib.cart.cart_price_processor'# apps.store.contrib.cart.price.pydefcart_price_processor(*,request,price):returnpriceCART_BASE_API_VIEW- Base API View for your cart views.# settings.pyCART_BASE_API_VIEW='apps.store.contrib.cart.StandardsMixin'CART_GETTER- Function to get or create cart.ok_cart.selectors.get_cart_from_requestby default.# settings.pyCART_GETTER='apps.store.contrib.cart.selectors.cart_getter'# store.contrib.cart.selectors.pydefcart_getter(*,request:'HttpRequest',cart_queryset:'QuerySet'=Cart.objects.open().optimized(),auto_create:bool=True)->'Cart':passCART_MERGE_ENABLED- Setting to enable carts merge during login/logout flow. To make it work properly, add this setting:# settings.pySESSION_ENGINE='ok_cart.session_store'QuickstartTo enable cart views, add next URL patterns:urlpatterns=[...path('',include('ok_cart.api.urls')),]Endpoints/api/v1/cart/change/- API View to add items to cart.typevalue is a structure likeapp_label.model_name.Possible payload:{"entities":[{"element":{"id":"9619f790-9a02-4ac3-ad34-22e4da3a6d54","type":"store.product"},"quantity":"1"}]}/api/v1/cart/clear/- API View to remove all items from cart./api/v1/cart/quantity/- API View to get cart’s quantity and total price.Possible result:{"quantity":3,"total_price":750}/api/v1/cart/retrieve/- API View to retrieve cart data.Possible result:{"groups":[{"id":34,"price":750,"base":{"element":{"id":"9619f790-9a02-4ac3-ad34-22e4da3a6d54","caption":"Ноутбук","type":"store.product","props":{"title":"Ноутбук","short_description":"Ноут для чайников","category":{"id":1,"caption":"Ноутбуки и компьютеры","type":"store.category","props":{"id":1,"label":"noutbuk-komp","title":"Ноутбуки и компьютеры","parent":null,"depth":0}},"image":{},"shop":null,"shop_identifier":"","price":250,"old_price":null,"url":"/product/noutbuk-0c4qoewu-vxmong1s/"}},"quantity":3,"price":250,"parameters":{"shop_id":null}},"relations":[],"parameters":{"shop_id":null}}],"quantity":3,"total_price":750,"parameters":{}}