diff --git a/setup/stock_location_lockdown/odoo/addons/stock_location_lockdown b/setup/stock_location_lockdown/odoo/addons/stock_location_lockdown new file mode 120000 index 000000000..d42a395d7 --- /dev/null +++ b/setup/stock_location_lockdown/odoo/addons/stock_location_lockdown @@ -0,0 +1 @@ +../../../../stock_location_lockdown \ No newline at end of file diff --git a/setup/stock_location_lockdown/setup.py b/setup/stock_location_lockdown/setup.py new file mode 100644 index 000000000..28c57bb64 --- /dev/null +++ b/setup/stock_location_lockdown/setup.py @@ -0,0 +1,6 @@ +import setuptools + +setuptools.setup( + setup_requires=['setuptools-odoo'], + odoo_addon=True, +) diff --git a/stock_location_lockdown/models/stock_location.py b/stock_location_lockdown/models/stock_location.py index 8be21735a..8b69b922f 100644 --- a/stock_location_lockdown/models/stock_location.py +++ b/stock_location_lockdown/models/stock_location.py @@ -1,31 +1,33 @@ # Copyright 2019 Akretion # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). -from odoo import fields, models, _ +from odoo import _, fields, models from odoo.exceptions import UserError class StockLocation(models.Model): - _inherit = 'stock.location' + _inherit = "stock.location" block_stock_entrance = fields.Boolean( help="if this box is checked, putting stock on this location won't be " - "allowed. Usually used for a virtual location that has " - "childrens.") + "allowed. Usually used for a virtual location that has " + "childrens." + ) # Raise error if the location that you're trying to block # has already got quants def write(self, values): res = super().write(values) - if ('block_stock_entrance' in values - and values['block_stock_entrance']): + if "block_stock_entrance" in values and values["block_stock_entrance"]: # Unlink zero quants before checking # if there are quants on the location - self.env['stock.quant']._unlink_zero_quants() - if self.mapped('quant_ids'): + self.env["stock.quant"]._unlink_zero_quants() + if self.mapped("quant_ids"): raise UserError( - _("It is impossible to prohibit this location from\ - receiving products as it already contains some.") + _( + "It is impossible to prohibit this location from\ + receiving products as it already contains some." ) + ) return res diff --git a/stock_location_lockdown/models/stock_quant.py b/stock_location_lockdown/models/stock_quant.py index dcc490c22..0a0ede37a 100644 --- a/stock_location_lockdown/models/stock_quant.py +++ b/stock_location_lockdown/models/stock_quant.py @@ -1,21 +1,23 @@ # Copyright 2019 Akretion # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). -from odoo import api, models, _ +from odoo import _, api, models from odoo.exceptions import ValidationError class StockQuant(models.Model): - _inherit = 'stock.quant' + _inherit = "stock.quant" # Raise an error when trying to change a quant # which corresponding stock location is blocked - @api.constrains('location_id') + @api.constrains("location_id") def check_location_blocked(self): for record in self: if record.location_id.block_stock_entrance: raise ValidationError( - _('The location %s is blocked and can ' - 'not be used for moving the product %s') - % (record.location_id.display_name, record.product_id.display_name) + _( + "The location %s is blocked and can " + "not be used for moving the product %s" ) + % (record.location_id.display_name, record.product_id.display_name) + ) diff --git a/stock_location_lockdown/tests/test_block_stock_location_entrance.py b/stock_location_lockdown/tests/test_block_stock_location_entrance.py index c31582aae..904c3a54e 100644 --- a/stock_location_lockdown/tests/test_block_stock_location_entrance.py +++ b/stock_location_lockdown/tests/test_block_stock_location_entrance.py @@ -1,86 +1,97 @@ # Copyright 2019 Akretion France # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). -from odoo.exceptions import ValidationError, UserError +from odoo.exceptions import UserError, ValidationError from odoo.tests.common import TransactionCase class TestStockLocationLockdown(TransactionCase): - def setUp(self, *args, **kwargs): super(TestStockLocationLockdown, self).setUp(*args, **kwargs) # Create a new stock location with no quants and blocked stock entrance - new_loc = {'name': 'location_test', 'usage': 'internal'} - self.new_stock_location = self.env['stock.location'].create(new_loc) + new_loc = {"name": "location_test", "usage": "internal"} + self.new_stock_location = self.env["stock.location"].create(new_loc) self.new_stock_location.block_stock_entrance = True - self.supplier_location = self.env.ref('stock.stock_location_suppliers') - self.customer_location = self.env.ref('stock.stock_location_customers') + self.supplier_location = self.env.ref("stock.stock_location_suppliers") + self.customer_location = self.env.ref("stock.stock_location_customers") # Call an existing product and force no Lot/Serial Number tracking - self.product = self.env.ref('product.product_product_27') - self.product.tracking = 'none' + self.product = self.env.ref("product.product_product_27") + self.product.tracking = "none" # Catch the first quant's stock location - self.stock_location = self.env['stock.quant'].search([])[0].location_id + self.stock_location = self.env["stock.quant"].search([])[0].location_id def test_transfer_stock_in_locked_location(self): """ - Test to move stock within a location that should not accept - stock entrance. + Test to move stock within a location that should not accept + stock entrance. """ move_vals = { - 'location_id': self.supplier_location.id, - 'location_dest_id': self.new_stock_location.id, - 'product_id': self.product.id, - 'product_uom_qty': self.product.qty_available + 1, - 'product_uom': 1, - 'name': 'test', - 'move_line_ids': [(0, 0, { - 'product_id': self.product.id, - 'product_uom_qty': 0, - 'product_uom_id': 1, - 'qty_done': self.product.qty_available + 1, - 'location_id': self.supplier_location.id, - 'location_dest_id': self.new_stock_location.id, - })] + "location_id": self.supplier_location.id, + "location_dest_id": self.new_stock_location.id, + "product_id": self.product.id, + "product_uom_qty": self.product.qty_available + 1, + "product_uom": 1, + "name": "test", + "move_line_ids": [ + ( + 0, + 0, + { + "product_id": self.product.id, + "product_uom_qty": 0, + "product_uom_id": 1, + "qty_done": self.product.qty_available + 1, + "location_id": self.supplier_location.id, + "location_dest_id": self.new_stock_location.id, + }, + ) + ], } - stock_move = self.env['stock.move'].create(move_vals) + stock_move = self.env["stock.move"].create(move_vals) with self.assertRaises(ValidationError): stock_move._action_done() def test_transfer_stock_out_locked_location(self): """ - Test to move stock out from a location that should not accept - stock removal. + Test to move stock out from a location that should not accept + stock removal. """ move_vals = { - 'location_id': self.new_stock_location.id, - 'location_dest_id': self.customer_location.id, - 'product_id': self.product.id, - 'product_uom_qty': self.product.qty_available + 1, - 'product_uom': 1, - 'name': 'test', - 'move_line_ids': [(0, 0, { - 'product_id': self.product.id, - 'product_uom_qty': 0, - 'product_uom_id': 1, - 'qty_done': self.product.qty_available + 1, - 'location_id': self.supplier_location.id, - 'location_dest_id': self.new_stock_location.id, - })] + "location_id": self.new_stock_location.id, + "location_dest_id": self.customer_location.id, + "product_id": self.product.id, + "product_uom_qty": self.product.qty_available + 1, + "product_uom": 1, + "name": "test", + "move_line_ids": [ + ( + 0, + 0, + { + "product_id": self.product.id, + "product_uom_qty": 0, + "product_uom_id": 1, + "qty_done": self.product.qty_available + 1, + "location_id": self.supplier_location.id, + "location_dest_id": self.new_stock_location.id, + }, + ) + ], } - stock_move = self.env['stock.move'].create(move_vals) + stock_move = self.env["stock.move"].create(move_vals) with self.assertRaises(ValidationError): stock_move._action_done() def test_block_location_with_quants(self): """ - Test to click on block_stock_entrance checkbox in a location - that should not be blocked because it has already got quants + Test to click on block_stock_entrance checkbox in a location + that should not be blocked because it has already got quants """ with self.assertRaises(UserError): - self.stock_location.write({'block_stock_entrance': True}) + self.stock_location.write({"block_stock_entrance": True}) diff --git a/stock_location_lockdown/views/stock_location.xml b/stock_location_lockdown/views/stock_location.xml index be16e7e21..fb6ef9846 100644 --- a/stock_location_lockdown/views/stock_location.xml +++ b/stock_location_lockdown/views/stock_location.xml @@ -1,15 +1,17 @@ - + - stock.location - + - +