浏览代码

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

master
Alexander Gaevsky 5 年前
父节点
当前提交
31c935cf1d
没有帐户链接到提交者的电子邮件

+ 9
- 4
src/oscar/apps/checkout/views.py 查看文件

@@ -2,6 +2,7 @@ import logging
2 2
 from urllib.parse import quote
3 3
 
4 4
 from django import http
5
+from django.conf import settings
5 6
 from django.contrib import messages
6 7
 from django.contrib.auth import login
7 8
 from django.shortcuts import redirect
@@ -659,7 +660,14 @@ class ThankYouView(generic.DetailView):
659 660
     template_name = 'oscar/checkout/thank_you.html'
660 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 671
         # We allow superusers to force an order thank-you page for testing
664 672
         order = None
665 673
         if self.request.user.is_superuser:
@@ -674,9 +682,6 @@ class ThankYouView(generic.DetailView):
674 682
             if 'checkout_order_id' in self.request.session:
675 683
                 order = Order._default_manager.get(
676 684
                     pk=self.request.session['checkout_order_id'])
677
-            else:
678
-                raise http.Http404(_("No order found"))
679
-
680 685
         return order
681 686
 
682 687
     def get_context_data(self, *args, **kwargs):

+ 8
- 7
tests/functional/checkout/test_customer_checkout.py 查看文件

@@ -1,5 +1,3 @@
1
-from http import client as http_client
2
-
3 1
 from django.urls import reverse
4 2
 
5 3
 from oscar.core.loading import get_class, get_model
@@ -201,10 +199,11 @@ class TestPlacingAnOrderUsingAnOffer(CheckoutMixin, WebTestCase):
201 199
 
202 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 203
         response = self.get(
206 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 208
     def tests_custumers_can_reach_the_thank_you_page(self):
210 209
         self.add_product_to_basket()
@@ -230,7 +229,7 @@ class TestThankYouView(CheckoutMixin, WebTestCase):
230 229
         response = self.get(test_url, status='*', user=user)
231 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 233
         self.add_product_to_basket()
235 234
         self.enter_shipping_address()
236 235
         self.place_order()
@@ -241,8 +240,10 @@ class TestThankYouView(CheckoutMixin, WebTestCase):
241 240
         test_url = '%s?order_number=%s' % (
242 241
             reverse('checkout:thank-you'), order.number)
243 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 246
         test_url = '%s?order_id=%s' % (reverse('checkout:thank-you'), order.pk)
247 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 查看文件

@@ -1,24 +1,32 @@
1
-from django.test import TestCase
2
-from django.test.utils import override_settings
3 1
 from django.urls import reverse
4 2
 
5 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 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')

正在加载...
取消
保存