[FIX] stock: a view location cannot contain any quant

This commit is contained in:
Simon Lejeune
2017-11-07 14:01:33 +01:00
parent d0e1650042
commit 2fe84fd217
3 changed files with 40 additions and 2 deletions
+7
View File
@@ -66,6 +66,7 @@ class Location(models.Model):
removal_strategy_id = fields.Many2one('product.removal', 'Removal Strategy', help="Defines the default method used for suggesting the exact location (shelf) where to take the products from, which lot etc. for this location. This method can be enforced at the product category level, and a fallback is made on the parent locations if none is set here.")
putaway_strategy_id = fields.Many2one('product.putaway', 'Put Away Strategy', help="Defines the default method used for suggesting the exact location (shelf) where to store the products. This method can be enforced at the product category level, and a fallback is made on the parent locations if none is set here.")
barcode = fields.Char('Barcode', copy=False, oldname='loc_barcode')
quant_ids = fields.One2many('stock.quant', 'location_id')
_sql_constraints = [('barcode_company_uniq', 'unique (barcode,company_id)', 'The barcode for a location must be unique per company !')]
@@ -80,6 +81,12 @@ class Location(models.Model):
name = '%s/%s' % (current.name, name)
self.complete_name = name
def write(self, values):
if 'usage' in values and values['usage'] == 'view':
if self.mapped('quant_ids'):
raise UserError(_("This location's usage cannot be changed to view as it contains products."))
return super(Location, self).write(values)
def name_get(self):
ret_list = []
for location in self:
+6
View File
@@ -80,6 +80,12 @@ class StockQuant(models.Model):
if quant.in_date and not quant.lot_id:
raise ValidationError(_('An incoming date cannot be set to an untracked product.'))
@api.constrains('location_id')
def check_location_id(self):
for quant in self:
if quant.location_id.usage == 'view':
raise ValidationError(_('A product cannot be stored in a "view" location.'))
@api.one
def _compute_name(self):
self.name = '%s: %s%s' % (self.lot_id.name or self.product_id.code or '', self.quantity, self.product_id.uom_id.name)
+27 -2
View File
@@ -1,12 +1,12 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from datetime import datetime, timedelta
from odoo.exceptions import ValidationError
from odoo.tests.common import TransactionCase
from odoo.exceptions import AccessError, UserError
from datetime import datetime, timedelta
class StockQuant(TransactionCase):
def setUp(self):
@@ -275,6 +275,31 @@ class StockQuant(TransactionCase):
self.assertEqual(self.env['stock.quant']._get_available_quantity(product2, stock_location), 2.0)
self.assertEqual(self.env['stock.quant']._get_available_quantity(product2, stock_sub_location), 1.0)
def test_increase_available_quantity_6(self):
""" Increasing the available quantity in a view location should be forbidden.
"""
stock_location = self.env.ref('stock.stock_location_stock')
location1 = self.env['stock.location'].create({
'name': 'viewloc1',
'usage': 'view',
'location_id': stock_location.id,
})
product1 = self.env['product.product'].create({
'name': 'Product A',
'type': 'product',
})
with self.assertRaises(ValidationError):
self.env['stock.quant']._update_available_quantity(product1, location1, 1.0)
def test_increase_available_quantity_7(self):
""" Setting a location's usage as "view" should be forbidden if it already
contains quant.
"""
stock_location = self.env.ref('stock.stock_location_stock')
self.assertTrue(len(stock_location.quant_ids.ids) > 0)
with self.assertRaises(UserError):
stock_location.usage = 'view'
def test_decrease_available_quantity_1(self):
""" Decrease the available quantity when no quants are already in a location.
"""