diff --git a/addons/account/models/account_invoice.py b/addons/account/models/account_invoice.py
index 6f7fee90d01..de783ef75a2 100644
--- a/addons/account/models/account_invoice.py
+++ b/addons/account/models/account_invoice.py
@@ -1296,9 +1296,10 @@ class AccountInvoiceTax(models.Model):
base = 0.0
for line in tax.invoice_id.invoice_line_ids:
if tax.tax_id in line.invoice_line_tax_ids:
- base += line.price_subtotal
- # To add include base amount taxes
- base += sum((line.invoice_line_tax_ids.filtered(lambda t: t.include_base_amount) - tax.tax_id).mapped('amount'))
+ price_unit = line.price_unit * (1 - (line.discount or 0.0) / 100.0)
+ base += (line.invoice_line_tax_ids - tax.tax_id).compute_all(
+ price_unit, line.invoice_id.currency_id, line.quantity, line.product_id, line.invoice_id.partner_id
+ )['base']
tax.base = base
invoice_id = fields.Many2one('account.invoice', string='Invoice', ondelete='cascade', index=True)
diff --git a/addons/hr_expense/models/hr_expense.py b/addons/hr_expense/models/hr_expense.py
index 15fc0473d3e..2362b355709 100644
--- a/addons/hr_expense/models/hr_expense.py
+++ b/addons/hr_expense/models/hr_expense.py
@@ -90,7 +90,7 @@ class HrExpense(models.Model):
user_ids.append(employee.parent_id.user_id.id)
if employee.department_id and employee.department_id.manager_id and employee.parent_id != employee.department_id.manager_id:
user_ids.append(employee.department_id.manager_id.user_id.id)
- self.message_subscribe_users(user_ids=user_ids)
+ self.sudo().message_subscribe_users(user_ids=user_ids)
@api.model
def create(self, vals):
diff --git a/addons/hr_recruitment/views/hr_recruitment_views.xml b/addons/hr_recruitment/views/hr_recruitment_views.xml
index f4498e03b53..62b227db4a7 100644
--- a/addons/hr_recruitment/views/hr_recruitment_views.xml
+++ b/addons/hr_recruitment/views/hr_recruitment_views.xml
@@ -300,6 +300,7 @@
+
Mobile:
oe_kanban_text_red
diff --git a/addons/payment_paypal/controllers/main.py b/addons/payment_paypal/controllers/main.py
index 0048c3ffb26..f840a33d6eb 100644
--- a/addons/payment_paypal/controllers/main.py
+++ b/addons/payment_paypal/controllers/main.py
@@ -65,7 +65,7 @@ class PaypalController(http.Controller):
self.paypal_validate_data(**post)
return ''
- @http.route('/payment/paypal/dpn', type='http', auth="none", methods=['POST'], csrf=False)
+ @http.route('/payment/paypal/dpn', type='http', auth="none", methods=['POST', 'GET'], csrf=False)
def paypal_dpn(self, **post):
""" Paypal DPN """
_logger.info('Beginning Paypal DPN form_feedback with post data %s', pprint.pformat(post)) # debug
diff --git a/addons/point_of_sale/models/pos_config.py b/addons/point_of_sale/models/pos_config.py
index 1f73121ffed..22ea92762f9 100644
--- a/addons/point_of_sale/models/pos_config.py
+++ b/addons/point_of_sale/models/pos_config.py
@@ -50,7 +50,7 @@ class PosConfig(models.Model):
iface_invoicing = fields.Boolean(string='Invoicing', help='Enables invoice generation from the Point of Sale', default=True)
iface_big_scrollbars = fields.Boolean('Large Scrollbars', help='For imprecise industrial touchscreens')
iface_print_auto = fields.Boolean(string='Automatic Receipt Printing', default=False,
- help='The receipt will automatically be p-rinted at the end of each order')
+ help='The receipt will automatically be printed at the end of each order')
iface_print_skip_screen = fields.Boolean(string='Skip Receipt Screen', default=True,
help='The receipt screen will be skipped if the receipt can be printed automatically.')
iface_precompute_cash = fields.Boolean(string='Prefill Cash Payment',
diff --git a/addons/web_editor/static/src/js/snippets.editor.js b/addons/web_editor/static/src/js/snippets.editor.js
index ef033dc07f3..cd03cb70f6a 100644
--- a/addons/web_editor/static/src/js/snippets.editor.js
+++ b/addons/web_editor/static/src/js/snippets.editor.js
@@ -620,7 +620,7 @@ var BuildingBlock = Widget.extend({
animation.start(true, $target);
self.call_for_all_snippets($target, function (editor, $snippet) {
- editor.drop_and_build_snippet();
+ _.defer(function () { editor.drop_and_build_snippet(); });
});
self.create_snippet_editor($target);
self.cover_target($target.data('overlay'), $target);
@@ -640,12 +640,10 @@ var BuildingBlock = Widget.extend({
var self = this;
$snippet.add(globalSelector.all($snippet)).each(function () {
var $snippet = $(this);
- setTimeout(function () {
- self.create_snippet_editor($snippet);
- if ($snippet.data("snippet-editor")) {
- callback.call(self, $snippet.data("snippet-editor"), $snippet);
- }
- });
+ self.create_snippet_editor($snippet);
+ if ($snippet.data("snippet-editor")) {
+ callback.call(self, $snippet.data("snippet-editor"), $snippet);
+ }
});
},
@@ -918,17 +916,25 @@ var Editor = Class.extend({
},
_drag_and_drop_stop: function () {
var self = this;
- var $dropzone = this.$target.prev();
- var prev = $dropzone.length && $dropzone[0].previousSibling;
+
+ $(".oe_drop_zone").droppable('destroy').remove();
+
+ var prev = this.$target.first()[0].previousSibling;
var next = this.$target.last()[0].nextSibling;
var $parent = this.$target.parent();
- $(".oe_drop_clone").after(this.$target);
+ var $clone = $(".oe_drop_clone");
+ if (prev === $clone[0]) {
+ prev = $clone[0].previousSibling;
+ } else if (next === $clone[0]) {
+ next = $clone[0].nextSibling;
+ }
+ $clone.after(this.$target);
this.$overlay.removeClass("hidden");
$("body").removeClass('move-important');
- $('.oe_drop_zone').droppable('destroy').remove();
- $(".oe_drop_clone, .oe_drop_to_remove").remove();
+ $clone.remove();
+ $(".oe_drop_to_remove").remove();
if (this.dropped) {
this.buildingBlock.parent.rte.historyRecordUndo(this.$target);
diff --git a/addons/website_portal/controllers/main.py b/addons/website_portal/controllers/main.py
index cf8e818fc3b..87ba93a68b0 100644
--- a/addons/website_portal/controllers/main.py
+++ b/addons/website_portal/controllers/main.py
@@ -46,7 +46,7 @@ class website_account(http.Controller):
'country_id': post.pop('country_id'),
'state_id': post.pop('state_id')
}
- partner.commercial_partner_id.write(address_fields)
+ partner.commercial_partner_id.sudo().write(address_fields)
partner.sudo().write(post)
if redirect:
return request.redirect(redirect)
diff --git a/doc/cla/corporate/goopen.md b/doc/cla/corporate/goopen.md
new file mode 100644
index 00000000000..91f5cded22a
--- /dev/null
+++ b/doc/cla/corporate/goopen.md
@@ -0,0 +1,15 @@
+Slovenia, 2016-09-05
+
+GoOpen, računalniške storitve, Aleš Ferlan s.p. agrees to the terms of the
+Odoo Corporate Contributor License Agreement v1.0.
+
+I declare that I am authorized and able to make this agreement and sign this
+declaration.
+
+Signed,
+
+Aleš Ferlan alefer89@protonmail.com
+
+List of contributors:
+
+Aleš Ferlan alefer89@protonmail.com
diff --git a/doc/setup/deploy.rst b/doc/setup/deploy.rst
index 3209154c41b..5b906bfcd7a 100644
--- a/doc/setup/deploy.rst
+++ b/doc/setup/deploy.rst
@@ -233,15 +233,15 @@ connections to the secure port
.. warning::
- In case you are using the Point of Sale module in combinaison with a `POSBox`_,
+ In case you are using the Point of Sale module in combination with a `POSBox`_,
you must disable the HTTPS configuration for the route ``/pos/web`` to avoid
- mix-content errors.
+ mixed-content errors.
Configuration sample
--------------------
* redirect http requests to https
-* proxiing requests to odoo
+* proxy requests to odoo
in ``/etc/odoo.conf`` set:
@@ -440,4 +440,4 @@ of the supported browsers by Odoo version is the following:
.. _use an SSH tunnel:
http://www.postgresql.org/docs/9.3/static/ssh-tunnels.html
.. _WSGI: http://wsgi.readthedocs.org/
-.. _POSBox: https://www.odoo.com/page/point-of-sale-hardware#part_2
\ No newline at end of file
+.. _POSBox: https://www.odoo.com/page/point-of-sale-hardware#part_2