Просмотр исходного кода

Similar to the ProductApplication, CustomerApplication ties all of the customer views and URLs into a single class which can be extended. We get some lovely URL namespacing for free.

master
Andrew Ingram 14 лет назад
Родитель
Сommit
5507007c8e

+ 34
- 0
oscar/apps/customer/__init__.py Просмотреть файл

@@ -0,0 +1,34 @@
1
+from django.conf.urls.defaults import patterns, url, include
2
+from django.contrib.auth.decorators import login_required
3
+from oscar.apps.customer.views import AccountSummaryView, OrderHistoryView, \
4
+    OrderHistoryView, OrderDetailView, OrderLineView, AddressListView, AddressUpdateView, AddressDeleteView
5
+from oscar.core.application import Application
6
+
7
+class CustomerApplication(Application):
8
+    name = 'customer'
9
+    summary_view = AccountSummaryView
10
+    order_history_view = OrderHistoryView
11
+    order_detail_view = OrderDetailView
12
+    order_line_view = OrderLineView
13
+    address_list_view = AddressListView
14
+    address_update_view = AddressUpdateView
15
+    address_delete_view = AddressDeleteView 
16
+
17
+    def get_urls(self):
18
+        urlpatterns = patterns('django.contrib.auth.views',
19
+            url(r'^login/$', 'login', {'template_name': 'admin/login.html'}, name='login'),
20
+            url(r'^logout/$', 'login', name='logout'),
21
+        )
22
+        
23
+        urlpatterns += patterns('',
24
+            url(r'^$', login_required(self.summary_view.as_view()), name='summary'),
25
+            url(r'^orders/$', login_required(self.order_history_view.as_view()), name='order-list'),
26
+            url(r'^orders/(?P<order_number>[\w-]*)/$', login_required(self.order_detail_view.as_view()), name='order'),
27
+            url(r'^orders/(?P<order_number>[\w-]*)/(?P<line_id>\w+)$', login_required(self.order_line_view), name='order-line'),
28
+            url(r'^addresses/$', login_required(self.address_list_view.as_view()), name='address-list'),
29
+            url(r'^addresses/(?P<pk>\d+)/$', login_required(self.address_update_view.as_view()), name='address'),
30
+            url(r'^addresses/(?P<pk>\d+)/delete/$', login_required(self.address_delete_view.as_view()), name='address-delete'),            
31
+        )
32
+        return urlpatterns
33
+
34
+application = CustomerApplication()

+ 0
- 21
oscar/apps/customer/urls.py Просмотреть файл

@@ -1,21 +0,0 @@
1
-from django.conf.urls.defaults import *
2
-from django.contrib.auth.decorators import login_required
3
-
4
-from oscar.core.decorators import class_based_view
5
-from oscar.core.loading import import_module
6
-import_module('customer.views', ['OrderHistoryView', 'OrderDetailView', 'OrderLineView',
7
-                                 'AddressBookView', 'AddressView'], locals())
8
-
9
-urlpatterns = patterns('django.contrib.auth.views',
10
-    url(r'^login/$', 'login', {'template_name': 'admin/login.html'}, name='oscar-customer-login'),
11
-    url(r'^logout/$', 'login', name='oscar-customer-logout'),
12
-)
13
-
14
-urlpatterns += patterns('oscar.apps.customer.views',
15
-    url(r'^profile/$', 'profile', name='oscar-customer-profile'),
16
-    url(r'^order-history/$', OrderHistoryView.as_view(), name='oscar-customer-order-history'),
17
-    url(r'^order/(?P<order_number>[\w-]*)/$', login_required(class_based_view(OrderDetailView)), name='oscar-customer-order-view'),
18
-    url(r'^order/(?P<order_number>[\w-]*)/line/(?P<line_id>\w+)$', login_required(class_based_view(OrderLineView)), name='oscar-customer-order-line'),
19
-    url(r'^address-book/$', AddressBookView.as_view(), name='oscar-customer-address-book'),
20
-    url(r'^address/(?P<address_id>\d+)/$', login_required(class_based_view(AddressView)), name='oscar-customer-address'),
21
-)

+ 64
- 52
oscar/apps/customer/views.py Просмотреть файл

@@ -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"]

+ 1
- 1
oscar/templates/layout.html Просмотреть файл

@@ -14,7 +14,7 @@
14 14
             </form>
15 15
             
16 16
             {% if user.is_authenticated %}
17
-                <a href="{% url oscar-customer-profile %}">Profile</a>
17
+                <a href="{% url customer:summary %}">Profile</a>
18 18
                 <a href="">Logout</a>
19 19
             {% else %}
20 20
                 <a href="">Login</a>

+ 2
- 2
oscar/templates/oscar/checkout/gateway.html Просмотреть файл

@@ -9,7 +9,7 @@
9 9
 
10 10
 <dl>
11 11
     <dt>
12
-        <a href="">Register</a> or <a href="{% url oscar-customer-login %}">log-in</a>
12
+        <a href="">Register</a> or <a href="{% url customer:login %}">log-in</a>
13 13
     </dt>
14 14
     <dl>
15 15
         <p>Logging in now will give you access to your address book and ensure your
@@ -22,7 +22,7 @@
22 22
         <p>You can checkout without signing in or registering.  You will be given the opportunity to 
23 23
            register when checkout is complete.</p>
24 24
     </dl>
25
-</ol>
25
+</dl>
26 26
 
27 27
 {% endblock content %}
28 28
 

+ 2
- 6
oscar/templates/oscar/customer/address-book.html Просмотреть файл

@@ -14,12 +14,8 @@
14 14
     {% for address in addresses %}
15 15
     <li>
16 16
         {{ address.summary }}
17
-        <a href="{% url oscar-customer-address address.id %}">Edit</a> | 
18
-        <form action="{% url oscar-customer-address address.id %}" method="post">
19
-            {% csrf_token %}
20
-            <input type="hidden" name="action" value="delete" />
21
-            <input type="submit" value="Delete" />
22
-        </form>
17
+        <a href="{% url customer:address address.id %}">Edit</a> | 
18
+		<a href="{% url customer:address-delete address.id %}">Delete</a>
23 19
     </li>
24 20
     {% endfor %}
25 21
 </ul>

+ 20
- 0
oscar/templates/oscar/customer/address-delete.html Просмотреть файл

@@ -0,0 +1,20 @@
1
+{% extends "layout.html" %}
2
+
3
+{% load currency_filters %}
4
+
5
+{% block header %}
6
+<h2>Address book</h2>
7
+{% endblock header %}
8
+
9
+
10
+{% block content %}
11
+
12
+<h3>Confirm address deletion</h3>
13
+<form action="." method="post">
14
+    {% csrf_token %}
15
+    {{ form.as_p }}
16
+    <input type="submit" value="Delete address" />
17
+</form>
18
+
19
+{% endblock content %}
20
+

+ 1
- 2
oscar/templates/oscar/customer/address-form.html Просмотреть файл

@@ -10,9 +10,8 @@
10 10
 {% block content %}
11 11
 
12 12
 <h3>Edit address</h3>
13
-<form action="{% url oscar-customer-address address.id %}" method="post">
13
+<form action="." method="post">
14 14
     {% csrf_token %}
15
-    <input type="hidden" name="action" value="save" />
16 15
     {{ form.as_p }}
17 16
     <input type="submit" value="Save address" />
18 17
 </form>

+ 1
- 1
oscar/templates/oscar/customer/order-history.html Просмотреть файл

@@ -24,7 +24,7 @@
24 24
         <td>{{ order.total_incl_tax|currency }}</td>
25 25
         <td>{{ order.date_placed }}</td>
26 26
         <td>
27
-            <a href="{% url oscar-customer-order-view order.number %}">View order details</a>
27
+            <a href="{% url customer:order order.number %}">View order details</a>
28 28
         </td>
29 29
     </tr>
30 30
     {% endfor %}

+ 1
- 1
oscar/templates/oscar/customer/order.html Просмотреть файл

@@ -58,7 +58,7 @@
58 58
         <td>{{ line.line_price_before_discounts_incl_tax|currency }}</td>
59 59
         <td>{{ line.shipping_status }}</td>
60 60
         <td>
61
-            <form action="{% url oscar-customer-order-line order.number line.id %}" method="POST">
61
+            <form action="{% url customer:order-line order.number line.id %}" method="POST">
62 62
                 {% csrf_token %}
63 63
                 <input type="hidden" name="action" value="reorder" />
64 64
                 <input type="submit" value="Re-order" />

+ 3
- 3
oscar/templates/oscar/customer/profile.html Просмотреть файл

@@ -24,12 +24,12 @@
24 24
         <td>{{ order.total_incl_tax|currency }}</td>
25 25
         <td>{{ order.date_placed }}</td>
26 26
         <td>
27
-            <a href="{% url oscar-customer-order-view order.number %}">View</a>
27
+            <a href="{% url customer:order order.number %}">View</a>
28 28
         </td>
29 29
     </tr>
30 30
     {% endfor %}
31 31
 </table>
32
-<p><a href="{% url oscar-customer-order-history %}">View order history</a></p>
32
+<p><a href="{% url customer:order-list %}">View order history</a></p>
33 33
 
34 34
 
35 35
 
@@ -37,7 +37,7 @@
37 37
 
38 38
 <h3>Account settings</h3>
39 39
 <ul>
40
-    <li><a href="{% url oscar-customer-address-book %}">Manage address book</a></li>
40
+    <li><a href="{% url customer:address-list %}">Manage address book</a></li>
41 41
     <li><a href="">Change password</a></li>
42 42
 </ul>
43 43
 

+ 2
- 1
oscar/urls.py Просмотреть файл

@@ -2,13 +2,14 @@ from django.conf.urls.defaults import *
2 2
 from django.conf import settings
3 3
 
4 4
 from oscar.apps.product import application as products_app
5
+from oscar.apps.customer import application as customer_app
5 6
 
6 7
 urlpatterns = patterns('',
7 8
     (r'products/', include(products_app.urls)),
8 9
     (r'basket/', include('oscar.apps.basket.urls')),
9 10
     (r'checkout/', include('oscar.apps.checkout.urls')),
10 11
     (r'order-management/', include('oscar.apps.order_management.urls')),
11
-    (r'accounts/', include('oscar.apps.customer.urls')),
12
+    (r'accounts/', include(customer_app.urls)),
12 13
     (r'promotions/', include('oscar.apps.promotions.urls')),
13 14
     (r'reports/', include('oscar.apps.reports.urls')),
14 15
     (r'search/', include('oscar.apps.search.urls')),

Загрузка…
Отмена
Сохранить