diff --git a/addons/account/models/account_analytic_line.py b/addons/account/models/account_analytic_line.py
index 1578d237500..fa70c381814 100644
--- a/addons/account/models/account_analytic_line.py
+++ b/addons/account/models/account_analytic_line.py
@@ -1,6 +1,7 @@
# -*- coding: utf-8 -*-
from odoo import api, fields, models, _
+from math import copysign
class AccountAnalyticLine(models.Model):
@@ -20,8 +21,12 @@ class AccountAnalyticLine(models.Model):
help='Utility field to express amount currency')
currency_id = fields.Many2one('res.currency', related='move_id.currency_id', string='Account Currency', store=True, help="The related account currency if not equal to the company one.", readonly=True)
amount_currency = fields.Monetary(related='move_id.amount_currency', store=True, help="The amount expressed in the related account currency if not equal to the company one.", readonly=True)
+ analytic_amount_currency = fields.Monetary(string='Amount Currency', compute="_get_analytic_amount_currency", help="The amount expressed in the related account currency if not equal to the company one.", readonly=True)
partner_id = fields.Many2one('res.partner', related='account_id.partner_id', string='Partner', store=True, readonly=True)
+ def _get_analytic_amount_currency(self):
+ self.analytic_amount_currency = abs(self.amount_currency) * copysign(1, self.amount)
+
@api.v8
@api.onchange('product_id', 'product_uom_id', 'unit_amount', 'currency_id')
def on_change_unit_amount(self):
diff --git a/addons/account/models/account_move.py b/addons/account/models/account_move.py
index daf22e1ecda..58699b2c460 100644
--- a/addons/account/models/account_move.py
+++ b/addons/account/models/account_move.py
@@ -1218,7 +1218,7 @@ class AccountMoveLine(models.Model):
""" Prepare the values used to create() an account.analytic.line upon validation of an account.move.line having
an analytic account. This method is intended to be extended in other modules.
"""
- amount = (self.debit or 0.0) - (self.credit or 0.0)
+ amount = (self.credit or 0.0) - (self.debit or 0.0)
return {
'name': self.name,
'date': self.date,
diff --git a/addons/account/views/account_analytic_view.xml b/addons/account/views/account_analytic_view.xml
index cf2184b3b97..ee032002db9 100644
--- a/addons/account/views/account_analytic_view.xml
+++ b/addons/account/views/account_analytic_view.xml
@@ -15,7 +15,8 @@
-
+
+
diff --git a/addons/hr_expense/models/hr_expense.py b/addons/hr_expense/models/hr_expense.py
index 88fe6423761..d274a48c8e9 100644
--- a/addons/hr_expense/models/hr_expense.py
+++ b/addons/hr_expense/models/hr_expense.py
@@ -459,7 +459,7 @@ class HrExpenseSheet(models.Model):
self.department_id = self.employee_id.department_id
@api.one
- @api.depends('expense_line_ids')
+ @api.depends('expense_line_ids', 'expense_line_ids.total_amount')
def _compute_amount(self):
self.total_amount = sum(self.expense_line_ids.mapped('total_amount'))
diff --git a/addons/point_of_sale/static/src/js/screens.js b/addons/point_of_sale/static/src/js/screens.js
index ce9272f2c21..1fba372a1de 100644
--- a/addons/point_of_sale/static/src/js/screens.js
+++ b/addons/point_of_sale/static/src/js/screens.js
@@ -280,7 +280,7 @@ var ScaleScreenWidget = ScreenWidget.extend({
return self.pos.proxy.scale_read().then(function(weight){
self.set_weight(weight.weight);
});
- },{duration:50, repeat: true});
+ },{duration:150, repeat: true});
},
get_product: function(){
diff --git a/addons/sale_mrp/sale_mrp.py b/addons/sale_mrp/sale_mrp.py
index fce9f550395..bf6fc426f01 100644
--- a/addons/sale_mrp/sale_mrp.py
+++ b/addons/sale_mrp/sale_mrp.py
@@ -89,5 +89,5 @@ class AccountInvoiceLine(models.Model):
prod_quantity = factor * quantity
average_price_unit += self._compute_average_price(prod_qty_done, prod_quantity, prod_moves)
price_unit = average_price_unit or price_unit
- price_unit = self.uom_id._compute_quantity(price_unit, self.product_id.uom_id, round=False)
+ price_unit = self.product_id.uom_id._compute_price(self.product_id.uom_id.id, price_unit, to_uom_id=self.uom_id.id)
return price_unit
diff --git a/addons/sale_stock/models/account_invoice.py b/addons/sale_stock/models/account_invoice.py
index 19991767a1f..0760d7509b1 100644
--- a/addons/sale_stock/models/account_invoice.py
+++ b/addons/sale_stock/models/account_invoice.py
@@ -34,7 +34,7 @@ class AccountInvoiceLine(models.Model):
# on the moves we encounter.
average_price_unit = self._compute_average_price(qty_done, quantity, moves)
price_unit = average_price_unit or price_unit
- price_unit = self.uom_id._compute_quantity(price_unit, self.product_id.uom_id, round=False)
+ price_unit = self.product_id.uom_id._compute_price(self.product_id.uom_id.id, price_unit, to_uom_id=self.uom_id.id)
return price_unit
def _compute_average_price(self, qty_done, quantity, moves):
@@ -55,4 +55,4 @@ class AccountInvoiceLine(models.Model):
average_price_unit = (average_price_unit * (qty_delivered - qty_to_consider) + move.price_unit * qty_to_consider) / qty_delivered
if qty_delivered == quantity:
break
- return average_price_unit
\ No newline at end of file
+ return average_price_unit
diff --git a/addons/stock/models/stock_location.py b/addons/stock/models/stock_location.py
index 5763903b071..f71f82df366 100644
--- a/addons/stock/models/stock_location.py
+++ b/addons/stock/models/stock_location.py
@@ -25,7 +25,6 @@ class Location(models.Model):
return res
name = fields.Char('Location Name', required=True, translate=True)
- # TDE CLEAME: unnecessary field, use name_get instead
complete_name = fields.Char("Full Location Name", compute='_compute_complete_name', store=True)
active = fields.Boolean('Active', default=True, help="By unchecking the active field, you may hide a location without deleting it.")
usage = fields.Selection([
@@ -75,14 +74,22 @@ class Location(models.Model):
""" Forms complete name of location from parent location to child location. """
name = self.name
current = self
- while current.location_id and current.usage != 'view':
+ while current.location_id:
current = current.location_id
name = '%s/%s' % (current.name, name)
self.complete_name = name
@api.multi
def name_get(self):
- return [(location.id, location.complete_name) for location in self]
+ ret_list = []
+ for location in self:
+ orig_location = location
+ name = location.name
+ while location.location_id and location.usage != 'view':
+ location = location.location_id
+ name = location.name + "/" + name
+ ret_list.append((orig_location.id, name))
+ return ret_list
def get_putaway_strategy(self, product):
''' Returns the location where the product has to be put, if any compliant putaway strategy is found. Otherwise returns None.'''
diff --git a/addons/stock/models/stock_picking.py b/addons/stock/models/stock_picking.py
index 377a4a14c6f..d2d1332824e 100644
--- a/addons/stock/models/stock_picking.py
+++ b/addons/stock/models/stock_picking.py
@@ -869,7 +869,7 @@ class Picking(models.Model):
moves_reassign = any(x.origin_returned_move_id or x.move_orig_ids for x in picking.move_lines if x.state not in ['done', 'cancel'])
if moves_reassign and picking.location_id.usage not in ("supplier", "production", "inventory"):
# unnecessary to assign other quants than those involved with pack operations as they will be unreserved anyways.
- picking.with_context(reserve_only_ops=True, no_state_change=True).rereserve_quants(move_ids=todo_moves.ids)
+ picking.with_context(reserve_only_ops=True, no_state_change=True).rereserve_quants(move_ids=picking.move_lines.ids)
picking.do_recompute_remaining_quantities()
# split move lines if needed
diff --git a/addons/stock/views/stock_picking_views.xml b/addons/stock/views/stock_picking_views.xml
index 64e4dcd8d02..fd561abd364 100644
--- a/addons/stock/views/stock_picking_views.xml
+++ b/addons/stock/views/stock_picking_views.xml
@@ -202,6 +202,7 @@
+
diff --git a/addons/stock_account/models/account_invoice.py b/addons/stock_account/models/account_invoice.py
index 115006e4c48..9e64bdb1d34 100644
--- a/addons/stock_account/models/account_invoice.py
+++ b/addons/stock_account/models/account_invoice.py
@@ -73,7 +73,11 @@ class AccountInvoiceLine(models.Model):
def _get_anglo_saxon_price_unit(self):
self.ensure_one()
- return self.product_id.standard_price
+ price = self.product_id.standard_price
+ if not self.uom_id or self.product_id.uom_id == self.uom_id:
+ return price
+ else:
+ return self.product_id.uom_id._compute_price(self.product_id.uom_id.id, price, to_uom_id=self.uom_id.id)
def _get_price(self, company_currency, price_unit):
if self.invoice_id.currency_id.id != company_currency.id:
diff --git a/addons/web/static/src/js/views/form_relational_widgets.js b/addons/web/static/src/js/views/form_relational_widgets.js
index 702d43f061f..a15b588a297 100644
--- a/addons/web/static/src/js/views/form_relational_widgets.js
+++ b/addons/web/static/src/js/views/form_relational_widgets.js
@@ -1209,7 +1209,7 @@ var One2ManyListView = X2ManyListView.extend({
this.dataset.x2m.internal_dataset_changed = false;
var self = this;
- return this.save_edition().done(function () {
+ return this.save_edition(true).done(function () {
if (self._dataset_changed) {
self.dataset.trigger('dataset_changed');
}
diff --git a/addons/web/static/src/js/views/list_view_editable.js b/addons/web/static/src/js/views/list_view_editable.js
index 234edb9e41e..3f5d39e60e1 100644
--- a/addons/web/static/src/js/views/list_view_editable.js
+++ b/addons/web/static/src/js/views/list_view_editable.js
@@ -448,7 +448,7 @@ ListView.include(/** @lends instance.web.ListView# */{
/**
* @return {jQuery.Deferred}
*/
- save_edition: function () {
+ save_edition: function (cancel_onfail) {
var self = this;
return self.saving_mutex.exec(function() {
if (!self.editor.is_editing()) {
@@ -483,7 +483,9 @@ ListView.include(/** @lends instance.web.ListView# */{
return {created: created, record: record};
});
}, function() {
- return self.cancel_edition();
+ if (cancel_onfail) {
+ return self.cancel_edition();
+ }
});
});
});
diff --git a/addons/web_editor/static/src/js/backend.js b/addons/web_editor/static/src/js/backend.js
index 90fb0f656e3..8d05a92260c 100644
--- a/addons/web_editor/static/src/js/backend.js
+++ b/addons/web_editor/static/src/js/backend.js
@@ -161,11 +161,6 @@ var FieldTextHtmlSimple = widget.extend({
return !this.get('value') || this.get('value') === "
" || !this.get('value').match(/\S/);
},
commit_value: function () {
- // leave code view before saving
- if (this.$content.prev('textarea').length === 1) {
- var layoutInfo = { 'editor': function() { return this.$content; }.bind(this) };
- $.summernote.pluginEvents.codeview(undefined, undefined, layoutInfo);
- }
if (this.options['style-inline']) {
transcoder.class_to_style(this.$content);
transcoder.font_to_img(this.$content);
@@ -382,11 +377,6 @@ var FieldTextHtml = widget.extend({
this._dirty_flag = false;
return this.editor.save();
} else if (this._dirty_flag && this.editor && this.editor.buildingBlock) {
- // leave code view before saving
- if (this.$content.prev('textarea').length === 1) {
- var layoutInfo = { 'editor': function() { return this.$content; }.bind(this) };
- $.summernote.pluginEvents.codeview(undefined, undefined, layoutInfo);
- }
this.editor.buildingBlock.clean_for_save();
this.internal_set_value( this.$content.html() );
}
diff --git a/addons/web_editor/static/src/js/rte.summernote.js b/addons/web_editor/static/src/js/rte.summernote.js
index 1eb8054cdc6..1789ed69e7e 100644
--- a/addons/web_editor/static/src/js/rte.summernote.js
+++ b/addons/web_editor/static/src/js/rte.summernote.js
@@ -511,8 +511,6 @@ function prettify_html(html) {
}
return result;
}
-
-// Change Warning: called with dummy arguments to quit code view before saving
$.summernote.pluginEvents.codeview = function (event, editor, layoutInfo) {
if (layoutInfo.toolbar) {
return eventHandler.modules.codeview.toggle(layoutInfo);
diff --git a/odoo/addons/base/ir/ir_translation.py b/odoo/addons/base/ir/ir_translation.py
index 3fd60c9d787..46f3dbba1a0 100644
--- a/odoo/addons/base/ir/ir_translation.py
+++ b/odoo/addons/base/ir/ir_translation.py
@@ -5,7 +5,7 @@ import logging
from collections import defaultdict
from difflib import get_close_matches
-from odoo import api, fields, models, tools, _, SUPERUSER_ID
+from odoo import api, fields, models, tools, SUPERUSER_ID, _
from odoo.exceptions import AccessError, UserError, ValidationError
from odoo.modules import get_module_path, get_module_resource
diff --git a/odoo/addons/base/res/res_users.py b/odoo/addons/base/res/res_users.py
index a209fa0fe6a..ef93e384f8b 100644
--- a/odoo/addons/base/res/res_users.py
+++ b/odoo/addons/base/res/res_users.py
@@ -356,7 +356,7 @@ class Users(models.Model):
if 'company_id' in values:
for user in self:
# if partner is global we keep it that way
- if user.partner_id.company_id.id != values['company_id']:
+ if user.partner_id.company_id and user.partner_id.company_id.id != values['company_id']:
user.partner_id.write({'company_id': user.company_id.id})
# clear default ir values when company changes
self.env['ir.values'].get_defaults_dict.clear_cache(self.env['ir.values'])
@@ -877,8 +877,6 @@ class UsersView(models.Model):
def fields_get(self, allfields=None, attributes=None):
res = super(UsersView, self).fields_get(allfields, attributes=attributes)
# add reified groups fields
- if not self.env.user._is_admin():
- return res
for app, kind, gs in self.env['res.groups'].sudo().get_groups_by_application():
if kind == 'selection':
# selection group field