diff --git a/addons/analytic/models/analytic_account.py b/addons/analytic/models/analytic_account.py
index 1b4196f0dc0..310a999c99d 100644
--- a/addons/analytic/models/analytic_account.py
+++ b/addons/analytic/models/analytic_account.py
@@ -179,7 +179,8 @@ class AccountAnalyticLine(models.Model):
date = fields.Date('Date', required=True, index=True, default=fields.Date.context_today)
amount = fields.Monetary('Amount', required=True, default=0.0)
unit_amount = fields.Float('Quantity', default=0.0)
- product_uom_id = fields.Many2one('uom.uom', string='Unit of Measure')
+ product_uom_id = fields.Many2one('uom.uom', string='Unit of Measure', domain="[('category_id', '=', product_uom_category_id)]")
+ product_uom_category_id = fields.Many2one(related='product_uom_id.category_id', readonly=True)
account_id = fields.Many2one('account.analytic.account', 'Analytic Account', required=True, ondelete='restrict', index=True)
partner_id = fields.Many2one('res.partner', string='Partner')
user_id = fields.Many2one('res.users', string='User', default=_default_user)
diff --git a/addons/analytic/views/analytic_account_views.xml b/addons/analytic/views/analytic_account_views.xml
index 29cb8639333..8ae4c546a86 100644
--- a/addons/analytic/views/analytic_account_views.xml
+++ b/addons/analytic/views/analytic_account_views.xml
@@ -282,6 +282,7 @@
+
diff --git a/addons/hr_expense/models/hr_expense.py b/addons/hr_expense/models/hr_expense.py
index f365f318926..73a67f5df47 100644
--- a/addons/hr_expense/models/hr_expense.py
+++ b/addons/hr_expense/models/hr_expense.py
@@ -47,7 +47,8 @@ class HrExpense(models.Model):
employee_id = fields.Many2one('hr.employee', string="Employee", required=True, readonly=True, states={'draft': [('readonly', False)], 'reported': [('readonly', False)], 'refused': [('readonly', False)]}, default=_default_employee_id, domain=lambda self: self._get_employee_id_domain())
# product_id not required to allow create an expense without product via mail alias, but should be required on the view.
product_id = fields.Many2one('product.product', string='Product', readonly=True, states={'draft': [('readonly', False)], 'reported': [('readonly', False)], 'refused': [('readonly', False)]}, domain=[('can_be_expensed', '=', True)])
- product_uom_id = fields.Many2one('uom.uom', string='Unit of Measure', readonly=True, states={'draft': [('readonly', False)], 'refused': [('readonly', False)]}, default=_default_product_uom_id)
+ product_uom_id = fields.Many2one('uom.uom', string='Unit of Measure', readonly=True, states={'draft': [('readonly', False)], 'refused': [('readonly', False)]}, default=_default_product_uom_id, domain="[('category_id', '=', product_uom_category_id)]")
+ product_uom_category_id = fields.Many2one(related='product_id.uom_id.category_id', readonly=True)
unit_amount = fields.Float("Unit Price", readonly=True, required=True, states={'draft': [('readonly', False)], 'reported': [('readonly', False)], 'refused': [('readonly', False)]}, digits='Product Price')
quantity = fields.Float(required=True, readonly=True, states={'draft': [('readonly', False)], 'reported': [('readonly', False)], 'refused': [('readonly', False)]}, digits='Product Unit of Measure', default=1)
tax_ids = fields.Many2many('account.tax', 'expense_tax', 'expense_id', 'tax_id', string='Taxes')
@@ -149,9 +150,6 @@ class HrExpense(models.Model):
account = self.product_id.product_tmpl_id._get_product_accounts()['expense']
if account:
self.account_id = account
- return {'domain': {'product_uom_id': [('category_id', '=', self.product_id.uom_id.category_id.id)]}}
- else:
- return {'domain': {'product_uom_id': []}}
@api.onchange('product_uom_id')
def _onchange_product_uom_id(self):
diff --git a/addons/hr_expense/views/hr_expense_views.xml b/addons/hr_expense/views/hr_expense_views.xml
index cefa9e6b7ae..076827fa3bd 100644
--- a/addons/hr_expense/views/hr_expense_views.xml
+++ b/addons/hr_expense/views/hr_expense_views.xml
@@ -83,6 +83,7 @@
widget="many2one_barcode"
/>
+
diff --git a/addons/sale/models/sale.py b/addons/sale/models/sale.py
index cc39e0b881a..35df22a57af 100644
--- a/addons/sale/models/sale.py
+++ b/addons/sale/models/sale.py
@@ -1105,7 +1105,8 @@ class SaleOrderLine(models.Model):
product_template_id = fields.Many2one('product.template', string='Product Template', related="product_id.product_tmpl_id", domain=[('sale_ok', '=', True)])
product_updatable = fields.Boolean(compute='_compute_product_updatable', string='Can Edit Product', readonly=True, default=True)
product_uom_qty = fields.Float(string='Quantity', digits='Product Unit of Measure', required=True, default=1.0)
- product_uom = fields.Many2one('uom.uom', string='Unit of Measure')
+ product_uom = fields.Many2one('uom.uom', string='Unit of Measure', domain="[('category_id', '=', product_uom_category_id)]")
+ product_uom_category_id = fields.Many2one(related='product_id.uom_id.category_id', readonly=True)
product_custom_attribute_value_ids = fields.One2many('product.attribute.custom.value', 'sale_order_line_id', string='User entered custom product attribute values')
# M2M holding the values of product.attribute with create_variant field set to 'no_variant'
@@ -1360,7 +1361,7 @@ class SaleOrderLine(models.Model):
@api.onchange('product_id')
def product_id_change(self):
if not self.product_id:
- return {'domain': {'product_uom': []}}
+ return
# remove the is_custom values that don't belong to this template
for pacv in self.product_custom_attribute_value_ids:
@@ -1373,7 +1374,6 @@ class SaleOrderLine(models.Model):
self.product_no_variant_attribute_value_ids -= ptav
vals = {}
- domain = {'product_uom': [('category_id', '=', self.product_id.uom_id.category_id.id)]}
if not self.product_uom or (self.product_id.uom_id.id != self.product_uom.id):
vals['product_uom'] = self.product_id.uom_id
vals['product_uom_qty'] = self.product_uom_qty or 1.0
@@ -1387,8 +1387,6 @@ class SaleOrderLine(models.Model):
uom=self.product_uom.id
)
- result = {'domain': domain}
-
vals.update(name=self.get_sale_order_line_multiline_description_sale(product))
self._compute_tax_id()
@@ -1399,6 +1397,7 @@ class SaleOrderLine(models.Model):
title = False
message = False
+ result = {}
warning = {}
if product.sale_line_warn != 'no-message':
title = _("Warning for %s") % product.name
diff --git a/addons/sale/views/sale_views.xml b/addons/sale/views/sale_views.xml
index e9b5f4a5a21..1a75bd33c62 100644
--- a/addons/sale/views/sale_views.xml
+++ b/addons/sale/views/sale_views.xml
@@ -309,6 +309,7 @@
TODO: at some point we want to fix this in the framework so that an invisible field is not required.
-->
+
@@ -400,6 +401,7 @@
+
+
@@ -85,6 +86,7 @@
+
+
diff --git a/addons/sale_management/views/sale_order_views.xml b/addons/sale_management/views/sale_order_views.xml
index 94d5c1ca2c1..1a5da2b49ab 100644
--- a/addons/sale_management/views/sale_order_views.xml
+++ b/addons/sale_management/views/sale_order_views.xml
@@ -14,6 +14,7 @@
+
@@ -71,6 +72,7 @@
+