[REF] purchase,mrp,repairs,stock: enforce uom domain

Enforce the domain of the UOM not by an onchange but by a domain.

Exemple of issue if the domain is enforce by an onchange:
- create a picking
- add a move
- select the product
- select an uom
> the uom presented are the one from the product category.
-Save
- edit
- select an uom
> all UOM are presented even the ones of other categories

This commit enforce this new logic at most places.

task: 1886272

closes odoo/odoo#33083

Signed-off-by: Simon Lejeune (sle) <sle@openerp.com>
This commit is contained in:
Priyanka Kakadiya
2019-05-28 08:36:58 +00:00
committed by William Henrotin
parent 818ff8c406
commit e71f954da3
13 changed files with 38 additions and 15 deletions
+4 -2
View File
@@ -43,7 +43,8 @@ class MrpBom(models.Model):
product_uom_id = fields.Many2one(
'uom.uom', 'Product Unit of Measure',
default=_get_default_product_uom_id, oldname='product_uom', required=True,
help="Unit of Measure (Unit of Measure) is the unit of measurement for the inventory control")
help="Unit of Measure (Unit of Measure) is the unit of measurement for the inventory control", domain="[('category_id', '=', product_uom_category_id)]")
product_uom_category_id = fields.Many2one(related='product_id.uom_id.category_id')
sequence = fields.Integer('Sequence', help="Gives the sequence order when displaying a list of bills of material.")
routing_id = fields.Many2one(
'mrp.routing', 'Routing',
@@ -233,7 +234,8 @@ class MrpBomLine(models.Model):
'uom.uom', 'Product Unit of Measure',
default=_get_default_product_uom_id,
oldname='product_uom', required=True,
help="Unit of Measure (Unit of Measure) is the unit of measurement for the inventory control")
help="Unit of Measure (Unit of Measure) is the unit of measurement for the inventory control", domain="[('category_id', '=', product_uom_category_id)]")
product_uom_category_id = fields.Many2one(related='product_id.uom_id.category_id')
sequence = fields.Integer(
'Sequence', default=1,
help="Gives the sequence order when displaying.")
+3
View File
@@ -26,6 +26,7 @@
<group>
<group>
<field name="product_tmpl_id" context="{'default_type': 'product'}"/>
<field name="product_uom_category_id" invisible="1"/>
<field name="product_id" groups="product.group_product_variant" context="{'default_type': 'product'}"/>
<label for="product_qty" string="Quantity"/>
<div class="o_row">
@@ -62,6 +63,7 @@
<field name="attachments_count" class="text-left"
string=" "/>
<field name="product_qty"/>
<field name="product_uom_category_id" invisible="1"/>
<field name="parent_product_tmpl_id" invisible="1" />
<field name="product_uom_id" options="{'no_open':True,'no_create':True}" groups="uom.group_uom"/>
<field name="attribute_value_ids" widget="many2many_tags" options="{'no_create': True}" attrs="{'column_invisible': [('parent.product_id', '!=', False)]}" groups="product.group_product_variant"/>
@@ -203,6 +205,7 @@
<label for="product_qty" string="Quantity"/>
<div class="o_row">
<field name="product_qty"/>
<field name="product_uom_category_id" invisible="1"/>
<field name="product_uom_id" options="{'no_open':True,'no_create':True}" groups="uom.group_uom"/>
</div>
</group>
+3 -6
View File
@@ -434,7 +434,8 @@ class PurchaseOrderLine(models.Model):
product_uom_qty = fields.Float(string='Total Quantity', compute='_compute_product_uom_qty', store=True)
date_planned = fields.Datetime(string='Scheduled Date', required=True, index=True)
taxes_id = fields.Many2many('account.tax', string='Taxes', domain=['|', ('active', '=', False), ('active', '=', True)])
product_uom = fields.Many2one('uom.uom', string='Unit of Measure', required=True)
product_uom = fields.Many2one('uom.uom', string='Unit of Measure', required=True, domain="[('category_id', '=', product_uom_category_id)]")
product_uom_category_id = fields.Many2one(related='product_id.uom_id.category_id')
product_id = fields.Many2one('product.product', string='Product', domain=[('purchase_ok', '=', True)], change_default=True, required=True)
product_type = fields.Selection(related='product_id.type', readonly=True)
price_unit = fields.Float(string='Unit Price', required=True, digits=dp.get_precision('Product Price'))
@@ -589,15 +590,13 @@ class PurchaseOrderLine(models.Model):
@api.onchange('product_id')
def onchange_product_id(self):
result = {}
if not self.product_id:
return result
return
# Reset date, price and quantity since _onchange_quantity will provide default values
self.date_planned = datetime.today().strftime(DEFAULT_SERVER_DATETIME_FORMAT)
self.price_unit = self.product_qty = 0.0
self.product_uom = self.product_id.uom_po_id or self.product_id.uom_id
result['domain'] = {'product_uom': [('category_id', '=', self.product_id.uom_id.category_id.id)]}
product_lang = self.product_id.with_context(
lang=self.partner_id.lang,
@@ -618,8 +617,6 @@ class PurchaseOrderLine(models.Model):
self._suggest_quantity()
self._onchange_quantity()
return result
@api.onchange('product_id')
def onchange_product_id_warning(self):
if not self.product_id:
+2
View File
@@ -187,6 +187,7 @@
<field name="currency_id" invisible="1"/>
<field name="state" invisible="1"/>
<field name="product_type" invisible="1"/>
<field name="product_uom_category_id" invisible="1"/>
<field name="sequence" widget="handle"/>
<field name="product_id" attrs="{'readonly': [('state', 'in', ('purchase', 'to approve','done', 'cancel'))]}" context="{'partner_id':parent.partner_id, 'quantity':product_qty,'uom':product_uom, 'company_id': parent.company_id}" force_save="1"/>
<field name="name"/>
@@ -209,6 +210,7 @@
<field name="state" invisible="1"/>
<group>
<group>
<field name="product_uom_category_id" invisible="1"/>
<field name="product_id"
context="{'partner_id': parent.partner_id}"
widget="many2one_barcode"
@@ -175,7 +175,8 @@ class PurchaseRequisitionLine(models.Model):
_rec_name = 'product_id'
product_id = fields.Many2one('product.product', string='Product', domain=[('purchase_ok', '=', True)], required=True)
product_uom_id = fields.Many2one('uom.uom', string='Product Unit of Measure')
product_uom_id = fields.Many2one('uom.uom', string='Product Unit of Measure', domain="[('category_id', '=', product_uom_category_id)]")
product_uom_category_id = fields.Many2one(related='product_id.uom_id.category_id')
product_qty = fields.Float(string='Quantity', digits=dp.get_precision('Product Unit of Measure'))
price_unit = fields.Float(string='Unit Price', digits=dp.get_precision('Product Price'))
qty_ordered = fields.Float(compute='_compute_ordered_qty', string='Ordered Quantities')
@@ -169,6 +169,7 @@
<field name="product_id" context="{'default_purchase_requisition': 'tenders'}"/>
<field name="product_qty"/>
<field name="qty_ordered"/>
<field name="product_uom_category_id" invisible="1"/>
<field name="product_uom_id" string="UoM" groups="uom.group_uom"/>
<field name="schedule_date" groups="base.group_no_one"/>
<field name="account_analytic_id" groups="analytic.group_analytic_accounting"/>
@@ -180,6 +181,7 @@
<field name="product_id" />
<field name="product_qty"/>
<field name="qty_ordered"/>
<field name="product_uom_category_id" invisible="1"/>
<field name="product_uom_id" />
<field name="schedule_date"/>
<field name="account_analytic_id" groups="analytic.group_analytic_accounting"/>
+6 -3
View File
@@ -42,7 +42,8 @@ class Repair(models.Model):
readonly=True, required=True, states={'draft': [('readonly', False)]})
product_uom = fields.Many2one(
'uom.uom', 'Product Unit of Measure',
readonly=True, required=True, states={'draft': [('readonly', False)]})
readonly=True, required=True, states={'draft': [('readonly', False)]}, domain="[('category_id', '=', product_uom_category_id)]")
product_uom_category_id = fields.Many2one(related='product_id.uom_id.category_id')
partner_id = fields.Many2one(
'res.partner', 'Customer',
index=True, states={'confirmed': [('readonly', True)]},
@@ -518,7 +519,8 @@ class RepairLine(models.Model):
digits=dp.get_precision('Product Unit of Measure'), required=True)
product_uom = fields.Many2one(
'uom.uom', 'Product Unit of Measure',
required=True)
required=True, domain="[('category_id', '=', product_uom_category_id)]")
product_uom_category_id = fields.Many2one(related='product_id.uom_id.category_id')
invoice_line_id = fields.Many2one(
'account.invoice.line', 'Invoice Line',
copy=False, readonly=True)
@@ -630,7 +632,8 @@ class RepairFee(models.Model):
product_id = fields.Many2one('product.product', 'Product')
product_uom_qty = fields.Float('Quantity', digits=dp.get_precision('Product Unit of Measure'), required=True, default=1.0)
price_unit = fields.Float('Unit Price', required=True)
product_uom = fields.Many2one('uom.uom', 'Product Unit of Measure', required=True)
product_uom = fields.Many2one('uom.uom', 'Product Unit of Measure', required=True, domain="[('category_id', '=', product_uom_category_id)]")
product_uom_category_id = fields.Many2one(related='product_id.uom_id.category_id')
price_subtotal = fields.Float('Subtotal', compute='_compute_price_subtotal', store=True, digits=0)
tax_id = fields.Many2many('account.tax', 'repair_fee_line_tax', 'repair_fee_line_id', 'tax_id', 'Taxes')
invoice_line_id = fields.Many2one('account.invoice.line', 'Invoice Line', copy=False, readonly=True)
+5
View File
@@ -53,6 +53,7 @@
<group>
<field name="tracking" invisible="1" attrs="{'readonly': 1}"/>
<field name="product_id" domain="[('type', 'in', ['product', 'consu'])]"/>
<field name="product_uom_category_id" invisible="1"/>
<label for="product_qty"/>
<div class="o_row">
<field name="product_qty"/>
@@ -79,6 +80,7 @@
<group>
<field name="product_id"/>
<field name="name"/>
<field name="product_uom_category_id" invisible="1"/>
<label for="product_uom_qty"/>
<div class="o_row">
<field name="product_uom_qty"/>
@@ -105,6 +107,7 @@
<field name="type"/>
<field name="product_id"/>
<field name='name'/>
<field name="product_uom_category_id" invisible="1"/>
<field name="lot_id" domain="[('product_id', '=', product_id)]" context="{'default_product_id': product_id}" groups="stock.group_production_lot"/>
<field name="location_id" options="{'no_create': True}" groups="stock.group_stock_multi_locations"/>
<field name="location_dest_id" options="{'no_create': True}" groups="stock.group_stock_multi_locations"/>
@@ -134,6 +137,7 @@
<group>
<field name="product_id"/>
<field name="name"/>
<field name="product_uom_category_id" invisible="1"/>
<label for="product_uom_qty"/>
<div class="o_row">
<field name="product_uom_qty" string="Quantity"/>
@@ -148,6 +152,7 @@
<field name="product_id" domain="[('type','=','service')]" required="True"/>
<field name='name'/>
<field name="product_uom_qty" string="Quantity"/>
<field name="product_uom_category_id" invisible="1"/>
<field name="product_uom" string="Unit of Measure" groups="uom.group_uom"/>
<field name="price_unit"/>
<field name="tax_id" domain="[('type_tax_use', '=', 'sale')]" widget="many2many_tags"/>
+2 -2
View File
@@ -62,7 +62,8 @@ class StockMove(models.Model):
"be moved. Lowering this quantity does not generate a "
"backorder. Changing this quantity on assigned moves affects "
"the product reservation, and should be done with care.")
product_uom = fields.Many2one('uom.uom', 'Unit of Measure', required=True)
product_uom = fields.Many2one('uom.uom', 'Unit of Measure', required=True, domain="[('category_id', '=', product_uom_category_id)]")
product_uom_category_id = fields.Many2one(related='product_id.uom_id.category_id')
# TDE FIXME: make it stored, otherwise group will not work
product_tmpl_id = fields.Many2one(
'product.template', 'Product Template',
@@ -641,7 +642,6 @@ class StockMove(models.Model):
product = self.product_id.with_context(lang=self.partner_id.lang or self.env.user.lang)
self.name = product.partner_ref
self.product_uom = product.uom_id.id
return {'domain': {'product_uom': [('category_id', '=', product.uom_id.category_id.id)]}}
@api.onchange('date_expected')
def onchange_date(self):
+2 -1
View File
@@ -31,7 +31,8 @@ class StockScrap(models.Model):
required=True, states={'done': [('readonly', True)]})
product_uom_id = fields.Many2one(
'uom.uom', 'Unit of Measure',
required=True, states={'done': [('readonly', True)]})
required=True, states={'done': [('readonly', True)]}, domain="[('category_id', '=', product_uom_category_id)]")
product_uom_category_id = fields.Many2one(related='product_id.uom_id.category_id')
tracking = fields.Selection('Product Tracking', readonly=True, related="product_id.tracking")
lot_id = fields.Many2one(
'stock.production.lot', 'Lot',
+4
View File
@@ -88,6 +88,7 @@
<field name="additional" invisible="1"/>
<field name="has_move_lines" invisible="1"/>
<field name="is_locked" invisible="1"/>
<field name="product_uom_category_id" invisible="1"/>
<field name="product_id" required="1" attrs="{'readonly': ['|', '&amp;', ('state', '!=', 'draft'), ('additional', '=', False), ('has_move_lines', '=', True)]}"/>
<field name="is_initial_demand_editable" invisible="1"/>
<field name="is_quantity_done_editable" invisible="1"/>
@@ -146,6 +147,7 @@
<tree decoration-muted="scrapped == True" string="Stock Moves" editable="bottom">
<field name="product_id"/>
<field name="name" invisible="1"/>
<field name="product_uom_category_id" invisible="1"/>
<field name="product_uom_qty"/>
<field name="product_uom" options="{'no_open': True, 'no_create': True}" string="Unit of Measure" groups="uom.group_uom"/>
<field name="location_id" options="{'no_create': True}" invisible="1"/>
@@ -249,6 +251,7 @@
</group>
<group name="main_grp_col2">
<field name="product_id"/>
<field name="product_uom_category_id" invisible="1"/>
<label for="product_uom_qty"/>
<div class="o_row">
<field name="product_uom_qty"/>
@@ -305,6 +308,7 @@
<field name="product_id"/>
<field name="picking_type_id" invisible="1"/>
<field name="group_id" invisible="1"/>
<field name="product_uom_category_id" invisible="1"/>
<label for="product_uom_qty"/>
<div>
<field name="product_uom_qty"/>
@@ -322,6 +322,7 @@
<field name="additional" invisible="1"/>
<field name="has_move_lines" invisible="1"/>
<field name="is_locked" invisible="1"/>
<field name="product_uom_category_id" invisible="1"/>
<field name="product_id" required="1" attrs="{'readonly': ['|', '&amp;', ('state', '!=', 'draft'), ('additional', '=', False), ('has_move_lines', '=', True)]}"/>
<field name="description_picking" string="Description"/>
<field name="is_initial_demand_editable" invisible="1"/>
+2
View File
@@ -48,6 +48,7 @@
<label for="scrap_qty"/>
<div class="o_row">
<field name="scrap_qty"/>
<field name="product_uom_category_id" invisible="1"/>
<field name="product_uom_id" groups="uom.group_uom"/>
</div>
</group>
@@ -152,6 +153,7 @@
<label for="scrap_qty"/>
<div class="o_row">
<field name="scrap_qty"/>
<field name="product_uom_category_id" invisible="1"/>
<field name="product_uom_id" groups="uom.group_uom"/>
</div>
</group>