Pārlūkot izejas kodu

Tided up address, analytics, basket apps

master
David Winterbottom 14 gadus atpakaļ
vecāks
revīzija
d8494beaca

+ 0
- 2
oscar/apps/address/models.py Parādīt failu

@@ -1,5 +1,3 @@
1
-from django.db import models
2
-
3 1
 from oscar.apps.address.abstract_models import AbstractUserAddress, AbstractCountry
4 2
 
5 3
 

+ 0
- 1
oscar/apps/address/tests.py Parādīt failu

@@ -2,7 +2,6 @@ from django.contrib.auth.models import User
2 2
 from django.test import TestCase
3 3
 
4 4
 from oscar.apps.address.models import Country, UserAddress
5
-from oscar.apps.basket.models import Basket
6 5
 from oscar.apps.order.models import ShippingAddress
7 6
 
8 7
 

+ 1
- 2
oscar/apps/analytics/abstract_models.py Parādīt failu

@@ -1,6 +1,5 @@
1 1
 from decimal import Decimal
2 2
 
3
-from django.contrib.auth.models import User
4 3
 from django.db import models
5 4
 from django.utils.translation import ugettext as _
6 5
 
@@ -74,7 +73,7 @@ class AbstractUserSearch(models.Model):
74 73
      
75 74
      class Meta:
76 75
          abstract = True
77
-         verbose_name_plural = "User search queries"
76
+         verbose_name_plural = _("User search queries")
78 77
          
79 78
      def __unicode__(self):
80 79
          return u"%s searched for '%s'" % (self.user, self.query)

+ 4
- 72
oscar/apps/analytics/models.py Parādīt failu

@@ -1,13 +1,11 @@
1
-from django.dispatch import receiver
2
-
3 1
 from oscar.apps.analytics.abstract_models import (AbstractProductRecord, AbstractUserRecord,
4
-                                             AbstractUserProductView, AbstractUserSearch)
2
+                                                  AbstractUserProductView, AbstractUserSearch)
5 3
 from oscar.core.loading import import_module
6
-
7 4
 product_signals = import_module('product.signals', ['product_viewed', 'product_search'])
8 5
 basket_signals = import_module('basket.signals', ['basket_addition'])
9 6
 order_signals = import_module('order.signals', ['order_placed'])
10 7
 
8
+
11 9
 class ProductRecord(AbstractProductRecord):
12 10
     pass
13 11
 
@@ -20,71 +18,5 @@ class UserProductView(AbstractUserProductView):
20 18
 class UserSearch(AbstractUserSearch):
21 19
     pass
22 20
 
23
-# Helpers
24
-
25
-def _record_product_view(product):
26
-    record,_ = ProductRecord.objects.get_or_create(product=product)
27
-    record.num_views += 1
28
-    record.save()
29
-    
30
-def _record_user_product_view(user, product):
31
-    if user.is_authenticated():
32
-        # Update user record
33
-        record,_ = UserRecord.objects.get_or_create(user=user)
34
-        record.num_product_views += 1
35
-        record.save()
36
-        
37
-        # Add user product view record
38
-        UserProductView.objects.create(product=product, user=user)
39
-        
40
-def _record_basket_addition(product):
41
-    record,_ = ProductRecord.objects.get_or_create(product=product)
42
-    record.num_basket_additions += 1
43
-    record.save()
44
-    
45
-def _record_user_basket_addition(user, product):
46
-    if user.is_authenticated():
47
-        record,_ = UserRecord.objects.get_or_create(user=user)
48
-        record.num_basket_additions += 1
49
-        record.save()
50
-
51
-def _record_products_in_order(order):
52
-    for line in order.lines.all():
53
-        record,_ = ProductRecord.objects.get_or_create(product=line.product)
54
-        record.num_purchases += line.quantity
55
-        record.save()
56
-
57
-def _record_user_order(user, order):
58
-    if user.is_authenticated():
59
-        record,_ = UserRecord.objects.get_or_create(user=user)
60
-        record.num_orders += 1
61
-        record.num_order_lines += order.num_lines
62
-        record.num_order_items += order.num_items
63
-        record.total_spent += order.total_incl_tax
64
-        record.date_last_order = order.date_placed
65
-        record.save()
66
-
67
-def _record_user_product_search(user, query):
68
-    if user.is_authenticated():
69
-        UserSearch._default_manager.create(user=user, query=query)
70
-
71
-# Receivers
72
-
73
-@receiver(product_signals.product_viewed)
74
-def receive_product_view(sender, product, user, **kwargs):
75
-    _record_product_view(product)
76
-    _record_user_product_view(user, product)
77
-    
78
-@receiver(product_signals.product_search)
79
-def receive_product_search(sender, query, user, **kwargs):
80
-    _record_user_product_search(user, query)
81
-    
82
-@receiver(basket_signals.basket_addition)
83
-def receive_basket_addition(sender, product, user, **kwargs):
84
-    _record_basket_addition(product)
85
-    _record_user_basket_addition(user, product)
86
-    
87
-@receiver(order_signals.order_placed)
88
-def receive_order_placed(sender, order, user, **kwargs):
89
-    _record_products_in_order(order)
90
-    _record_user_order(user, order)
21
+# Import receiver functions
22
+from oscar.apps.analytics.receivers import *

+ 76
- 0
oscar/apps/analytics/receivers.py Parādīt failu

@@ -0,0 +1,76 @@
1
+from django.dispatch import receiver
2
+
3
+from oscar.core.loading import import_module
4
+analytics_models = import_module('analytics.models', ['UserRecord', 'ProductRecord', 'UserProductView'])
5
+product_signals = import_module('product.signals', ['product_viewed', 'product_search'])
6
+basket_signals = import_module('basket.signals', ['basket_addition'])
7
+order_signals = import_module('order.signals', ['order_placed'])
8
+
9
+# Helpers
10
+
11
+def _record_product_view(product):
12
+    record,_ = analytics_models.ProductRecord.objects.get_or_create(product=product)
13
+    record.num_views += 1
14
+    record.save()
15
+    
16
+def _record_user_product_view(user, product):
17
+    if user.is_authenticated():
18
+        # Update user record
19
+        record,_ = analytics_models.UserRecord.objects.get_or_create(user=user)
20
+        record.num_product_views += 1
21
+        record.save()
22
+        
23
+        # Add user product view record
24
+        analytics_models.UserProductView.objects.create(product=product, user=user)
25
+        
26
+def _record_basket_addition(product):
27
+    record,_ = analytics_models.ProductRecord.objects.get_or_create(product=product)
28
+    record.num_basket_additions += 1
29
+    record.save()
30
+    
31
+def _record_user_basket_addition(user, product):
32
+    if user.is_authenticated():
33
+        record,_ = analytics_models.UserRecord.objects.get_or_create(user=user)
34
+        record.num_basket_additions += 1
35
+        record.save()
36
+
37
+def _record_products_in_order(order):
38
+    for line in order.lines.all():
39
+        record,_ = analytics_models.ProductRecord.objects.get_or_create(product=line.product)
40
+        record.num_purchases += line.quantity
41
+        record.save()
42
+
43
+def _record_user_order(user, order):
44
+    if user.is_authenticated():
45
+        record,_ = analytics_models.UserRecord.objects.get_or_create(user=user)
46
+        record.num_orders += 1
47
+        record.num_order_lines += order.num_lines
48
+        record.num_order_items += order.num_items
49
+        record.total_spent += order.total_incl_tax
50
+        record.date_last_order = order.date_placed
51
+        record.save()
52
+
53
+def _record_user_product_search(user, query):
54
+    if user.is_authenticated():
55
+        analytics_models.UserSearch._default_manager.create(user=user, query=query)
56
+
57
+# Receivers
58
+
59
+@receiver(product_signals.product_viewed)
60
+def receive_product_view(sender, product, user, **kwargs):
61
+    _record_product_view(product)
62
+    _record_user_product_view(user, product)
63
+    
64
+@receiver(product_signals.product_search)
65
+def receive_product_search(sender, query, user, **kwargs):
66
+    _record_user_product_search(user, query)
67
+    
68
+@receiver(basket_signals.basket_addition)
69
+def receive_basket_addition(sender, product, user, **kwargs):
70
+    _record_basket_addition(product)
71
+    _record_user_basket_addition(user, product)
72
+    
73
+@receiver(order_signals.order_placed)
74
+def receive_order_placed(sender, order, user, **kwargs):
75
+    _record_products_in_order(order)
76
+    _record_user_order(user, order)

+ 0
- 1
oscar/apps/basket/abstract_models.py Parādīt failu

@@ -2,7 +2,6 @@ from decimal import Decimal
2 2
 import zlib
3 3
 import datetime
4 4
 
5
-from django.contrib.auth.models import User
6 5
 from django.db import models
7 6
 from django.utils.translation import ugettext as _
8 7
 from django.core.exceptions import ObjectDoesNotExist

+ 1
- 0
oscar/apps/basket/admin.py Parādīt failu

@@ -7,6 +7,7 @@ models = import_module('basket.models', ['Basket', 'Line', 'LineAttribute'])
7 7
 class BasketAdmin(admin.ModelAdmin):
8 8
     read_only_fields = ('date_merged', 'date_submitted')
9 9
 
10
+
10 11
 admin.site.register(models.Basket, BasketAdmin)
11 12
 admin.site.register(models.Line)
12 13
 admin.site.register(models.LineAttribute)

+ 10
- 10
oscar/apps/basket/factory.py Parādīt failu

@@ -27,13 +27,13 @@ class BasketFactory(object):
27 27
         return self._get_or_create_cookie_basket(request, response, 
28 28
                                                  COOKIE_KEY_SAVED_BASKET, basket_models.Basket.saved)
29 29
     
30
-    def get_open_basket(self, request):
30
+    def get_open_basket(self, request, response):
31 31
         u"""Returns the basket for the current user"""
32
-        return self._get_basket(request, COOKIE_KEY_OPEN_BASKET, basket_models.Basket.open)
32
+        return self._get_basket(request, response, COOKIE_KEY_OPEN_BASKET, basket_models.Basket.open)
33 33
     
34
-    def get_saved_basket(self, request):
34
+    def get_saved_basket(self, request, response):
35 35
         u"""Returns the saved basket for the current user"""
36
-        return self._get_basket(request, COOKIE_KEY_SAVED_BASKET, basket_models.Basket.saved)
36
+        return self._get_basket(request, response, COOKIE_KEY_SAVED_BASKET, basket_models.Basket.saved)
37 37
     
38 38
     # Utility methods
39 39
     
@@ -42,7 +42,7 @@ class BasketFactory(object):
42 42
         Loads or creates a basket for the current user.  Any offers are also
43 43
         applied to the basket before it is returned.
44 44
         """
45
-        anon_basket = self._get_cookie_basket(request, cookie_key, manager)
45
+        anon_basket = self._get_cookie_basket(request, response, cookie_key, manager)
46 46
         if request.user.is_authenticated():
47 47
             basket, created = manager.get_or_create(owner=request.user)
48 48
             if anon_basket:
@@ -65,21 +65,21 @@ class BasketFactory(object):
65 65
     def _apply_offers_to_basket(self, request, basket):
66 66
         offer_utils.Applicator().apply(request, basket)
67 67
     
68
-    def _get_basket(self, request, cookie_key, manager):
68
+    def _get_basket(self, request, response, cookie_key, manager):
69 69
         u"""Returns a basket object given a cookie key and manager."""
70 70
         b = None
71 71
         if request.user.is_authenticated():
72 72
             try:
73 73
                 b = manager.get(owner=request.user)
74
-            except basket_models.Basket.DoesNotExist, e:
74
+            except basket_models.Basket.DoesNotExist:
75 75
                 pass
76 76
         else:
77
-            b = self._get_cookie_basket(request, cookie_key, manager)
77
+            b = self._get_cookie_basket(request, response, cookie_key, manager)
78 78
         if b:
79 79
             self._apply_offers_to_basket(request, b)
80 80
         return b    
81 81
         
82
-    def _get_cookie_basket(self, request, cookie_key, manager):
82
+    def _get_cookie_basket(self, request, response, cookie_key, manager):
83 83
         u"""Returns a basket based on the cookie key given."""
84 84
         b = None
85 85
         # If user is anonymous, their basket ID (if they have one) will be
@@ -90,7 +90,7 @@ class BasketFactory(object):
90 90
             if basket_hash == self._get_basket_hash(basket_id):
91 91
                 try:
92 92
                     b = manager.get(pk=basket_id, owner=None)
93
-                except basket_models.Basket.DoesNotExist, e:
93
+                except basket_models.Basket.DoesNotExist:
94 94
                     b = None
95 95
             else:
96 96
                 response.delete_cookie(cookie_key)

+ 1
- 4
oscar/apps/basket/models.py Parādīt failu

@@ -1,10 +1,7 @@
1 1
 from exceptions import Exception
2 2
 
3
-from django.core.signals import request_finished
4
-from django.dispatch import receiver
5
-
6 3
 from oscar.apps.basket.abstract_models import (AbstractBasket, AbstractLine, AbstractLineAttribute,
7
-                                          OPEN, MERGED, SAVED, SUBMITTED)
4
+                                               OPEN, MERGED, SAVED, SUBMITTED)
8 5
 
9 6
 
10 7
 class InvalidBasketLineError(Exception):

+ 5
- 9
oscar/apps/basket/tests.py Parādīt failu

@@ -2,18 +2,15 @@ from django.utils import unittest
2 2
 from django.test.client import Client
3 3
 from django.core.urlresolvers import reverse
4 4
 
5
-from oscar.apps.basket.models import * 
6
-from oscar.apps.product.models import Item, ItemClass
5
+from oscar.apps.basket.models import Basket, Line 
6
+from oscar.test.helpers import create_product
7 7
 
8 8
 
9 9
 class BasketModelTest(unittest.TestCase):
10 10
     
11 11
     def setUp(self):
12 12
         self.basket = Basket.objects.create()
13
-        
14
-        # Create a dummy product
15
-        ic,_ = ItemClass.objects.get_or_create(name='Dummy class')
16
-        self.dummy_product = Item.objects.create(title='Dummy product', item_class=ic)
13
+        self.dummy_product = create_product()
17 14
     
18 15
     def test_empty_baskets_have_zero_lines(self):
19 16
         self.assertTrue(Basket().num_lines == 0)
@@ -22,7 +19,7 @@ class BasketModelTest(unittest.TestCase):
22 19
         self.assertTrue(Basket().is_empty)
23 20
         
24 21
     def test_basket_have_with_one_line(self):
25
-        line = Line.objects.create(basket=self.basket, product=self.dummy_product)
22
+        Line.objects.create(basket=self.basket, product=self.dummy_product)
26 23
         self.assertTrue(self.basket.num_lines == 1)
27 24
         
28 25
     def test_add_product_creates_line(self):
@@ -46,8 +43,7 @@ class BasketViewsTest(unittest.TestCase):
46 43
         self.assertEquals(0, response.context['basket'].num_lines)
47 44
         
48 45
     def test_anonymous_add_to_basket_creates_cookie(self):
49
-        ic,_ = ItemClass.objects.get_or_create(name='Dummy class')
50
-        dummy_product = Item.objects.create(title='Dummy product', item_class=ic)
46
+        dummy_product = create_product()
51 47
         url = reverse('oscar-basket')
52 48
         post_params = {'product_id': dummy_product.id,
53 49
                        'action': 'add',

+ 5
- 4
oscar/apps/basket/urls.py Parādīt failu

@@ -1,15 +1,16 @@
1 1
 from django.conf.urls.defaults import *
2 2
 
3
-from oscar.apps.basket.views import BasketView, LineView, SavedLineView
3
+from oscar.core.loading import import_module
4
+basket_views = import_module('basket.views', ['BasketView', 'LineView', 'SavedLineView'])
4 5
 
5 6
 def line_view(request, *args, **kwargs):
6
-    return LineView()(request, *args, **kwargs)
7
+    return basket_views.LineView()(request, *args, **kwargs)
7 8
 
8 9
 def saved_line_view(request, *args, **kwargs):
9
-    return SavedLineView()(request, *args, **kwargs)
10
+    return basket_views.SavedLineView()(request, *args, **kwargs)
10 11
 
11 12
 def basket_view(request, *args, **kwargs):
12
-    return BasketView()(request, *args, **kwargs)
13
+    return basket_views.BasketView()(request, *args, **kwargs)
13 14
 
14 15
 urlpatterns = patterns('oscar.basket.views',
15 16
     url(r'^line/(?P<line_reference>[\w-]+)/$', line_view, name='oscar-basket-line'),

+ 6
- 7
oscar/apps/basket/views.py Parādīt failu

@@ -1,6 +1,5 @@
1
-from django.http import HttpResponse, Http404, HttpResponseRedirect, HttpResponseBadRequest
2
-from django.template import RequestContext
3
-from django.shortcuts import render_to_response, get_object_or_404, render
1
+from django.http import HttpResponseRedirect
2
+from django.shortcuts import get_object_or_404, render
4 3
 from django.core.urlresolvers import reverse
5 4
 from django.contrib import messages
6 5
 from django.core.exceptions import ObjectDoesNotExist
@@ -30,7 +29,7 @@ class BasketView(ModelView):
30 29
     
31 30
     def handle_GET(self, basket):
32 31
         u"""Handle GET requests against the basket"""
33
-        saved_basket = self.factory.get_saved_basket(self.request)
32
+        saved_basket = self.factory.get_saved_basket(self.request, self.response)
34 33
         self.response = render(self.request, self.template_file, locals())
35 34
         
36 35
     def handle_POST(self, basket):
@@ -116,7 +115,7 @@ class LineView(ModelView):
116 115
     
117 116
     def get_model(self):
118 117
         u"""Get basket lines"""
119
-        basket = self.factory.get_open_basket(self.request)
118
+        basket = self.factory.get_open_basket(self.request, self.response)
120 119
         return basket.lines.get(line_reference=self.kwargs['line_reference'])
121 120
         
122 121
     def handle_POST(self, line):
@@ -181,7 +180,7 @@ class SavedLineView(ModelView):
181 180
         self.factory = basket_factory.BasketFactory()
182 181
     
183 182
     def get_model(self):
184
-        basket = self.factory.get_saved_basket(self.request)
183
+        basket = self.factory.get_saved_basket(self.request, self.response)
185 184
         return basket.lines.get(line_reference=self.kwargs['line_reference'])
186 185
         
187 186
     def handle_POST(self, line):
@@ -189,7 +188,7 @@ class SavedLineView(ModelView):
189 188
         try:
190 189
             super(SavedLineView, self).handle_POST(line)
191 190
         except basket_models.InvalidBasketLineError, e:
192
-            messages.error(request, str(e))   
191
+            messages.error(self.request, str(e))   
193 192
             
194 193
     def do_move_to_basket(self, line):
195 194
         u"""Merge line items in to current basket"""

Notiek ielāde…
Atcelt
Saglabāt