Quellcode durchsuchen

Change checkout thank you view to redirect to the homepage if order not found in the session. (#3506)

master
Alexander Gaevsky vor 5 Jahren
Ursprung
Commit
31c935cf1d
Es ist kein Account mit der E-Mail-Adresse des Committers verbunden

+ 9
- 4
src/oscar/apps/checkout/views.py Datei anzeigen

2
 from urllib.parse import quote
2
 from urllib.parse import quote
3
 
3
 
4
 from django import http
4
 from django import http
5
+from django.conf import settings
5
 from django.contrib import messages
6
 from django.contrib import messages
6
 from django.contrib.auth import login
7
 from django.contrib.auth import login
7
 from django.shortcuts import redirect
8
 from django.shortcuts import redirect
659
     template_name = 'oscar/checkout/thank_you.html'
660
     template_name = 'oscar/checkout/thank_you.html'
660
     context_object_name = 'order'
661
     context_object_name = 'order'
661
 
662
 
662
-    def get_object(self):
663
+    def get(self, request, *args, **kwargs):
664
+        self.object = self.get_object()
665
+        if self.object is None:
666
+            return redirect(settings.OSCAR_HOMEPAGE)
667
+        context = self.get_context_data(object=self.object)
668
+        return self.render_to_response(context)
669
+
670
+    def get_object(self, queryset=None):
663
         # We allow superusers to force an order thank-you page for testing
671
         # We allow superusers to force an order thank-you page for testing
664
         order = None
672
         order = None
665
         if self.request.user.is_superuser:
673
         if self.request.user.is_superuser:
674
             if 'checkout_order_id' in self.request.session:
682
             if 'checkout_order_id' in self.request.session:
675
                 order = Order._default_manager.get(
683
                 order = Order._default_manager.get(
676
                     pk=self.request.session['checkout_order_id'])
684
                     pk=self.request.session['checkout_order_id'])
677
-            else:
678
-                raise http.Http404(_("No order found"))
679
-
680
         return order
685
         return order
681
 
686
 
682
     def get_context_data(self, *args, **kwargs):
687
     def get_context_data(self, *args, **kwargs):

+ 8
- 7
tests/functional/checkout/test_customer_checkout.py Datei anzeigen

1
-from http import client as http_client
2
-
3
 from django.urls import reverse
1
 from django.urls import reverse
4
 
2
 
5
 from oscar.core.loading import get_class, get_model
3
 from oscar.core.loading import get_class, get_model
201
 
199
 
202
 class TestThankYouView(CheckoutMixin, WebTestCase):
200
 class TestThankYouView(CheckoutMixin, WebTestCase):
203
 
201
 
204
-    def tests_gets_a_404_when_there_is_no_order(self):
202
+    def tests_gets_a_302_when_there_is_no_order(self):
205
         response = self.get(
203
         response = self.get(
206
             reverse('checkout:thank-you'), user=self.user, status="*")
204
             reverse('checkout:thank-you'), user=self.user, status="*")
207
-        self.assertEqual(http_client.NOT_FOUND, response.status_code)
205
+        self.assertIsRedirect(response)
206
+        self.assertRedirectsTo(response, 'catalogue:index')
208
 
207
 
209
     def tests_custumers_can_reach_the_thank_you_page(self):
208
     def tests_custumers_can_reach_the_thank_you_page(self):
210
         self.add_product_to_basket()
209
         self.add_product_to_basket()
230
         response = self.get(test_url, status='*', user=user)
229
         response = self.get(test_url, status='*', user=user)
231
         self.assertIsOk(response)
230
         self.assertIsOk(response)
232
 
231
 
233
-    def test_users_cannot_force_an_other_custumer_order(self):
232
+    def test_users_cannot_force_an_other_customer_order(self):
234
         self.add_product_to_basket()
233
         self.add_product_to_basket()
235
         self.enter_shipping_address()
234
         self.enter_shipping_address()
236
         self.place_order()
235
         self.place_order()
241
         test_url = '%s?order_number=%s' % (
240
         test_url = '%s?order_number=%s' % (
242
             reverse('checkout:thank-you'), order.number)
241
             reverse('checkout:thank-you'), order.number)
243
         response = self.get(test_url, status='*', user=user)
242
         response = self.get(test_url, status='*', user=user)
244
-        self.assertEqual(response.status_code, http_client.NOT_FOUND)
243
+        self.assertIsRedirect(response)
244
+        self.assertRedirectsTo(response, 'catalogue:index')
245
 
245
 
246
         test_url = '%s?order_id=%s' % (reverse('checkout:thank-you'), order.pk)
246
         test_url = '%s?order_id=%s' % (reverse('checkout:thank-you'), order.pk)
247
         response = self.get(test_url, status='*', user=user)
247
         response = self.get(test_url, status='*', user=user)
248
-        self.assertEqual(response.status_code, http_client.NOT_FOUND)
248
+        self.assertIsRedirect(response)
249
+        self.assertRedirectsTo(response, 'catalogue:index')

+ 23
- 15
tests/integration/checkout/test_views.py Datei anzeigen

1
-from django.test import TestCase
2
-from django.test.utils import override_settings
3
 from django.urls import reverse
1
 from django.urls import reverse
4
 
2
 
5
 from oscar.test.factories import OrderFactory
3
 from oscar.test.factories import OrderFactory
4
+from oscar.test.testcases import WebTestCase
6
 
5
 
7
 
6
 
8
-class ThankYouViewTestCase(TestCase):
7
+class ThankYouViewTestCase(WebTestCase):
8
+    is_anonymous = False
9
 
9
 
10
-    @override_settings(OSCAR_ALLOW_ANON_CHECKOUT=True)
11
     def test_analytics_event_triggered_only_on_first_view(self):
10
     def test_analytics_event_triggered_only_on_first_view(self):
12
-        order = OrderFactory()
13
-        session = self.client.session
14
-        # Put the order ID in the session, mimicking a completed order,
15
-        # so that we can reach the thank you page.
16
-        session['checkout_order_id'] = order.pk
17
-        session.save()
11
+        with self.settings(OSCAR_ALLOW_ANON_CHECKOUT=True):
12
+            url = reverse('checkout:thank-you')
13
+            order = OrderFactory()
14
+            session = self.client.session
15
+            # Put the order ID in the session, mimicking a completed order,
16
+            # so that we can reach the thank you page.
17
+            session['checkout_order_id'] = order.pk
18
+            session.save()
18
 
19
 
19
-        r1 = self.client.get(reverse('checkout:thank-you'), follow=True)
20
-        self.assertTrue(r1.context['send_analytics_event'])
20
+            r1 = self.client.get(url, follow=True)
21
+            self.assertTrue(r1.context['send_analytics_event'])
21
 
22
 
22
-        # Request the view a second time
23
-        r2 = self.client.get(reverse('checkout:thank-you'), follow=True)
24
-        self.assertFalse(r2.context['send_analytics_event'])
23
+            # Request the view a second time
24
+            r2 = self.client.get(url, follow=True)
25
+            self.assertFalse(r2.context['send_analytics_event'])
26
+
27
+    def test_missing_order_id_in_the_session(self):
28
+        with self.settings(OSCAR_ALLOW_ANON_CHECKOUT=True):
29
+            url = reverse('checkout:thank-you')
30
+            response = self.app.get(url)
31
+            self.assertIsRedirect(response)
32
+            self.assertRedirectsTo(response, 'catalogue:index')

Laden…
Abbrechen
Speichern