Reviewers: ,


Please review this at http://codereview.tryton.org/902002/

Affected files:
  M trytond/modules/purchase/purchase.py
  M trytond/modules/sale/sale.py
  M trytond/modules/stock_lot/stock.py


Index: trytond/modules/purchase/purchase.py
===================================================================

--- a/trytond/modules/purchase/purchase.py
+++ b/trytond/modules/purchase/purchase.py
@@ -1766,24 +1766,22 @@
             ('purchase.line',)]

     @classmethod
-    def write(cls, moves, vals):
+    @ModelView.button
+    @Workflow.transition('cancel')
+    def cancel(cls, moves):
         pool = Pool()
         Purchase = pool.get('purchase.purchase')
         PurchaseLine = pool.get('purchase.line')

-        super(Move, cls).write(moves, vals)
-        if 'state' in vals and vals['state'] in ('cancel',):
-            purchases = set()
-            purchase_lines = PurchaseLine.search([
-                    ('moves', 'in', [m.id for m in moves]),
-                    ])
-            if purchase_lines:
-                for purchase_line in purchase_lines:
-                    purchases.add(purchase_line.purchase)
-            if purchases:
-                with Transaction().set_user(0, set_context=True):
-                    purchases = Purchase.browse([p.id for p in purchases])
-                    Purchase.process(purchases)
+        super(Move, cls).cancel(moves)
+        purchase_lines = PurchaseLine.search([
+                ('moves', 'in', [m.id for m in moves]),
+                ])
+        if purchase_lines:
+            purchase_ids = list(set(l.purchase.id for l in purchase_lines))
+            with Transaction().set_user(0, set_context=True):
+                purchases = Purchase.browse(purchase_ids)
+                Purchase.process(purchases)

     @classmethod
     def delete(cls, moves):

Index: trytond/modules/sale/sale.py
===================================================================

--- a/trytond/modules/sale/sale.py
+++ b/trytond/modules/sale/sale.py
@@ -1627,20 +1627,23 @@
         return ''

     @classmethod
-    def write(cls, moves, vals):
+    @ModelView.button
+    @Workflow.transition('cancel')
+    def cancel(cls, moves):
         pool = Pool()
         Sale = pool.get('sale.sale')
         SaleLine = pool.get('sale.line')

-        super(Move, cls).write(moves, vals)
-        if 'state' in vals and vals['state'] in ('cancel',):
-            with Transaction().set_user(0, set_context=True):
-                sale_lines = SaleLine.search([
-                        ('moves', 'in', [m.id for m in moves]),
-                        ])
-                if sale_lines:
-                    sales = list(set(l.sale for l in sale_lines))
-                    Sale.process(sales)
+        super(Move, cls).cancel(moves)
+
+        with Transaction().set_user(0, set_context=True):
+            sale_lines = SaleLine.search([
+                    ('moves', 'in', [m.id for m in moves]),
+                    ])
+            if sale_lines:
+                sale_ids = list(set(l.sale.id for l in sale_lines))
+                sales = Sale.browse(sale_ids)
+                Sale.process(sales)

     @classmethod
     def delete(cls, moves):

Index: trytond/modules/stock_lot/stock.py
===================================================================

--- a/trytond/modules/stock_lot/stock.py
+++ b/trytond/modules/stock_lot/stock.py
@@ -42,27 +42,20 @@
'lot_required': 'Lot is required for move of product "%s".',
                 })

-    @classmethod
-    def check_lot(cls, moves):
+    def check_lot(self):
         "Check if lot is required"
-        for move in moves:
-            if (move.state == 'done'
-                    and move.internal_quantity
-                    and not move.lot
-                    and move.product.lot_is_required(
-                        move.from_location, move.to_location)):
- cls.raise_user_error('lot_required', (move.product.rec_name,))
+        if (self.state == 'done'
+                and self.internal_quantity
+                and not self.lot
+                and self.product.lot_is_required(
+                    self.from_location, self.to_location)):
+            self.raise_user_error('lot_required', self.product.rec_name)

     @classmethod
-    def create(cls, vlist):
-        moves = super(Move, cls).create(vlist)
-        cls.check_lot(moves)
-        return moves
-
-    @classmethod
-    def write(cls, moves, values):
-        super(Move, cls).write(moves, values)
-        cls.check_lot(moves)
+    def validate(cls, moves):
+        super(Move, cls).validate(moves)
+        for move in moves:
+            move.check_lot()


 class ShipmentIn:



Reply via email to