Browse Source

Only change order line status when status is available (#3948)

* Only change order line status when status is available
It's possible for lines to have a completely different status than the order.
When a line is at an "end status" where it cannot change anymore this will result in the line being changed to something you might not want.

* line status test
master
Viggo de Vries 2 years ago
parent
commit
7651cb54ff
No account linked to committer's email address

+ 4
- 2
src/oscar/apps/order/abstract_models.py View File

134
                    'status': self.status})
134
                    'status': self.status})
135
         self.status = new_status
135
         self.status = new_status
136
         if new_status in self.cascade:
136
         if new_status in self.cascade:
137
+            new_line_status = self.cascade[new_status]
137
             for line in self.lines.all():
138
             for line in self.lines.all():
138
-                line.status = self.cascade[self.status]
139
-                line.save()
139
+                if new_line_status in line.available_statuses():
140
+                    line.status = new_line_status
141
+                    line.save()
140
         self.save()
142
         self.save()
141
 
143
 
142
         # Send signal for handling status changed
144
         # Send signal for handling status changed

+ 8
- 1
tests/integration/order/test_models.py View File

79
         self.order.set_status('SHIPPED')
79
         self.order.set_status('SHIPPED')
80
         self.assertEqual('SHIPPED', self.order.status)
80
         self.assertEqual('SHIPPED', self.order.status)
81
 
81
 
82
-    def test_cascading_status_change(self):
82
+    def test_cascading_line_status_not_allowed(self):
83
+        self.order = create_order(status='PENDING')
84
+        self.order.set_status('SHIPPED')
85
+        for line in self.order.lines.all():
86
+            self.assertEqual('a', line.status)
87
+
88
+    def test_cascading_status_change_allowed(self):
89
+        Line.pipeline['a'] = ('SHIPPED',)
83
         self.order = create_order(status='PENDING')
90
         self.order = create_order(status='PENDING')
84
         self.order.set_status('SHIPPED')
91
         self.order.set_status('SHIPPED')
85
         for line in self.order.lines.all():
92
         for line in self.order.lines.all():

Loading…
Cancel
Save