Преглед на файлове

Fix handling of missing lines in wishlist views (#3053)

master
dfirst преди 6 години
родител
ревизия
3cd865a4c5
променени са 2 файла, в които са добавени 51 реда и са изтрити 15 реда
  1. 24
    15
      src/oscar/apps/customer/wishlists/views.py
  2. 27
    0
      tests/functional/customer/test_wishlists.py

+ 24
- 15
src/oscar/apps/customer/wishlists/views.py Целия файл

@@ -1,7 +1,6 @@
1 1
 # -*- coding: utf-8 -*-
2 2
 from django.contrib import messages
3
-from django.core.exceptions import (
4
-    MultipleObjectsReturned, ObjectDoesNotExist, PermissionDenied)
3
+from django.core.exceptions import ObjectDoesNotExist, PermissionDenied
5 4
 from django.http import Http404
6 5
 from django.shortcuts import get_object_or_404, redirect
7 6
 from django.urls import reverse
@@ -252,12 +251,24 @@ class LineMixin(object):
252 251
     """
253 252
 
254 253
     def fetch_line(self, user, wishlist_key, line_pk=None, product_pk=None):
255
-        self.wishlist = WishList._default_manager.get(
256
-            owner=user, key=wishlist_key)
257 254
         if line_pk is not None:
258
-            self.line = self.wishlist.lines.get(pk=line_pk)
255
+            self.line = get_object_or_404(
256
+                Line,
257
+                pk=line_pk,
258
+                wishlist__owner=user,
259
+                wishlist__key=wishlist_key,
260
+            )
259 261
         else:
260
-            self.line = self.wishlist.lines.get(product_id=product_pk)
262
+            try:
263
+                self.line = get_object_or_404(
264
+                    Line,
265
+                    product_id=product_pk,
266
+                    wishlist__owner=user,
267
+                    wishlist__key=wishlist_key,
268
+                )
269
+            except Line.MultipleObjectsReturned:
270
+                raise Http404
271
+        self.wishlist = self.line.wishlist
261 272
         self.product = self.line.product
262 273
 
263 274
 
@@ -270,8 +281,11 @@ class WishListRemoveProduct(LineMixin, PageTitleMixin, DeleteView):
270 281
 
271 282
     def get_object(self, queryset=None):
272 283
         self.fetch_line(
273
-            self.request.user, self.kwargs['key'],
274
-            self.kwargs.get('line_pk'), self.kwargs.get('product_pk'))
284
+            self.request.user,
285
+            self.kwargs['key'],
286
+            self.kwargs.get('line_pk'),
287
+            self.kwargs.get('product_pk')
288
+        )
275 289
         return self.line
276 290
 
277 291
     def get_context_data(self, **kwargs):
@@ -300,13 +314,8 @@ class WishListRemoveProduct(LineMixin, PageTitleMixin, DeleteView):
300 314
 class WishListMoveProductToAnotherWishList(LineMixin, View):
301 315
 
302 316
     def dispatch(self, request, *args, **kwargs):
303
-        try:
304
-            self.fetch_line(request.user, kwargs['key'],
305
-                            line_pk=kwargs['line_pk'])
306
-        except (ObjectDoesNotExist, MultipleObjectsReturned):
307
-            raise Http404
308
-        return super().dispatch(
309
-            request, *args, **kwargs)
317
+        self.fetch_line(request.user, kwargs['key'], line_pk=kwargs['line_pk'])
318
+        return super().dispatch(request, *args, **kwargs)
310 319
 
311 320
     def get(self, request, *args, **kwargs):
312 321
         to_wishlist = get_object_or_404(

+ 27
- 0
tests/functional/customer/test_wishlists.py Целия файл

@@ -61,3 +61,30 @@ class TestMoveProductToAnotherWishList(WishListTestMixin, WebTestCase):
61 61
         self.get(url)
62 62
         self.assertEqual(self.wishlist1.lines.filter(product=self.product).count(), 0)
63 63
         self.assertEqual(self.wishlist2.lines.filter(product=self.product).count(), 1)
64
+        # Test WishList doesnt contain line and return 404
65
+        self.assertEqual(self.get(url, expect_errors=True).status_code, 404)
66
+
67
+
68
+class TestWishListRemoveProduct(WishListTestMixin, WebTestCase):
69
+
70
+    def setUp(self):
71
+        super().setUp()
72
+        self.wishlist = WishListFactory(owner=self.user)
73
+        self.wishlist.add(self.product)
74
+        self.line = self.wishlist.lines.get(product=self.product)
75
+
76
+    def test_remove_wishlist_line(self):
77
+        delete_wishlist_line_url = reverse_lazy(
78
+            'customer:wishlists-remove-product', kwargs={'key': self.wishlist.key, 'line_pk': self.line.pk}
79
+        )
80
+        self.get(delete_wishlist_line_url).forms[0].submit()
81
+        # Test WishList doesnt contain line and return 404
82
+        self.assertEqual(self.get(delete_wishlist_line_url, expect_errors=True).status_code, 404)
83
+
84
+    def test_remove_wishlist_product(self):
85
+        delete_wishlist_product_url = reverse_lazy(
86
+            'customer:wishlists-remove-product', kwargs={'key': self.wishlist.key, 'product_pk': self.line.product.id}
87
+        )
88
+        self.get(delete_wishlist_product_url).forms[0].submit()
89
+        # Test WishList doesnt contain line and return 404
90
+        self.assertEqual(self.get(delete_wishlist_product_url, expect_errors=True).status_code, 404)

Loading…
Отказ
Запис