Sfoglia il codice sorgente

Optimize range products reordering (#4010)

* feat :star: optimize range products reordering

* test :white_check_mark: add test to verify range product reordering

* fix :wrench: remove local settings from test settings

* test :white_check_mark: update product reordering test
master
Samar Hassan 2 anni fa
parent
commit
93978d9c0b
Nessun account collegato all'indirizzo email del committer

+ 8
- 6
src/oscar/apps/dashboard/ranges/views.py Vedi File

@@ -222,9 +222,11 @@ class RangeReorderView(View):
222 222
         """
223 223
         Save the order of the products within range.
224 224
         """
225
-        range = get_object_or_404(Range, pk=self.kwargs['pk'])
226
-        for index, item in enumerate(order):
227
-            entry = RangeProduct.objects.get(range=range, product__pk=item)
228
-            if entry.display_order != index:
229
-                entry.display_order = index
230
-                entry.save()
225
+        range_products = RangeProduct.objects.filter(
226
+            range_id=self.kwargs['pk'], product_id__in=order
227
+        )
228
+        for range_product in range_products:
229
+            range_product.display_order = order.index(
230
+                str(range_product.product_id)
231
+            )
232
+        RangeProduct.objects.bulk_update(range_products, ["display_order"])

+ 27
- 0
tests/functional/dashboard/test_range.py Vedi File

@@ -1,3 +1,5 @@
1
+import random
2
+
1 3
 from django.contrib.messages.constants import SUCCESS, WARNING
2 4
 from django.test import TestCase
3 5
 from django.urls import reverse
@@ -207,3 +209,28 @@ class RangeProductViewTest(WebTestCase):
207 209
         self.assertTrue(self.range.contains_product(self.child1))
208 210
         self.assertTrue(self.range.contains_product(self.child2))
209 211
         self.assertFalse(self.range.contains_product(self.parent))
212
+
213
+
214
+class RangeReorderViewTest(WebTestCase):
215
+    is_staff = True
216
+    csrf_checks = False
217
+
218
+    def setUp(self):
219
+        super().setUp()
220
+        self.range = Range.objects.create(name='dummy')
221
+        self.url = reverse('dashboard:range-reorder', args=(self.range.id,))
222
+        self.product1 = create_product()
223
+        self.product2 = create_product()
224
+        self.product3 = create_product()
225
+        self.range.included_products.set([
226
+            self.product1, self.product2, self.product3])
227
+
228
+    def test_range_product_reordering(self):
229
+        product_order = list(self.range.rangeproduct_set.values_list(
230
+            'product_id', flat=True))
231
+        random.shuffle(product_order)
232
+        data = {'product': product_order}
233
+        self.post(self.url, params=data)
234
+        new_product_order = list(self.range.rangeproduct_set.values_list(
235
+            'product_id', flat=True).order_by('display_order'))
236
+        self.assertEqual(new_product_order, product_order)

Loading…
Annulla
Salva