[IMP] stock_location_lockdown: black, isort, prettier

This commit is contained in:
Florian da Costa
2020-12-17 15:14:11 +01:00
committed by Urvisha-OSI
parent 4ca9d4300c
commit 81f71bcb8e
4 changed files with 83 additions and 66 deletions

View File

@@ -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

View File

@@ -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)
)

View File

@@ -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})

View File

@@ -1,15 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<?xml version="1.0" encoding="utf-8" ?>
<!-- Copyright 2017 Akretion
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). -->
<odoo>
<record id="view_stock_location_block_entrance" model="ir.ui.view">
<field name="model">stock.location</field>
<field name="inherit_id" ref="stock.view_location_form"/>
<field name="inherit_id" ref="stock.view_location_form" />
<field name="arch" type="xml">
<field name="usage" position="after">
<field name="block_stock_entrance" attrs="{'invisible': [('usage', '!=', 'internal')]}"/>
<field
name="block_stock_entrance"
attrs="{'invisible': [('usage', '!=', 'internal')]}"
/>
</field>
</field>
</record>