From 62cfe860e159515b2437db200d94c412bc1339c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Krier?= Date: Sat, 23 Mar 2013 15:41:42 +0100 Subject: [PATCH] Use unique shipment and origin on Move issue2642 review717002 --- sale.py | 42 +++++++++++++++++++++++++++++++++++++----- stock.py | 30 +++++++++++++++++++----------- 2 files changed, 56 insertions(+), 16 deletions(-) diff --git a/sale.py b/sale.py index eb89ac2d5b..40ffad373d 100644 --- a/sale.py +++ b/sale.py @@ -22,8 +22,9 @@ class Sale: 'get_drop_shipments') def get_drop_shipments(self, name): - return list(set(m.shipment_drop.id for l in self.lines for m in l.moves - if m.shipment_drop)) + DropShipment = Pool().get('stock.shipment.drop') + return list(set(m.shipment.id for l in self.lines for m in l.moves + if isinstance(m.shipment, DropShipment))) def create_shipment(self, shipment_type): shipments = super(Sale, self).create_shipment(shipment_type) @@ -147,7 +148,38 @@ class SaleLine: if line.purchase_request.purchase_line: moves = [m for m in line.purchase_request.purchase_line.moves - if m.state == 'draft' and not m.shipment_drop] - for move in moves: - move.sale_line = self + if m.state == 'draft' and not m.shipment] return moves + + @classmethod + def read(cls, ids, fields_names=None): + # Add moves from purchase_request as they can have only one origin + PurchaseRequest = Pool().get('purchase.request') + added = False + if 'moves' in fields_names or []: + if 'purchase_request' not in fields_names: + fields_names = fields_names[:] + fields_names.append('purchase_request') + added = True + values = super(SaleLine, cls).read(ids, fields_names=fields_names) + if 'moves' in fields_names or []: + with Transaction().set_user(0, set_context=True): + purchase_requests = PurchaseRequest.browse( + list(set(v['purchase_request'] + for v in values if v['purchase_request']))) + id2purchase_requests = dict((p.id, p) + for p in purchase_requests) + for value in values: + if value['purchase_request']: + purchase_request = id2purchase_requests[ + value['purchase_request']] + if purchase_request.purchase_line: + move_ids = tuple(m.id + for m in purchase_request.purchase_line.moves) + if value['moves'] is None: + value['moves'] = move_ids + else: + value['moves'] += move_ids + if added: + del value['purchase_request'] + return values diff --git a/stock.py b/stock.py index 15636baed0..f504f9e6b4 100644 --- a/stock.py +++ b/stock.py @@ -67,9 +67,9 @@ class ShipmentDrop(Workflow, ModelSQL, ModelView): }, domain=[('party', '=', Eval('customer'))], depends=['state', 'customer']) - moves = fields.One2Many('stock.move', 'shipment_drop', 'Moves', + moves = fields.One2Many('stock.move', 'shipment', 'Moves', add_remove=[ - ('shipment_drop', '=', False), + ('shipment', '=', None), ('state', '=', 'draft'), ('supplier', '=', Eval('supplier')), ('customer_drop', '=', Eval('customer')), @@ -229,12 +229,14 @@ class ShipmentDrop(Workflow, ModelSQL, ModelView): @ModelView.button @Workflow.transition('draft') def draft(cls, shipments): - Move = Pool().get('stock.move') + pool = Pool() + Move = pool.get('stock.move') + PurchaseLine = pool.get('purchase.line') + SaleLine = pool.get('sale.line') for shipment in shipments: for move in shipment.moves: if (move.state == 'cancel' - and (move.purchase_line - or move.sale_line)): + and isinstance(move.origin, (PurchaseLine, SaleLine))): cls.raise_user_error('reset_move', (move.rec_name,)) Move.draft([m for s in shipments for m in s.moves]) @@ -260,17 +262,23 @@ class ShipmentDrop(Workflow, ModelSQL, ModelView): class Move: __name__ = 'stock.move' - shipment_drop = fields.Many2One('stock.shipment.drop', 'Drop Shipment', - readonly=True, select=1, ondelete='CASCADE', - domain=[('company', '=', Eval('company'))], depends=['company']) customer_drop = fields.Function(fields.Many2One('party.party', 'Drop Customer'), 'get_customer_drop', searcher='search_customer_drop') + @classmethod + def _get_shipment(cls): + models = super(Move, cls)._get_shipment() + models.append('stock.shipment.drop') + return models + def get_customer_drop(self, name): - if self.purchase_line and self.purchase_line.purchase.customer: - return self.purchase_line.purchase.customer.id + PurchaseLine = Pool().get('purchase.line') + if (isinstance(self.origin, PurchaseLine) + and self.origin.purchase.customer): + return self.origin.purchase.customer.id @classmethod def search_customer_drop(cls, name, clause): - return [('purchase_line.purchase.customer',) + tuple(clause[1:])] + return [('origin.purchase.customer',) + tuple(clause[1:]) + + ('purchase.line',)]