Skip to content

Commit

Permalink
Add ability to add new items to cart using CartItemList view
Browse files Browse the repository at this point in the history
  • Loading branch information
yumike committed Jan 24, 2012
1 parent 3c37e19 commit 752d746
Show file tree
Hide file tree
Showing 5 changed files with 100 additions and 5 deletions.
31 changes: 31 additions & 0 deletions tinycart/forms.py
@@ -0,0 +1,31 @@
from django import forms
from django.contrib.contenttypes.models import ContentType


class CartItemForm(forms.Form):

product_id = forms.IntegerField(min_value=1)
product_type = forms.ModelChoiceField(queryset=ContentType.objects.all())

quantity = forms.IntegerField(min_value=1, initial=1, required=False)
is_held = forms.BooleanField(initial=False, required=False)

def clean_quantity(self):
quantity = self.cleaned_data['quantity']
return quantity if quantity is not None else 1

def clean(self):
product_id = self.cleaned_data.get('product_id')
product_type = self.cleaned_data.get('product_type')
if product_id and product_type:
try:
product = product_type.get_object_for_this_type(pk=product_id)
except product_type.model_class().DoesNotExist:
raise forms.ValidationError('Product does not exist')
self.cleaned_data['product'] = product
return self.cleaned_data

def add_to_cart(self, cart):
return cart.add(self.cleaned_data['product'],
self.cleaned_data['quantity'],
self.cleaned_data['is_held'])
Empty file.
10 changes: 10 additions & 0 deletions tinycart/templatetags/tinycart.py
@@ -0,0 +1,10 @@
from django.contrib.contenttypes.models import ContentType
from django.template import Library


register = Library()


@register.filter
def content_type_pk(value):
return ContentType.objects.get_for_model(value.__class__).pk
51 changes: 46 additions & 5 deletions tinycart/tests/test_views.py
@@ -1,4 +1,5 @@
from django.contrib.auth.models import AnonymousUser
from django.contrib.contenttypes.models import ContentType
from django.test import TestCase, RequestFactory

from tinycart.models import Cart
Expand All @@ -9,6 +10,16 @@

class CartItemListTests(TestCase):

def create_request(self, method, data=None):
request = getattr(RequestFactory(), method)('/cart/', data=data or {})
request.user = AnonymousUser()
request.session = {}
request.cart = Cart.objects.get_for_request(request)
return request


class CartItemListGetTests(CartItemListTests):

def setUp(self):
self.view = CartItemList.as_view()
self.request = self.create_request()
Expand All @@ -23,14 +34,44 @@ def setUp(self):
self.unavailable_item = self.request.cart.add(self.unavailable_book)

def create_request(self):
request = RequestFactory().get('/cart/')
request.user = AnonymousUser()
request.session = {}
request.cart = Cart.objects.get_for_request(request)
return request
return super(CartItemListGetTests, self).create_request('get')

def test_context_data(self):
c = self.view(self.request).context_data
self.assertEqual(c['held_object_list'], [self.held_item])
self.assertEqual(c['available_object_list'], [self.available_item])
self.assertEqual(c['unavailable_object_list'], [self.unavailable_item])


class CartItemListPostTests(CartItemListTests):

def setUp(self):
self.view = CartItemList.as_view()
self.book = Book.objects.create()

def create_request(self, data=None):
return super(CartItemListPostTests, self).create_request('post', data)

def test_add_to_cart(self):
request = self.create_request({
'product_id': self.book.pk,
'product_type': ContentType.objects.get_for_model(Book).pk})
response = self.view(request)
self.assertEqual(response.status_code, 302)
self.assertEqual(request.cart.items.count(), 1)

item = request.cart.items.get()
self.assertEqual(item.product, self.book)
self.assertEqual(item.quantity, 1)
self.assertFalse(item.is_held)

def test_add_to_cart_with_quantity(self):
request = self.create_request({
'product_id': self.book.pk,
'product_type': ContentType.objects.get_for_model(Book).pk,
'quantity': 5})
response = self.view(request)
self.assertEqual(response.status_code, 302)

item = request.cart.items.get()
self.assertEqual(item.quantity, 5)
13 changes: 13 additions & 0 deletions tinycart/views.py
@@ -1,4 +1,8 @@
from django.http import HttpResponse, HttpResponseBadRequest
from django.shortcuts import redirect
from django.views.generic import ListView

from .forms import CartItemForm
from .models import Cart


Expand Down Expand Up @@ -26,3 +30,12 @@ def get_context_data(self, **kwargs):

def get(self, request, *args, **kwargs):
return super(CartItemList, self).get(request, *args, **kwargs)

def post(self, request, *args, **kwargs):
form = CartItemForm(request.POST)
if form.is_valid():
form.add_to_cart(request.cart)
if request.is_ajax():
return HttpResponse(status=201)
return redirect('tinycart_cart_item_list')
return HttpResponseBadRequest()

0 comments on commit 752d746

Please sign in to comment.