Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Moved order to request and order from request to a helper, this neede…
…d to change tests slightly
  • Loading branch information
Chris Glass committed Feb 15, 2011
1 parent b7b676b commit 170e18f
Show file tree
Hide file tree
Showing 4 changed files with 49 additions and 12 deletions.
14 changes: 6 additions & 8 deletions shop/backend_base.py
Expand Up @@ -3,7 +3,8 @@
from django.conf.urls.defaults import url
from django.core import exceptions
from django.utils.importlib import import_module
from shop.models.ordermodel import Order, OrderExtraInfo
from shop.models.ordermodel import OrderExtraInfo
from shop.util.order import get_order_from_request


class BaseBackendAPI(object):
Expand All @@ -28,13 +29,10 @@ def get_order(self, request):
This is called from the backend's views as:
>>> order = self.shop.getOrder(request)
'''
user = request.user
order = Order.objects.filter(user=user).filter(status__lt=Order.COMPLETED)
if len(order) >= 1:
order = order[0]
else:
order = []
return order
# it might seem a bit strange to simply forward the call to a helper,
# but this avoids exposing the shop's internal workings to module
# writers
return get_order_from_request(request)

def add_extra_info(self,order, text):
'''
Expand Down
3 changes: 1 addition & 2 deletions shop/tests/payment.py
Expand Up @@ -73,8 +73,7 @@ class MockRequest():

be = MockBackend()
order = be.shop.get_order(MockRequest())
self.assertNotEqual(order, None)
self.assertEqual(len(order), 0) # Should basically be an empty list
self.assertEqual(order, None)

def test_04_get_backends_from_pool(self):
MODIFIERS = ['shop.tests.payment.MockPaymentBackend']
Expand Down
3 changes: 1 addition & 2 deletions shop/tests/shipping.py
Expand Up @@ -83,8 +83,7 @@ class MockRequest():

be = MockBackend()
order = be.shop.get_order(MockRequest())
self.assertNotEqual(order, None)
self.assertEqual(len(order), 0) # Should basically be an empty list
self.assertEqual(order, None)

def test_04_get_backends_from_pool(self):
MODIFIERS = ['shop.tests.shipping.MockShippingBackend']
Expand Down
41 changes: 41 additions & 0 deletions shop/util/order.py
@@ -0,0 +1,41 @@
#-*- coding: utf-8 -*-
from django.contrib.auth.models import AnonymousUser
from shop.models.ordermodel import Order

def get_order_from_request(request):
'''
Returns the currently processing Order from a request (switches between
user or session mode) if any.
'''
order = None
if request.user and not isinstance(request.user, AnonymousUser):
# There is a logged in user
order = Order.objects.filter(user=request.user).filter(status__lt=Order.COMPLETED)
if len(order) >= 1: # The queryset returns a list
order = order[0]
else:
order = None # There is a logged in user but he has no pending order
else:
session = getattr(request, 'session', None)
if session != None :
# There is a session
order_id = session.get('order_id')
if order_id:
order = Order.objects.get(pk=order_id)
return order


def add_order_to_request(request,order):
'''
Checks that the order is linked to the current user or adds the order to
the session should there be no logged in user.
'''
if request.user and not isinstance(request.user, AnonymousUser):
# We should check that the current user is indeed the request's user.
if order.user != request.user:
order.user = request.user
order.save()
else:
# Add the order_id to the session
# There has to be a session. Otherwise it's fine to get an AttributeError
request.session['order_id'] = order.id

0 comments on commit 170e18f

Please sign in to comment.