소스 검색

Fix broken basket "save for later" functionality

Regression introduced in cca43aa4d1
master
Joseph Wayodi 6 년 전
부모
커밋
ac319b78df
3개의 변경된 파일63개의 추가작업 그리고 1개의 파일을 삭제
  1. 5
    0
      docs/source/releases/v2.1.rst
  2. 1
    1
      src/oscar/apps/basket/views.py
  3. 57
    0
      tests/functional/test_basket.py

+ 5
- 0
docs/source/releases/v2.1.rst 파일 보기

@@ -31,6 +31,11 @@ What's new in Oscar 2.1?
31 31
   Django doesn't generate migrations if a project modifies the ``OSCAR_IMAGE_FOLDER``
32 32
   to specify a custom directory structure for uploaded images.
33 33
 
34
+Bug fixes
35
+~~~~~~~~~
36
+
37
+- Fixed a bug in the handling of requests to save an item in the basket for
38
+  later(:issue:`3215`).
34 39
 
35 40
 Removal of deprecated features
36 41
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

+ 1
- 1
src/oscar/apps/basket/views.py 파일 보기

@@ -156,7 +156,7 @@ class BasketView(ModelFormSetView):
156 156
 
157 157
         for form in formset:
158 158
             if (hasattr(form, 'cleaned_data')
159
-                    and getattr(form.cleaned_data, 'save_for_later', False)):
159
+                    and form.cleaned_data.get('save_for_later', False)):
160 160
                 line = form.instance
161 161
                 if self.request.user.is_authenticated:
162 162
                     self.move_line_to_saved_basket(line)

+ 57
- 0
tests/functional/test_basket.py 파일 보기

@@ -145,6 +145,63 @@ class BasketReportTests(TestCase):
145 145
 class SavedBasketTests(WebTestCase):
146 146
     csrf_checks = False
147 147
 
148
+    def test_moving_to_saved_basket_creates_new(self):
149
+        self.user = factories.UserFactory()
150
+        product = factories.ProductFactory()
151
+        basket = factories.BasketFactory(owner=self.user)
152
+        basket.add_product(product)
153
+
154
+        response = self.get(reverse('basket:summary'))
155
+        formset = response.context['formset']
156
+        form = formset.forms[0]
157
+
158
+        data = {
159
+            formset.add_prefix('INITIAL_FORMS'): 1,
160
+            formset.add_prefix('TOTAL_FORMS'): 1,
161
+            formset.add_prefix('MIN_FORMS'): 0,
162
+            formset.add_prefix('MAX_NUM_FORMS'): 1,
163
+            form.add_prefix('id'): form.instance.pk,
164
+            form.add_prefix('quantity'): form.initial['quantity'],
165
+            form.add_prefix('save_for_later'): True,
166
+        }
167
+        response = self.post(reverse('basket:summary'), params=data)
168
+
169
+        self.assertRedirects(response, reverse('basket:summary'))
170
+        self.assertFalse(Basket.open.get(pk=basket.pk).lines.exists())
171
+        self.assertEqual(Basket.saved.get(owner=self.user).lines.get(
172
+            product=product).quantity, 1)
173
+
174
+    def test_moving_to_saved_basket_updates_existing(self):
175
+        self.user = factories.UserFactory()
176
+        product = factories.ProductFactory()
177
+
178
+        basket = factories.BasketFactory(owner=self.user)
179
+        basket.add_product(product)
180
+
181
+        saved_basket = factories.BasketFactory(owner=self.user,
182
+                                               status=Basket.SAVED)
183
+        saved_basket.add_product(product)
184
+
185
+        response = self.get(reverse('basket:summary'))
186
+        formset = response.context['formset']
187
+        form = formset.forms[0]
188
+
189
+        data = {
190
+            formset.add_prefix('INITIAL_FORMS'): 1,
191
+            formset.add_prefix('TOTAL_FORMS'): 1,
192
+            formset.add_prefix('MIN_FORMS'): 0,
193
+            formset.add_prefix('MAX_NUM_FORMS'): 1,
194
+            form.add_prefix('id'): form.instance.pk,
195
+            form.add_prefix('quantity'): form.initial['quantity'],
196
+            form.add_prefix('save_for_later'): True,
197
+        }
198
+        response = self.post(reverse('basket:summary'), params=data)
199
+
200
+        self.assertRedirects(response, reverse('basket:summary'))
201
+        self.assertFalse(Basket.open.get(pk=basket.pk).lines.exists())
202
+        self.assertEqual(Basket.saved.get(pk=saved_basket.pk).lines.get(
203
+            product=product).quantity, 2)
204
+
148 205
     def test_moving_from_saved_basket(self):
149 206
         self.user = User.objects.create_user(username='test', password='pass',
150 207
                                              email='test@example.com')

Loading…
취소
저장