Sfoglia il codice sorgente

missing pagination on offer dashboard views

during development of large ecommerce site we ran into an exception
when accessing the list of offers and ranges:

AttributeError 'NoneType' object has no attribute 'paginator'
django_rangepaginator/templatetags/rangepaginator.py in paginate at line 12

This PR fixes all cases I could find where this happens, but chances are
some views need the same fix.
master
Paul J Stevens 8 anni fa
parent
commit
df1d2faf49

+ 3
- 0
src/oscar/apps/dashboard/offers/views.py Vedi File

@@ -1,5 +1,6 @@
1 1
 import json
2 2
 
3
+from django.conf import settings
3 4
 from django.contrib import messages
4 5
 from django.core import serializers
5 6
 from django.core.serializers.json import DjangoJSONEncoder
@@ -32,6 +33,7 @@ class OfferListView(ListView):
32 33
     context_object_name = 'offers'
33 34
     template_name = 'dashboard/offers/offer_list.html'
34 35
     form_class = OfferSearchForm
36
+    paginate_by = settings.OSCAR_DASHBOARD_ITEMS_PER_PAGE
35 37
 
36 38
     def get_queryset(self):
37 39
         qs = self.model._default_manager.exclude(
@@ -333,6 +335,7 @@ class OfferDetailView(ListView):
333 335
     model = OrderDiscount
334 336
     template_name = 'dashboard/offers/offer_detail.html'
335 337
     context_object_name = 'order_discounts'
338
+    paginate_by = settings.OSCAR_DASHBOARD_ITEMS_PER_PAGE
336 339
 
337 340
     def dispatch(self, request, *args, **kwargs):
338 341
         self.offer = get_object_or_404(ConditionalOffer, pk=kwargs['pk'])

+ 2
- 0
src/oscar/apps/dashboard/ranges/views.py Vedi File

@@ -28,6 +28,7 @@ class RangeListView(ListView):
28 28
     model = Range
29 29
     context_object_name = 'ranges'
30 30
     template_name = 'dashboard/ranges/range_list.html'
31
+    paginate_by = settings.OSCAR_DASHBOARD_ITEMS_PER_PAGE
31 32
 
32 33
 
33 34
 class RangeCreateView(CreateView):
@@ -97,6 +98,7 @@ class RangeProductListView(BulkEditMixin, ListView):
97 98
     context_object_name = 'products'
98 99
     actions = ('remove_selected_products', 'add_products')
99 100
     form_class = RangeProductForm
101
+    paginate_by = settings.OSCAR_DASHBOARD_ITEMS_PER_PAGE
100 102
 
101 103
     def post(self, request, *args, **kwargs):
102 104
         self.object_list = self.get_queryset()

+ 67
- 0
tests/integration/dashboard/test_offer_views.py Vedi File

@@ -0,0 +1,67 @@
1
+
2
+import pytest
3
+
4
+from oscar.apps.dashboard.offers import views as offer_views
5
+from oscar.apps.dashboard.ranges import views as range_views
6
+from oscar.core.loading import get_model
7
+from oscar.test.factories import catalogue, offer
8
+
9
+Range = get_model('offer', 'Range')
10
+ConditionalOffer = get_model('offer', 'ConditionalOffer')
11
+
12
+
13
+@pytest.fixture
14
+def many_ranges():
15
+    for i in range(0, 30):
16
+        offer.RangeFactory()
17
+    return Range.objects.all()
18
+
19
+
20
+@pytest.fixture
21
+def many_offers():
22
+    for i in range(0, 30):
23
+        offer.ConditionalOfferFactory(
24
+            name='Test offer %d' % i
25
+        )
26
+
27
+
28
+@pytest.fixture
29
+def range_with_products():
30
+    productrange = offer.RangeFactory()
31
+    for i in range(0, 30):
32
+        product = catalogue.ProductFactory()
33
+        productrange.add_product(product)
34
+    return productrange
35
+
36
+
37
+@pytest.mark.django_db
38
+class TestDashboardOffers:
39
+
40
+    def test_range_list_view(self, rf, many_ranges):
41
+        request = rf.get('/')
42
+        view = range_views.RangeListView.as_view()
43
+        response = view(request)
44
+        # if these are missing the pagination is broken
45
+        assert response.context_data['paginator']
46
+        assert response.context_data['page_obj']
47
+        assert response.status_code == 200
48
+
49
+    def test_offer_list_view(self, rf, many_offers):
50
+        request = rf.get('/')
51
+        view = offer_views.OfferListView.as_view()
52
+        response = view(request)
53
+        # if these are missing the pagination is broken
54
+        assert response.context_data['paginator']
55
+        assert response.context_data['page_obj']
56
+        assert response.status_code == 200
57
+
58
+    def test_range_product_list_view(self, rf, range_with_products):
59
+        view = range_views.RangeProductListView.as_view()
60
+        pk = range_with_products.pk
61
+
62
+        request = rf.get('/')
63
+        response = view(request, pk=pk)
64
+        # if these are missing the pagination is broken
65
+        assert response.context_data['paginator']
66
+        assert response.context_data['page_obj']
67
+        assert response.status_code == 200

Loading…
Annulla
Salva