feat: Restrict lot selection dropdown to lots available in the source location for internal/transit pickings by adding a stock.lot search override and passing context variables from stock.move.line views.
This commit is contained in:
parent
7737a32459
commit
a0a0b81ec6
@ -126,6 +126,31 @@ class StockLocation(models.Model):
|
|||||||
|
|
||||||
return super()._name_search(name=name, domain=domain, operator=operator, limit=limit, order=order)
|
return super()._name_search(name=name, domain=domain, operator=operator, limit=limit, order=order)
|
||||||
|
|
||||||
|
class StockLot(models.Model):
|
||||||
|
_inherit = 'stock.lot'
|
||||||
|
|
||||||
|
@api.model
|
||||||
|
def _search(self, domain, offset=0, limit=None, order=None, *args, **kwargs):
|
||||||
|
ctx = self.env.context
|
||||||
|
|
||||||
|
# We only want to filter if the user is in a picking using lot_id directly (like Receive operations)
|
||||||
|
active_picking_id = ctx.get('active_picking_id')
|
||||||
|
loc_id = ctx.get('default_location_id')
|
||||||
|
|
||||||
|
if active_picking_id and loc_id:
|
||||||
|
picking = self.env['stock.picking'].sudo().browse(active_picking_id)
|
||||||
|
loc = self.env['stock.location'].sudo().browse(loc_id)
|
||||||
|
|
||||||
|
# If the source is an internal or transit location, restrict the dropdown to lots actually present there.
|
||||||
|
# If the source is a supplier, we do not filter (they could be receiving brand new lots).
|
||||||
|
if picking.exists() and loc.exists() and loc.usage != 'supplier':
|
||||||
|
domain = Domain.AND([domain, [
|
||||||
|
('quant_ids.location_id', 'child_of', loc.id),
|
||||||
|
('quant_ids.quantity', '>', 0)
|
||||||
|
]])
|
||||||
|
|
||||||
|
return super()._search(domain, offset=offset, limit=limit, order=order, *args, **kwargs)
|
||||||
|
|
||||||
_logger.info("="*80)
|
_logger.info("="*80)
|
||||||
_logger.info("STOCK_RESTRICT_SOURCE_LOCATION: stock_location.py module loaded successfully!")
|
_logger.info("STOCK_RESTRICT_SOURCE_LOCATION: stock_location.py module loaded successfully!")
|
||||||
_logger.info("="*80)
|
_logger.info("="*80)
|
||||||
|
|||||||
@ -38,6 +38,10 @@
|
|||||||
<!-- Rely on backend StockQuant._search override for location filtering -->
|
<!-- Rely on backend StockQuant._search override for location filtering -->
|
||||||
<attribute name="context">{'default_location_id': location_id, 'default_product_id': product_id, 'search_view_ref': 'stock.quant_search_view', 'list_view_ref': 'stock.view_stock_quant_tree', 'form_view_ref': 'stock.view_stock_quant_form', 'readonly_form': True, 'show_src_package': 1, 'active_mo_id': context.get('active_mo_id'), 'default_picking_type_id': context.get('default_picking_type_id'), 'default_allowed_source_location_ids': allowed_source_location_ids}</attribute>
|
<attribute name="context">{'default_location_id': location_id, 'default_product_id': product_id, 'search_view_ref': 'stock.quant_search_view', 'list_view_ref': 'stock.view_stock_quant_tree', 'form_view_ref': 'stock.view_stock_quant_form', 'readonly_form': True, 'show_src_package': 1, 'active_mo_id': context.get('active_mo_id'), 'default_picking_type_id': context.get('default_picking_type_id'), 'default_allowed_source_location_ids': allowed_source_location_ids}</attribute>
|
||||||
</xpath>
|
</xpath>
|
||||||
|
<xpath expr="//field[@name='lot_id']" position="attributes">
|
||||||
|
<!-- Add default_location_id to context so python override can filter lots for transit receipts -->
|
||||||
|
<attribute name="context">{'default_product_id': product_id, 'active_picking_id': picking_id, 'default_location_id': location_id}</attribute>
|
||||||
|
</xpath>
|
||||||
<xpath expr="//field[@name='location_id']" position="attributes">
|
<xpath expr="//field[@name='location_id']" position="attributes">
|
||||||
<!-- Rely on backend StockLocation._name_search override -->
|
<!-- Rely on backend StockLocation._name_search override -->
|
||||||
<attribute name="options">{'no_create': True}</attribute>
|
<attribute name="options">{'no_create': True}</attribute>
|
||||||
@ -57,6 +61,9 @@
|
|||||||
<!-- Rely on backend StockQuant._search override for location filtering -->
|
<!-- Rely on backend StockQuant._search override for location filtering -->
|
||||||
<attribute name="context">{'default_location_id': location_id, 'default_product_id': product_id, 'search_view_ref': 'stock.quant_search_view', 'list_view_ref': 'stock.view_stock_quant_tree', 'form_view_ref': 'stock.view_stock_quant_form', 'readonly_form': True, 'show_src_package': 1, 'active_mo_id': context.get('active_mo_id'), 'default_picking_type_id': context.get('default_picking_type_id'), 'default_allowed_source_location_ids': allowed_source_location_ids}</attribute>
|
<attribute name="context">{'default_location_id': location_id, 'default_product_id': product_id, 'search_view_ref': 'stock.quant_search_view', 'list_view_ref': 'stock.view_stock_quant_tree', 'form_view_ref': 'stock.view_stock_quant_form', 'readonly_form': True, 'show_src_package': 1, 'active_mo_id': context.get('active_mo_id'), 'default_picking_type_id': context.get('default_picking_type_id'), 'default_allowed_source_location_ids': allowed_source_location_ids}</attribute>
|
||||||
</xpath>
|
</xpath>
|
||||||
|
<xpath expr="//field[@name='lot_id']" position="attributes">
|
||||||
|
<attribute name="context">{'default_product_id': parent.product_id, 'active_picking_id': picking_id, 'default_location_id': location_id}</attribute>
|
||||||
|
</xpath>
|
||||||
<xpath expr="//field[@name='location_id']" position="attributes">
|
<xpath expr="//field[@name='location_id']" position="attributes">
|
||||||
<!-- Rely on backend StockLocation._name_search override -->
|
<!-- Rely on backend StockLocation._name_search override -->
|
||||||
<attribute name="options">{'no_create': True}</attribute>
|
<attribute name="options">{'no_create': True}</attribute>
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user