diff --git a/addons/google_drive/static/src/css/google_drive.css b/addons/google_drive/static/src/css/google_drive.css
new file mode 100644
index 00000000000..ce2b22599b0
--- /dev/null
+++ b/addons/google_drive/static/src/css/google_drive.css
@@ -0,0 +1,5 @@
+li.oe_share_gdoc > a:after {
+ content: url('/google_drive/static/src/img/drive_icon.png');
+ position: absolute;
+ right: 5px;
+}
diff --git a/addons/google_drive/static/src/img/drive_icon.png b/addons/google_drive/static/src/img/drive_icon.png
index 590dde867f4..1553aa319a6 100644
Binary files a/addons/google_drive/static/src/img/drive_icon.png and b/addons/google_drive/static/src/img/drive_icon.png differ
diff --git a/addons/google_drive/static/src/js/gdrive.js b/addons/google_drive/static/src/js/gdrive.js
index bc7449c5507..6da06dcd8ec 100644
--- a/addons/google_drive/static/src/js/gdrive.js
+++ b/addons/google_drive/static/src/js/gdrive.js
@@ -41,7 +41,7 @@ Sidebar.include({
}
if (!already_there){
self.add_items('other', [{
- label: res.name+ '
',
+ label: res.name,
config_id: res.id,
res_id: res_id,
res_model: view.dataset.model,
diff --git a/addons/google_drive/views/google_drive_templates.xml b/addons/google_drive/views/google_drive_templates.xml
index f9481bfd5c5..1906a27696b 100644
--- a/addons/google_drive/views/google_drive_templates.xml
+++ b/addons/google_drive/views/google_drive_templates.xml
@@ -3,6 +3,7 @@
+
diff --git a/addons/payment_paypal/controllers/main.py b/addons/payment_paypal/controllers/main.py
index 7e4aac4c036..bdf35742bec 100644
--- a/addons/payment_paypal/controllers/main.py
+++ b/addons/payment_paypal/controllers/main.py
@@ -8,6 +8,7 @@ import urllib2
import werkzeug
from odoo import http
+from odoo.addons.payment.models.payment_acquirer import ValidationError
from odoo.http import request
_logger = logging.getLogger(__name__)
@@ -86,7 +87,10 @@ class PaypalController(http.Controller):
def paypal_ipn(self, **post):
""" Paypal IPN. """
_logger.info('Beginning Paypal IPN form_feedback with post data %s', pprint.pformat(post)) # debug
- self.paypal_validate_data(**post)
+ try:
+ self.paypal_validate_data(**post)
+ except ValidationError:
+ _logger.exception('Unable to validate the Paypal payment')
return ''
@http.route('/payment/paypal/dpn', type='http', auth="none", methods=['POST', 'GET'], csrf=False)
diff --git a/addons/point_of_sale/report/pos_invoice.py b/addons/point_of_sale/report/pos_invoice.py
index 9ce8b0860ba..92e3a0350e2 100644
--- a/addons/point_of_sale/report/pos_invoice.py
+++ b/addons/point_of_sale/report/pos_invoice.py
@@ -24,4 +24,4 @@ class PosInvoiceReport(models.AbstractModel):
not_invoiced_orders_names = list(map(lambda a: a.name, not_invoiced_posorders))
raise UserError(_('No link to an invoice for %s.') % ', '.join(not_invoiced_orders_names))
- return Report.sudo().render('account.report_invoice', {'docs': self.env['account.invoice'].browse(ids_to_print)})
+ return Report.sudo().render('account.report_invoice', {'docs': self.env['account.invoice'].sudo().browse(ids_to_print)})
diff --git a/addons/purchase/models/account_invoice.py b/addons/purchase/models/account_invoice.py
index a7971764734..00e11060444 100644
--- a/addons/purchase/models/account_invoice.py
+++ b/addons/purchase/models/account_invoice.py
@@ -162,10 +162,16 @@ class AccountInvoice(models.Model):
if valuation_price_unit != i_line.price_unit and line['price_unit'] == i_line.price_unit and acc:
# price with discount and without tax included
price_unit = i_line.price_unit * (1 - (i_line.discount or 0.0) / 100.0)
+ tax_ids = []
if line['tax_ids']:
#line['tax_ids'] is like [(4, tax_id, None), (4, tax_id2, None)...]
taxes = self.env['account.tax'].browse([x[1] for x in line['tax_ids']])
price_unit = taxes.compute_all(price_unit, currency=inv.currency_id, quantity=1.0)['total_excluded']
+ for tax in taxes:
+ tax_ids.append((4, tax.id, None))
+ for child in tax.children_tax_ids:
+ if child.type_tax_use != 'none':
+ tax_ids.append((4, child.id, None))
price_before = line.get('price', 0.0)
line.update({'price': round(valuation_price_unit * line['quantity'], account_prec)})
diff_res.append({
@@ -178,6 +184,7 @@ class AccountInvoice(models.Model):
'product_id': line['product_id'],
'uom_id': line['uom_id'],
'account_analytic_id': line['account_analytic_id'],
+ 'tax_ids': tax_ids,
})
return diff_res
return []
diff --git a/addons/sale/models/sale.py b/addons/sale/models/sale.py
index 7214c6260c5..113cf79245f 100644
--- a/addons/sale/models/sale.py
+++ b/addons/sale/models/sale.py
@@ -908,6 +908,11 @@ class SaleOrderLine(models.Model):
product_currency = None
if rule_id:
pricelist_item = PricelistItem.browse(rule_id)
+ if pricelist_item.pricelist_id.discount_policy == 'without_discount':
+ while pricelist_item.base == 'pricelist' and pricelist_item.base_pricelist_id and pricelist_item.base_pricelist_id.discount_policy == 'without_discount':
+ price, rule_id = pricelist_item.base_pricelist_id.with_context(uom=uom.id).get_product_price_rule(product, qty, self.order_id.partner_id)
+ pricelist_item = PricelistItem.browse(rule_id)
+
if pricelist_item.base == 'standard_price':
field_name = 'standard_price'
if pricelist_item.base == 'pricelist' and pricelist_item.base_pricelist_id:
@@ -944,8 +949,8 @@ class SaleOrderLine(models.Model):
self.env.user.has_group('sale.group_discount_per_so_line')):
return
- context_partner = dict(self.env.context, partner_id=self.order_id.partner_id.id)
- pricelist_context = dict(context_partner, uom=self.product_uom.id, date=self.order_id.date_order)
+ context_partner = dict(self.env.context, partner_id=self.order_id.partner_id.id, date=self.order_id.date_order)
+ pricelist_context = dict(context_partner, uom=self.product_uom.id)
price, rule_id = self.order_id.pricelist_id.with_context(pricelist_context).get_product_price_rule(self.product_id, self.product_uom_qty or 1.0, self.order_id.partner_id)
new_list_price, currency_id = self.with_context(context_partner)._get_real_price_currency(self.product_id, rule_id, self.product_uom_qty, self.product_uom, self.order_id.pricelist_id.id)
@@ -954,8 +959,7 @@ class SaleOrderLine(models.Model):
if price != 0 and new_list_price != 0:
if self.product_id.company_id and self.order_id.pricelist_id.currency_id != self.product_id.company_id.currency_id:
# new_list_price is in company's currency while price in pricelist currency
- ctx = dict(context_partner, date=self.order_id.date_order)
- new_list_price = self.env['res.currency'].browse(currency_id).with_context(ctx).compute(new_list_price, self.order_id.pricelist_id.currency_id)
+ new_list_price = self.env['res.currency'].browse(currency_id).with_context(context_partner).compute(new_list_price, self.order_id.pricelist_id.currency_id)
discount = (new_list_price - price) / new_list_price * 100
if discount > 0:
self.discount = discount
diff --git a/addons/web_editor/static/src/js/backend.js b/addons/web_editor/static/src/js/backend.js
index ce8643f04de..50551c381b4 100644
--- a/addons/web_editor/static/src/js/backend.js
+++ b/addons/web_editor/static/src/js/backend.js
@@ -288,6 +288,7 @@ var FieldTextHtml = widget.extend({
return src;
},
initialize_content: function () {
+ var self = this;
this.$el.closest('.modal-body').css('max-height', 'none');
this.$iframe = this.$el.find('iframe');
this.document = null;
@@ -296,6 +297,14 @@ var FieldTextHtml = widget.extend({
this.editor = false;
window.odoo[this.callback+"_updown"] = null;
this.$iframe.attr("src", this.get_url());
+ this.view.on("load_record", this, function(r){
+ if (!self.$body.find('.o_dirty').length){
+ var url = self.get_url();
+ if(url !== self.$iframe.attr("src")){
+ self.$iframe.attr("src", url);
+ }
+ }
+ });
},
on_content_loaded: function () {
var self = this;
diff --git a/addons/website_sale/static/src/js/website_sale.js b/addons/website_sale/static/src/js/website_sale.js
index 51029495c36..21dedb78f39 100644
--- a/addons/website_sale/static/src/js/website_sale.js
+++ b/addons/website_sale/static/src/js/website_sale.js
@@ -203,6 +203,19 @@ odoo.define('website_sale.website_sale', function (require) {
if (!event.isDefaultPrevented() && !$(this).is(".disabled")) {
$(this).closest('form').submit();
}
+ if ($(this).hasClass('a-submit-disable')){
+ $(this).addClass("disabled");
+ }
+ if ($(this).hasClass('a-submit-loading')){
+ var loading = '';
+ var fa_span = $(this).find('span[class*="fa"]');
+ if (fa_span.length){
+ fa_span.replaceWith(loading);
+ }
+ else{
+ $(this).append(loading);
+ }
+ }
});
$('form.js_attributes input, form.js_attributes select', oe_website_sale).on('change', function (event) {
if (!event.isDefaultPrevented()) {
diff --git a/addons/website_sale/views/templates.xml b/addons/website_sale/views/templates.xml
index 0dbb46899e7..71ec4ecfcd9 100644
--- a/addons/website_sale/views/templates.xml
+++ b/addons/website_sale/views/templates.xml
@@ -1258,7 +1258,7 @@
Back
-
+
Next
diff --git a/addons/website_slides/security/ir.model.access.csv b/addons/website_slides/security/ir.model.access.csv
index 39d871b2863..07d087f7db9 100644
--- a/addons/website_slides/security/ir.model.access.csv
+++ b/addons/website_slides/security/ir.model.access.csv
@@ -1,6 +1,6 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_slide_slide_public,slide.slide.public,model_slide_slide,base.group_public,1,0,0,0
-access_slide_slide_portal,slide.slide.portal,model_slide_slide,base.group_portal,1,1,1,0
+access_slide_slide_portal,slide.slide.portal,model_slide_slide,base.group_portal,1,0,0,0
access_slide_slide_user,slide.slide.user,model_slide_slide,base.group_user,1,1,1,1
access_slide_tag_public,slide.tag.public,model_slide_tag,base.group_public,1,0,0,0
access_slide_tag_portal,slide.tag.portal,model_slide_tag,base.group_portal,1,0,0,0
diff --git a/addons/website_slides/security/website_slides_security.xml b/addons/website_slides/security/website_slides_security.xml
index c464e6ff578..fe39060bd3b 100644
--- a/addons/website_slides/security/website_slides_security.xml
+++ b/addons/website_slides/security/website_slides_security.xml
@@ -17,7 +17,7 @@
Channel: public: published only
-
+
[('website_published', '=', True)]
@@ -36,7 +36,7 @@
Slide: public: published only
-
+
[('channel_id.website_published', '=', True), ('website_published', '=', True)]
diff --git a/odoo/addons/base/ir/ir_model.py b/odoo/addons/base/ir/ir_model.py
index deac3e1b957..8627046790d 100644
--- a/odoo/addons/base/ir/ir_model.py
+++ b/odoo/addons/base/ir/ir_model.py
@@ -130,10 +130,8 @@ class IrModel(models.Model):
for model in self:
if model.state != 'manual':
raise UserError(_("Model '%s' contains module data and cannot be removed!") % model.name)
-
- # prevent screwing up fields that depend on these models' fields
- for model in self:
- model.field_id._prepare_update()
+ # prevent screwing up fields that depend on these models' fields
+ model.field_id._prepare_update()
self._drop_table()
res = super(IrModel, self).unlink()
diff --git a/odoo/addons/base/res/res_users.py b/odoo/addons/base/res/res_users.py
index ef93e384f8b..f76fd33f78c 100644
--- a/odoo/addons/base/res/res_users.py
+++ b/odoo/addons/base/res/res_users.py
@@ -183,7 +183,7 @@ class Users(models.Model):
def _default_groups(self):
default_user = self.env.ref('base.default_user', raise_if_not_found=False)
- return (default_user or self.env['res.users']).groups_id
+ return (default_user or self.env['res.users']).sudo().groups_id
def _companies_count(self):
return self.env['res.company'].sudo().search_count([])