From c6d897dadbe208c774b9274e568b003c713b950c Mon Sep 17 00:00:00 2001 From: Yannick Vaucher Date: Mon, 1 Sep 2014 15:24:57 +0200 Subject: [PATCH 01/17] reactivate module stock_reserve --- {__unported__/stock_reserve => stock_reserve}/__init__.py | 0 {__unported__/stock_reserve => stock_reserve}/__openerp__.py | 2 +- .../stock_reserve => stock_reserve}/data/stock_data.xml | 0 {__unported__/stock_reserve => stock_reserve}/model/__init__.py | 0 {__unported__/stock_reserve => stock_reserve}/model/product.py | 0 .../stock_reserve => stock_reserve}/model/stock_reserve.py | 0 .../security/ir.model.access.csv | 0 .../stock_reserve => stock_reserve}/test/stock_reserve.yml | 0 {__unported__/stock_reserve => stock_reserve}/view/product.xml | 0 .../stock_reserve => stock_reserve}/view/stock_reserve.xml | 0 10 files changed, 1 insertion(+), 1 deletion(-) rename {__unported__/stock_reserve => stock_reserve}/__init__.py (100%) rename {__unported__/stock_reserve => stock_reserve}/__openerp__.py (98%) rename {__unported__/stock_reserve => stock_reserve}/data/stock_data.xml (100%) rename {__unported__/stock_reserve => stock_reserve}/model/__init__.py (100%) rename {__unported__/stock_reserve => stock_reserve}/model/product.py (100%) rename {__unported__/stock_reserve => stock_reserve}/model/stock_reserve.py (100%) rename {__unported__/stock_reserve => stock_reserve}/security/ir.model.access.csv (100%) rename {__unported__/stock_reserve => stock_reserve}/test/stock_reserve.yml (100%) rename {__unported__/stock_reserve => stock_reserve}/view/product.xml (100%) rename {__unported__/stock_reserve => stock_reserve}/view/stock_reserve.xml (100%) diff --git a/__unported__/stock_reserve/__init__.py b/stock_reserve/__init__.py similarity index 100% rename from __unported__/stock_reserve/__init__.py rename to stock_reserve/__init__.py diff --git a/__unported__/stock_reserve/__openerp__.py b/stock_reserve/__openerp__.py similarity index 98% rename from __unported__/stock_reserve/__openerp__.py rename to stock_reserve/__openerp__.py index 99fafbd1f..61684f3c8 100644 --- a/__unported__/stock_reserve/__openerp__.py +++ b/stock_reserve/__openerp__.py @@ -54,5 +54,5 @@ exceeded if the reservations are canceled. 'auto_install': False, 'test': ['test/stock_reserve.yml', ], - 'installable': False, + 'installable': True, } diff --git a/__unported__/stock_reserve/data/stock_data.xml b/stock_reserve/data/stock_data.xml similarity index 100% rename from __unported__/stock_reserve/data/stock_data.xml rename to stock_reserve/data/stock_data.xml diff --git a/__unported__/stock_reserve/model/__init__.py b/stock_reserve/model/__init__.py similarity index 100% rename from __unported__/stock_reserve/model/__init__.py rename to stock_reserve/model/__init__.py diff --git a/__unported__/stock_reserve/model/product.py b/stock_reserve/model/product.py similarity index 100% rename from __unported__/stock_reserve/model/product.py rename to stock_reserve/model/product.py diff --git a/__unported__/stock_reserve/model/stock_reserve.py b/stock_reserve/model/stock_reserve.py similarity index 100% rename from __unported__/stock_reserve/model/stock_reserve.py rename to stock_reserve/model/stock_reserve.py diff --git a/__unported__/stock_reserve/security/ir.model.access.csv b/stock_reserve/security/ir.model.access.csv similarity index 100% rename from __unported__/stock_reserve/security/ir.model.access.csv rename to stock_reserve/security/ir.model.access.csv diff --git a/__unported__/stock_reserve/test/stock_reserve.yml b/stock_reserve/test/stock_reserve.yml similarity index 100% rename from __unported__/stock_reserve/test/stock_reserve.yml rename to stock_reserve/test/stock_reserve.yml diff --git a/__unported__/stock_reserve/view/product.xml b/stock_reserve/view/product.xml similarity index 100% rename from __unported__/stock_reserve/view/product.xml rename to stock_reserve/view/product.xml diff --git a/__unported__/stock_reserve/view/stock_reserve.xml b/stock_reserve/view/stock_reserve.xml similarity index 100% rename from __unported__/stock_reserve/view/stock_reserve.xml rename to stock_reserve/view/stock_reserve.xml From 292fd2aa668c312499b46d48a4851681e4c0310f Mon Sep 17 00:00:00 2001 From: Yannick Vaucher Date: Mon, 1 Sep 2014 17:06:30 +0200 Subject: [PATCH 02/17] port models and method to api 8.0 --- stock_reserve/model/product.py | 29 ++--- stock_reserve/model/stock_reserve.py | 179 +++++++++++++-------------- 2 files changed, 103 insertions(+), 105 deletions(-) diff --git a/stock_reserve/model/product.py b/stock_reserve/model/product.py index fd3aca601..dfdb170ca 100644 --- a/stock_reserve/model/product.py +++ b/stock_reserve/model/product.py @@ -19,22 +19,23 @@ # ############################################################################## -from openerp.osv import orm +from openerp import models, api -class product_product(orm.Model): +class ProductProduct(models.Model): _inherit = 'product.product' - def open_stock_reservation(self, cr, uid, ids, context=None): - assert len(ids) == 1, "Expected 1 ID, got %r" % ids - mod_obj = self.pool.get('ir.model.data') - act_obj = self.pool.get('ir.actions.act_window') - get_ref = mod_obj.get_object_reference - __, action_id = get_ref(cr, uid, 'stock_reserve', - 'action_stock_reservation') - action = act_obj.read(cr, uid, action_id, context=context) - action['context'] = {'search_default_draft': 1, - 'search_default_reserved': 1, - 'default_product_id': ids[0], - 'search_default_product_id': ids[0]} + @api.multi + def open_stock_reservation(self): + assert len(self._ids) == 1, "Expected 1 ID, got %r" % self._ids + data_obj = self.env['ir.model.data'] + act_obj = self.env['ir.actions.act_window'] + ref = 'stock_reserve.action_stock_reservation' + action = data_obj.xmlid_to_object(ref) + action_dict = action.read() + action_dict['context'] = { + 'search_default_draft': 1, + 'search_default_reserved': 1, + 'default_product_id': self._ids[0], + 'search_default_product_id': self._ids[0]} return action diff --git a/stock_reserve/model/stock_reserve.py b/stock_reserve/model/stock_reserve.py index 3dbf09094..ce374219d 100644 --- a/stock_reserve/model/stock_reserve.py +++ b/stock_reserve/model/stock_reserve.py @@ -19,11 +19,12 @@ # ############################################################################## -from openerp.osv import orm, fields +from openerp import models, fields, api +from openerp.exceptions import except_orm from openerp.tools.translate import _ -class stock_reservation(orm.Model): +class StockReservation(models.Model): """ Allow to reserve products. The fields mandatory for the creation of a reservation are: @@ -49,41 +50,40 @@ class stock_reservation(orm.Model): _description = 'Stock Reservation' _inherits = {'stock.move': 'move_id'} - _columns = { - 'move_id': fields.many2one('stock.move', - 'Reservation Move', - required=True, - readonly=True, - ondelete='cascade', - select=1), - 'date_validity': fields.date('Validity Date'), - } + move_id = fields.Many2one( + 'stock.move', + 'Reservation Move', + required=True, + readonly=True, + ondelete='cascade', + select=1) + date_validity = fields.Date('Validity Date') - def get_location_from_ref(self, cr, uid, ref, context=None): + @api.model + def get_location_from_ref(self, ref): """ Get a location from a xmlid if allowed :param ref: tuple (module, xmlid) """ - location_obj = self.pool.get('stock.location') - data_obj = self.pool.get('ir.model.data') - get_ref = data_obj.get_object_reference + data_obj = self.env['ir.model.data'] try: - __, location_id = get_ref(cr, uid, *ref) - location_obj.check_access_rule(cr, uid, [location_id], - 'read', context=context) - except (orm.except_orm, ValueError): + location = data_obj.xmlid_to_object(ref, raise_if_not_found=True) + location.check_access_rule('read') + location_id = location.id + except (except_orm, ValueError): location_id = False return location_id - def _default_location_id(self, cr, uid, context=None): - if context is None: - context = {} - move_obj = self.pool.get('stock.move') - context['picking_type'] = 'internal' - return move_obj._default_location_source(cr, uid, context=context) + @api.model + def _default_location_id(self): + move_obj = self.env['stock.move'] + return (move_obj + .with_context(picking_type='internal') + ._default_location_source()) - def _default_location_dest_id(self, cr, uid, context=None): - ref = ('stock_reserve', 'stock_location_reservation') - return self.get_location_from_ref(cr, uid, ref, context=context) + @api.model + def _default_location_dest_id(self): + ref = 'stock_reserve.stock_location_reservation' + return self.get_location_from_ref(ref) _defaults = { 'type': 'internal', @@ -92,90 +92,87 @@ class stock_reservation(orm.Model): 'product_qty': 1.0, } - def reserve(self, cr, uid, ids, context=None): + @api.multi + def reserve(self): """ Confirm a reservation The reservation is done using the default UOM of the product. A date until which the product is reserved can be specified. """ - move_obj = self.pool.get('stock.move') - reservations = self.browse(cr, uid, ids, context=context) - move_ids = [reserv.move_id.id for reserv in reservations] - move_obj.write(cr, uid, move_ids, - {'date_expected': fields.datetime.now()}, - context=context) - move_obj.action_confirm(cr, uid, move_ids, context=context) - move_obj.force_assign(cr, uid, move_ids, context=context) + move_recs = self.move_id + move_recs.date_expected = fields.Datetime.now() + move_recs.action_confirm() + move_recs.force_assign() return True - def release(self, cr, uid, ids, context=None): - if isinstance(ids, (int, long)): - ids = [ids] - reservations = self.read(cr, uid, ids, ['move_id'], - context=context, load='_classic_write') - move_obj = self.pool.get('stock.move') - move_ids = [reserv['move_id'] for reserv in reservations] - move_obj.action_cancel(cr, uid, move_ids, context=context) + @api.multi + def release(self): + """ + Releas moves from reservation + """ + move_recs = self.move_id + move_recs.action_cancel() return True - def release_validity_exceeded(self, cr, uid, ids=None, context=None): + @api.model + def release_validity_exceeded(self, ids=None): """ Release all the reservation having an exceeded validity date """ domain = [('date_validity', '<', fields.date.today()), ('state', '=', 'assigned')] if ids: domain.append(('id', 'in', ids)) - reserv_ids = self.search(cr, uid, domain, context=context) - self.release(cr, uid, reserv_ids, context=context) + reserv_ids = self.search(domain) + self.release(reserv_ids) return True - def unlink(self, cr, uid, ids, context=None): + @api.multi + def unlink(self): """ Release the reservation before the unlink """ - self.release(cr, uid, ids, context=context) - return super(stock_reservation, self).unlink(cr, uid, ids, - context=context) + self.release() + return super(StockReservation, self).unlink() - def onchange_product_id(self, cr, uid, ids, - product_id=False, - context=None): - move_obj = self.pool.get('stock.move') - if ids: - reserv = self.read(cr, uid, ids, ['move_id'], context=context, - load='_classic_write') - move_ids = [rv['move_id'] for rv in reserv] - else: - move_ids = [] - result = move_obj.onchange_product_id( - cr, uid, move_ids, prod_id=product_id, loc_id=False, - loc_dest_id=False, partner_id=False) - if result.get('value'): - # only keep the existing fields on the view - keep = ('product_uom', 'name') - result['value'] = dict((key, value) for key, value in - result['value'].iteritems() if - key in keep) - return result + # XXX + #def onchange_product_id(self, cr, uid, ids, product_id=False, context=None + #): + #move_obj = self.pool.get('stock.move') + #if ids: + #reserv = self.read(cr, uid, ids, ['move_id'], context=context, + #load='_classic_write') + #move_ids = [rv['move_id'] for rv in reserv] + #else: + #move_ids = [] + #result = move_obj.onchange_product_id( + #cr, uid, move_ids, prod_id=product_id, loc_id=False, + #loc_dest_id=False, partner_id=False) + #if result.get('value'): + #vals = result['value'] + ## only keep the existing fields on the view + #keep = ('product_uom', 'name') + #result['value'] = dict((key, value) for key, value in + #result['value'].iteritems() if + #key in keep) + #return result - def onchange_quantity(self, cr, uid, ids, - product_id, - product_qty, - context=None): - """ On change of product quantity avoid negative quantities """ - if not product_id or product_qty <= 0.0: - return {'value': {'product_qty': 0.0}} - return {} + # XXX + #def onchange_quantity(self, cr, uid, ids, product_id, product_qty, + #context=None): + #""" On change of product quantity avoid negative quantities """ + #if not product_id or product_qty <= 0.0: + #return {'value': {'product_qty': 0.0}} + #return {} - def open_move(self, cr, uid, ids, context=None): - assert len(ids) == 1, "1 ID expected, got %r" % ids - reserv = self.read(cr, uid, ids[0], ['move_id'], context=context, - load='_classic_write') - mod_obj = self.pool.get('ir.model.data') - act_obj = self.pool.get('ir.actions.act_window') - get_ref = mod_obj.get_object_reference - __, action_id = get_ref(cr, uid, 'stock', 'action_move_form2') - action = act_obj.read(cr, uid, action_id, context=context) - action['name'] = _('Reservation Move') + @api.multi + def open_move(self): + assert len(self._ids) == 1, "1 ID expected, got %r" % self._ids + reserv = self[0].move_id + data_obj = self.env['ir.model.data'] + ref_form2 = 'stock.action_move_form2' + action = data_obj.xmlid_to_object(ref_form2) + action_dict = action.read() + action_dict['name'] = _('Reservation Move') # open directly in the form view - __, view_id = get_ref(cr, uid, 'stock', 'view_move_form') + ref_form = 'stock.view_move_form' + view_id = data_obj.xmlid_to_res_id(ref_form) action['views'] = [(view_id, 'form')] action['res_id'] = reserv['move_id'] return action From d2f0e22bcc1a6e2f0ecb7cfd4bc99ecd52645b67 Mon Sep 17 00:00:00 2001 From: Yannick Vaucher Date: Mon, 1 Sep 2014 17:20:11 +0200 Subject: [PATCH 03/17] port onchanges --- stock_reserve/model/stock_reserve.py | 51 +++++++++++++--------------- stock_reserve/view/stock_reserve.xml | 8 ++--- 2 files changed, 25 insertions(+), 34 deletions(-) diff --git a/stock_reserve/model/stock_reserve.py b/stock_reserve/model/stock_reserve.py index ce374219d..0fee171af 100644 --- a/stock_reserve/model/stock_reserve.py +++ b/stock_reserve/model/stock_reserve.py @@ -131,35 +131,30 @@ class StockReservation(models.Model): self.release() return super(StockReservation, self).unlink() - # XXX - #def onchange_product_id(self, cr, uid, ids, product_id=False, context=None - #): - #move_obj = self.pool.get('stock.move') - #if ids: - #reserv = self.read(cr, uid, ids, ['move_id'], context=context, - #load='_classic_write') - #move_ids = [rv['move_id'] for rv in reserv] - #else: - #move_ids = [] - #result = move_obj.onchange_product_id( - #cr, uid, move_ids, prod_id=product_id, loc_id=False, - #loc_dest_id=False, partner_id=False) - #if result.get('value'): - #vals = result['value'] - ## only keep the existing fields on the view - #keep = ('product_uom', 'name') - #result['value'] = dict((key, value) for key, value in - #result['value'].iteritems() if - #key in keep) - #return result + @api.onchange('product_id') + def _onchange_product_id(self): + """ set product_uom and name from product onchange """ + # save value before reading of self.move_id as this last one erase + # product_id value + product = self.product_id + # WARNING this gettattr erase self.product_id + move = self.move_id + result = move.onchange_product_id( + prod_id=product.id, loc_id=False, loc_dest_id=False, + partner_id=False) + if result.get('value'): + vals = result['value'] + # only keep the existing fields on the view + self.name = vals.get('name') + self.product_uom = vals.get('product_uom') + # repeat assignation of product_id so we don't loose it + self.product_id = product.id - # XXX - #def onchange_quantity(self, cr, uid, ids, product_id, product_qty, - #context=None): - #""" On change of product quantity avoid negative quantities """ - #if not product_id or product_qty <= 0.0: - #return {'value': {'product_qty': 0.0}} - #return {} + @api.onchange('product_uom_qty') + def _onchange_quantity(self): + """ On change of product quantity avoid negative quantities """ + if not self.product_id or self.product_qty <= 0.0: + self.product_qty = 0.0 @api.multi def open_move(self): diff --git a/stock_reserve/view/stock_reserve.xml b/stock_reserve/view/stock_reserve.xml index a15d08c8c..1ea5f795a 100644 --- a/stock_reserve/view/stock_reserve.xml +++ b/stock_reserve/view/stock_reserve.xml @@ -23,14 +23,10 @@ - + - + Stock Reservations stock.reservation ir.actions.act_window - form {'search_default_draft': 1, @@ -128,7 +127,7 @@ - From 2cec2e50fff646a12b35690ccf12cbcf4995470f Mon Sep 17 00:00:00 2001 From: Yannick Vaucher Date: Mon, 1 Sep 2014 20:31:53 +0200 Subject: [PATCH 07/17] replace product_qty by product_uom_qty --- stock_reserve/model/stock_reserve.py | 8 ++++---- stock_reserve/test/stock_reserve.yml | 2 +- stock_reserve/view/stock_reserve.xml | 6 +++--- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/stock_reserve/model/stock_reserve.py b/stock_reserve/model/stock_reserve.py index 4508a0720..145f37e52 100644 --- a/stock_reserve/model/stock_reserve.py +++ b/stock_reserve/model/stock_reserve.py @@ -30,7 +30,7 @@ class StockReservation(models.Model): The fields mandatory for the creation of a reservation are: * product_id - * product_qty + * product_uom_qty * product_uom * name @@ -102,7 +102,7 @@ class StockReservation(models.Model): 'picking_type_id': _default_picking_type_id, 'location_id': _default_location_id, 'location_dest_id': _default_location_dest_id, - 'product_qty': 1.0, + 'product_uom_qty': 1.0, } @api.multi @@ -166,8 +166,8 @@ class StockReservation(models.Model): @api.onchange('product_uom_qty') def _onchange_quantity(self): """ On change of product quantity avoid negative quantities """ - if not self.product_id or self.product_qty <= 0.0: - self.product_qty = 0.0 + if not self.product_id or self.product_uom_qty <= 0.0: + self.product_uom_qty = 0.0 @api.multi def open_move(self): diff --git a/stock_reserve/test/stock_reserve.yml b/stock_reserve/test/stock_reserve.yml index 5cd92e29f..ec63834d8 100644 --- a/stock_reserve/test/stock_reserve.yml +++ b/stock_reserve/test/stock_reserve.yml @@ -36,7 +36,7 @@ - !record {model: stock.reservation, id: reserv_sorbet1}: product_id: product_sorbet - product_qty: 5.0 + product_uom_qty: 5.0 product_uom: product.product_uom_kgm name: reserve 5 kgm of sorbet for test - diff --git a/stock_reserve/view/stock_reserve.xml b/stock_reserve/view/stock_reserve.xml index ad69446cf..7ee9cbdd3 100644 --- a/stock_reserve/view/stock_reserve.xml +++ b/stock_reserve/view/stock_reserve.xml @@ -24,9 +24,9 @@ -