|
|
@@ -1,6 +1,6 @@
|
|
1
|
1
|
from django.shortcuts import get_object_or_404
|
|
2
|
2
|
from django.contrib.auth.decorators import login_required
|
|
3
|
|
-from django.views.generic import ListView
|
|
|
3
|
+from django.views.generic import ListView, DetailView, UpdateView, DeleteView
|
|
4
|
4
|
from django.core.urlresolvers import reverse
|
|
5
|
5
|
from django.http import HttpResponseRedirect
|
|
6
|
6
|
from django.contrib import messages
|
|
|
@@ -10,55 +10,72 @@ from django.template.response import TemplateResponse
|
|
10
|
10
|
from oscar.apps.address.forms import UserAddressForm
|
|
11
|
11
|
from oscar.view.generic import ModelView
|
|
12
|
12
|
from oscar.core.loading import import_module
|
|
13
|
|
-import_module('address.models', ['UserAddress'], locals())
|
|
14
|
|
-import_module('order.models', ['Order', 'Line'], locals())
|
|
15
|
|
-import_module('basket.models', ['Basket'], locals())
|
|
|
13
|
+
|
|
16
|
14
|
import_module('basket.factory', ['BasketFactory'], locals())
|
|
17
|
15
|
|
|
18
|
|
-@login_required
|
|
19
|
|
-def profile(request):
|
|
20
|
|
- u"""Return a customers's profile"""
|
|
21
|
|
- # Load last 5 orders as preview
|
|
22
|
|
- orders = Order._default_manager.filter(user=request.user)[0:5]
|
|
23
|
|
- return TemplateResponse(request, 'oscar/customer/profile.html', {'orders': orders})
|
|
24
|
|
-
|
|
25
|
|
-
|
|
|
16
|
+from django.db.models import get_model
|
|
|
17
|
+
|
|
|
18
|
+order_model = get_model('order', 'Order')
|
|
|
19
|
+order_line_model = get_model('order', 'Line')
|
|
|
20
|
+basket_model = get_model('basket', 'Basket')
|
|
|
21
|
+user_address_model = get_model('address', 'UserAddress')
|
|
|
22
|
+
|
|
|
23
|
+
|
|
|
24
|
+class AccountSummaryView(ListView):
|
|
|
25
|
+ u"""Customer order history"""
|
|
|
26
|
+ context_object_name = "orders"
|
|
|
27
|
+ template_name = 'oscar/customer/profile.html'
|
|
|
28
|
+ paginate_by = 20
|
|
|
29
|
+ model = order_model
|
|
|
30
|
+
|
|
|
31
|
+ def get_queryset(self):
|
|
|
32
|
+ u"""Return a customer's orders"""
|
|
|
33
|
+ return self.model._default_manager.filter(user=self.request.user)[0:5]
|
|
|
34
|
+
|
|
|
35
|
+
|
|
26
|
36
|
class OrderHistoryView(ListView):
|
|
27
|
37
|
u"""Customer order history"""
|
|
28
|
38
|
context_object_name = "orders"
|
|
29
|
39
|
template_name = 'oscar/customer/order-history.html'
|
|
30
|
40
|
paginate_by = 20
|
|
|
41
|
+ model = order_model
|
|
31
|
42
|
|
|
32
|
43
|
def get_queryset(self):
|
|
33
|
44
|
u"""Return a customer's orders"""
|
|
34
|
|
- return Order._default_manager.filter(user=self.request.user)
|
|
|
45
|
+ return self.model._default_manager.filter(user=self.request.user)
|
|
35
|
46
|
|
|
36
|
47
|
|
|
37
|
|
-class OrderDetailView(ModelView):
|
|
|
48
|
+class OrderDetailView(DetailView):
|
|
38
|
49
|
u"""Customer order details"""
|
|
39
|
|
- template_file = "oscar/customer/order.html"
|
|
40
|
50
|
|
|
41
|
|
- def get_model(self):
|
|
42
|
|
- u"""Return an order object or 404"""
|
|
43
|
|
- return get_object_or_404(Order, user=self.request.user, number=self.kwargs['order_number'])
|
|
|
51
|
+ model = order_model
|
|
44
|
52
|
|
|
45
|
|
- def handle_GET(self, order):
|
|
46
|
|
- self.response = TemplateResponse(self.request, self.template_file, {'order': order})
|
|
47
|
|
-
|
|
|
53
|
+ def get_template_names(self):
|
|
|
54
|
+ return ["oscar/customer/order.html"]
|
|
|
55
|
+
|
|
|
56
|
+ def get_queryset(self):
|
|
|
57
|
+ return self.model._default_manager.filter(user=self.request.user)
|
|
|
58
|
+
|
|
|
59
|
+ def get_object(self):
|
|
|
60
|
+ try:
|
|
|
61
|
+ return self.get_queryset().get(number=self.kwargs['order_number'])
|
|
|
62
|
+ except self.model.DoesNotExist:
|
|
|
63
|
+ raise Http404()
|
|
|
64
|
+
|
|
48
|
65
|
|
|
49
|
66
|
class OrderLineView(ModelView):
|
|
50
|
67
|
u"""Customer order line"""
|
|
51
|
68
|
|
|
52
|
69
|
def get_model(self):
|
|
53
|
70
|
u"""Return an order object or 404"""
|
|
54
|
|
- order = get_object_or_404(Order, user=self.request.user, number=self.kwargs['order_number'])
|
|
|
71
|
+ order = get_object_or_404(order_model, user=self.request.user, number=self.kwargs['order_number'])
|
|
55
|
72
|
return order.lines.get(id=self.kwargs['line_id'])
|
|
56
|
73
|
|
|
57
|
74
|
def handle_GET(self, line):
|
|
58
|
|
- return HttpResponseRedirect(reverse('oscar-customer-order-view', kwargs={'order_number': line.order.number}))
|
|
|
75
|
+ return HttpResponseRedirect(reverse('customer:order', kwargs={'order_number': line.order.number}))
|
|
59
|
76
|
|
|
60
|
77
|
def handle_POST(self, line):
|
|
61
|
|
- self.response = HttpResponseRedirect(reverse('oscar-customer-order-view', kwargs={'order_number': line.order.number}))
|
|
|
78
|
+ self.response = HttpResponseRedirect(reverse('customer:order', kwargs={'order_number': line.order.number}))
|
|
62
|
79
|
super(OrderLineView, self).handle_POST(line)
|
|
63
|
80
|
|
|
64
|
81
|
def do_reorder(self, line):
|
|
|
@@ -69,7 +86,7 @@ class OrderLineView(ModelView):
|
|
69
|
86
|
# We need to pass response to the get_or_create... method
|
|
70
|
87
|
# as a new basket might need to be created
|
|
71
|
88
|
self.response = HttpResponseRedirect(reverse('oscar-basket'))
|
|
72
|
|
- basket = basket_factory.BasketFactory().get_or_create_open_basket(self.request, self.response)
|
|
|
89
|
+ basket = BasketFactory().get_or_create_open_basket(self.request, self.response)
|
|
73
|
90
|
|
|
74
|
91
|
# Convert line attributes into basket options
|
|
75
|
92
|
options = []
|
|
|
@@ -79,9 +96,8 @@ class OrderLineView(ModelView):
|
|
79
|
96
|
basket.add_product(line.product, 1, options)
|
|
80
|
97
|
messages.info(self.request, "Line reordered")
|
|
81
|
98
|
|
|
82
|
|
-
|
|
83
|
99
|
|
|
84
|
|
-class AddressBookView(ListView):
|
|
|
100
|
+class AddressListView(ListView):
|
|
85
|
101
|
u"""Customer address book"""
|
|
86
|
102
|
context_object_name = "addresses"
|
|
87
|
103
|
template_name = 'oscar/customer/address-book.html'
|
|
|
@@ -89,32 +105,28 @@ class AddressBookView(ListView):
|
|
89
|
105
|
|
|
90
|
106
|
def get_queryset(self):
|
|
91
|
107
|
u"""Return a customer's addresses"""
|
|
92
|
|
- return UserAddress._default_manager.filter(user=self.request.user)
|
|
|
108
|
+ return user_address_model._default_manager.filter(user=self.request.user)
|
|
|
109
|
+
|
|
|
110
|
+
|
|
|
111
|
+class AddressUpdateView(UpdateView):
|
|
|
112
|
+ form_class = UserAddressForm
|
|
|
113
|
+ model = user_address_model
|
|
93
|
114
|
|
|
|
115
|
+ def get_template_names(self):
|
|
|
116
|
+ return ["oscar/customer/address-form.html"]
|
|
94
|
117
|
|
|
95
|
|
-class AddressView(ModelView):
|
|
96
|
|
- u"""Customer address view"""
|
|
97
|
|
- template_file = "oscar/customer/address-form.html"
|
|
|
118
|
+ def get_form_class(self):
|
|
|
119
|
+ return self.form_class
|
|
98
|
120
|
|
|
99
|
|
- def get_model(self):
|
|
100
|
|
- u"""Return an address object or a 404"""
|
|
101
|
|
- return get_object_or_404(UserAddress, user=self.request.user, pk=self.kwargs['address_id'])
|
|
|
121
|
+ def get_success_url(self):
|
|
|
122
|
+ return reverse('customer:address', kwargs={'pk': self.get_object().pk })
|
|
|
123
|
+
|
|
|
124
|
+
|
|
|
125
|
+class AddressDeleteView(DeleteView):
|
|
|
126
|
+ model = user_address_model
|
|
102
|
127
|
|
|
103
|
|
- def handle_GET(self, address):
|
|
104
|
|
- form = UserAddressForm(instance=address)
|
|
105
|
|
- self.response = TemplateResponse(self.request, self.template_file, {'form': form})
|
|
106
|
|
-
|
|
107
|
|
- def do_save(self, address):
|
|
108
|
|
- u"""Save an address"""
|
|
109
|
|
- form = UserAddressForm(self.request.POST, instance=address)
|
|
110
|
|
- if form.is_valid():
|
|
111
|
|
- a = form.save()
|
|
112
|
|
- self.response = HttpResponseRedirect(reverse('oscar-customer-address-book'))
|
|
113
|
|
- else:
|
|
114
|
|
- self.response = TemplateResponse(self.request, self.template_file, {'form': form})
|
|
115
|
|
-
|
|
116
|
|
- def do_delete(self, address):
|
|
117
|
|
- u"""Delete an address"""
|
|
118
|
|
- address.delete()
|
|
119
|
|
- self.response = HttpResponseRedirect(reverse('oscar-customer-address-book'))
|
|
120
|
|
-
|
|
|
128
|
+ def get_success_url(self):
|
|
|
129
|
+ return reverse('customer:address-list')
|
|
|
130
|
+
|
|
|
131
|
+ def get_template_names(self):
|
|
|
132
|
+ return ["oscar/customer/address-delete.html"]
|