From ca7da746d81d6517c4afc3f5f85d66e5fe205d1d Mon Sep 17 00:00:00 2001 From: Romain Derie Date: Mon, 1 Apr 2019 14:06:07 +0000 Subject: [PATCH] [ADD] website_sale_coupon_delivery: add bridge module to avoid hacks This commit introduce a new module which is a bridge between `website_sale_coupon` and `website_sale_delivery`. Before that, commit odoo/enterprise@a0a8118 and odoo/odoo@1ab53c2 introduced coupon code into delivery module, and coupon+delivery code into `website_sale` module. That was the only way in stable but was nasty as it is not only code from one module in another module but also code from enterprise module in community module.. This is done to prepare the new feature to load carrier asynchronously on cart, see #31857 (Note that `sale_coupon_delivery` already exists) task-1867265 Coming from #31857 --- addons/website_sale/controllers/main.py | 17 ---------- .../website_sale_coupon/controllers/main.py | 17 ---------- .../website_sale_coupon_delivery/__init__.py | 4 +++ .../__manifest__.py | 14 +++++++++ .../controllers/__init__.py | 4 +++ .../controllers/main.py | 25 +++++++++++++++ .../src/js/website_sale_coupon_delivery.js | 31 +++++++++++++++++++ ...website_sale_coupon_delivery_templates.xml | 10 ++++++ .../website_sale_delivery/controllers/main.py | 21 ++++++++----- .../static/src/js/website_sale_delivery.js | 10 ------ 10 files changed, 102 insertions(+), 51 deletions(-) create mode 100644 addons/website_sale_coupon_delivery/__init__.py create mode 100644 addons/website_sale_coupon_delivery/__manifest__.py create mode 100644 addons/website_sale_coupon_delivery/controllers/__init__.py create mode 100644 addons/website_sale_coupon_delivery/controllers/main.py create mode 100644 addons/website_sale_coupon_delivery/static/src/js/website_sale_coupon_delivery.js create mode 100644 addons/website_sale_coupon_delivery/views/website_sale_coupon_delivery_templates.xml diff --git a/addons/website_sale/controllers/main.py b/addons/website_sale/controllers/main.py index d39145da32c..78d8e3e2fc3 100644 --- a/addons/website_sale/controllers/main.py +++ b/addons/website_sale/controllers/main.py @@ -1104,23 +1104,6 @@ class WebsiteSale(http.Controller): phone_code=country.phone_code ) - @http.route(['/shop/update_carrier'], type='json', auth='public', methods=['POST'], website=True, csrf=False) - def update_eshop_carrier(self, **post): - results = {} - if hasattr(self, '_update_website_sale_delivery'): - results.update(self._update_website_sale_delivery(**post)) - - if hasattr(self, '_update_website_sale_coupon'): - results.update(self._update_website_sale_coupon(**post)) - - return results - - def _format_amount(self, amount, currency): - fmt = "%.{0}f".format(currency.decimal_places) - lang = request.env['res.lang']._lang_get(request.env.context.get('lang') or 'en_US') - return lang.format(fmt, currency.round(amount), grouping=True, monetary=True)\ - .replace(r' ', u'\N{NO-BREAK SPACE}').replace(r'-', u'-\N{ZERO WIDTH NO-BREAK SPACE}') - # -------------------------------------------------------------------------- # Products Search Bar # -------------------------------------------------------------------------- diff --git a/addons/website_sale_coupon/controllers/main.py b/addons/website_sale_coupon/controllers/main.py index 0e0c87e3d2f..2df0ed34fed 100644 --- a/addons/website_sale_coupon/controllers/main.py +++ b/addons/website_sale_coupon/controllers/main.py @@ -28,23 +28,6 @@ class WebsiteSale(WebsiteSale): order.recompute_coupon_lines() return super(WebsiteSale, self).cart(**post) - def _update_website_sale_coupon(self, **post): - order = request.website.sale_get_order() - order.recompute_coupon_lines() - free_shipping_lines = order._get_free_shipping_lines() - currency = order.currency_id - result = {} - if free_shipping_lines: - amount_free_shipping = sum(free_shipping_lines.mapped('price_subtotal')) - result.update({ - 'new_amount_delivery': self._format_amount(0.0, currency), - 'new_amount_untaxed': self._format_amount(order.amount_untaxed, currency), - 'new_amount_tax': self._format_amount(order.amount_tax, currency), - 'new_amount_total': self._format_amount(order.amount_total, currency), - 'new_amount_order_discounted': self._format_amount(order.reward_amount - amount_free_shipping, currency) - }) - return result - # Override # Add in the rendering the free_shipping_line def _get_shop_payment_values(self, order, **kwargs): diff --git a/addons/website_sale_coupon_delivery/__init__.py b/addons/website_sale_coupon_delivery/__init__.py new file mode 100644 index 00000000000..dd15b5c32e5 --- /dev/null +++ b/addons/website_sale_coupon_delivery/__init__.py @@ -0,0 +1,4 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from . import controllers diff --git a/addons/website_sale_coupon_delivery/__manifest__.py b/addons/website_sale_coupon_delivery/__manifest__.py new file mode 100644 index 00000000000..f6ea078f258 --- /dev/null +++ b/addons/website_sale_coupon_delivery/__manifest__.py @@ -0,0 +1,14 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. +{ + 'name': "Free Delivery with Coupon on eCommerce", + 'summary': """Allows to offer free shippings in coupon reward on eCommerce""", + 'description': """Allows to offer free shippings in coupon reward on eCommerce""", + 'category': 'Website', + 'version': '1.0', + 'depends': ['website_sale_delivery', 'sale_coupon_delivery'], + 'data': [ + 'views/website_sale_coupon_delivery_templates.xml', + ], + 'auto_install': True, +} diff --git a/addons/website_sale_coupon_delivery/controllers/__init__.py b/addons/website_sale_coupon_delivery/controllers/__init__.py new file mode 100644 index 00000000000..5d4b25db9c0 --- /dev/null +++ b/addons/website_sale_coupon_delivery/controllers/__init__.py @@ -0,0 +1,4 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from . import main diff --git a/addons/website_sale_coupon_delivery/controllers/main.py b/addons/website_sale_coupon_delivery/controllers/main.py new file mode 100644 index 00000000000..bd2190b1035 --- /dev/null +++ b/addons/website_sale_coupon_delivery/controllers/main.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- +from odoo import http +from odoo.addons.website_sale_delivery.controllers.main import WebsiteSaleDelivery +from odoo.http import request + + +class WebsiteSaleCouponDelivery(WebsiteSaleDelivery): + + @http.route() + def update_eshop_carrier(self, **post): + result = super(WebsiteSaleCouponDelivery, self).update_eshop_carrier(**post) + order = request.website.sale_get_order() + order.recompute_coupon_lines() + free_shipping_lines = order._get_free_shipping_lines() + if free_shipping_lines: + currency = order.currency_id + amount_free_shipping = sum(free_shipping_lines.mapped('price_subtotal')) + result.update({ + 'new_amount_delivery': self._format_amount(0.0, currency), + 'new_amount_untaxed': self._format_amount(order.amount_untaxed, currency), + 'new_amount_tax': self._format_amount(order.amount_tax, currency), + 'new_amount_total': self._format_amount(order.amount_total, currency), + 'new_amount_order_discounted': self._format_amount(order.reward_amount - amount_free_shipping, currency), + }) + return result diff --git a/addons/website_sale_coupon_delivery/static/src/js/website_sale_coupon_delivery.js b/addons/website_sale_coupon_delivery/static/src/js/website_sale_coupon_delivery.js new file mode 100644 index 00000000000..e8c04a04de6 --- /dev/null +++ b/addons/website_sale_coupon_delivery/static/src/js/website_sale_coupon_delivery.js @@ -0,0 +1,31 @@ +odoo.define('website_sale_coupon_delivery.checkout', function (require) { +'use strict'; + +var core = require('web.core'); +var publicWidget = require('web.public.widget'); +require('website_sale_delivery.checkout'); + +var _t = core._t; + +publicWidget.registry.websiteSaleDelivery.include({ + + //-------------------------------------------------------------------------- + // Private + //-------------------------------------------------------------------------- + + /** + * @override + */ + _handleCarrierUpdateResult: function (result) { + this._super.apply(this, arguments); + if (result.new_amount_order_discounted) { + // Update discount of the order + $('#order_discounted').find('.oe_currency_value').text(result.new_amount_order_discounted); + + // We are in freeshipping, so every carrier is Free but we don't + // want to replace error message by 'Free' + $('#delivery_carrier .badge:not(.o_wsale_delivery_carrier_error)').text(_t('Free')); + } + }, +}); +}); diff --git a/addons/website_sale_coupon_delivery/views/website_sale_coupon_delivery_templates.xml b/addons/website_sale_coupon_delivery/views/website_sale_coupon_delivery_templates.xml new file mode 100644 index 00000000000..f42b869f009 --- /dev/null +++ b/addons/website_sale_coupon_delivery/views/website_sale_coupon_delivery_templates.xml @@ -0,0 +1,10 @@ + + + + + + diff --git a/addons/website_sale_delivery/controllers/main.py b/addons/website_sale_delivery/controllers/main.py index 6a111cb2212..4cf050cea7d 100644 --- a/addons/website_sale_delivery/controllers/main.py +++ b/addons/website_sale_delivery/controllers/main.py @@ -21,6 +21,14 @@ class WebsiteSaleDelivery(WebsiteSale): return super(WebsiteSaleDelivery, self).payment(**post) + @http.route(['/shop/update_carrier'], type='json', auth='public', methods=['POST'], website=True, csrf=False) + def update_eshop_carrier(self, **post): + order = request.website.sale_get_order() + carrier_id = int(post['carrier_id']) + if order: + order._check_carrier_quotation(force_carrier_id=carrier_id) + return self._update_website_sale_delivery_return(order, **post) + def order_lines_2_google_api(self, order_lines): """ Transforms a list of order lines into a dict for google analytics """ order_lines_not_delivery = order_lines.filtered(lambda line: not line.is_delivery) @@ -55,13 +63,6 @@ class WebsiteSaleDelivery(WebsiteSale): values['delivery_action_id'] = request.env.ref('delivery.action_delivery_carrier_form').id return values - def _update_website_sale_delivery(self, **post): - order = request.website.sale_get_order() - carrier_id = int(post['carrier_id']) - if order: - order._check_carrier_quotation(force_carrier_id=carrier_id) - return self._update_website_sale_delivery_return(order, **post) - def _update_website_sale_delivery_return(self, order, **post): carrier_id = int(post['carrier_id']) currency = order.currency_id @@ -76,3 +77,9 @@ class WebsiteSaleDelivery(WebsiteSale): 'new_amount_total': self._format_amount(order.amount_total, currency), } return {} + + def _format_amount(self, amount, currency): + fmt = "%.{0}f".format(currency.decimal_places) + lang = request.env['res.lang']._lang_get(request.env.context.get('lang') or 'en_US') + return lang.format(fmt, currency.round(amount), grouping=True, monetary=True)\ + .replace(r' ', u'\N{NO-BREAK SPACE}').replace(r'-', u'-\N{ZERO WIDTH NO-BREAK SPACE}') \ No newline at end of file diff --git a/addons/website_sale_delivery/static/src/js/website_sale_delivery.js b/addons/website_sale_delivery/static/src/js/website_sale_delivery.js index 63a0ea6ab1b..c3d44bd9069 100644 --- a/addons/website_sale_delivery/static/src/js/website_sale_delivery.js +++ b/addons/website_sale_delivery/static/src/js/website_sale_delivery.js @@ -46,16 +46,6 @@ publicWidget.registry.websiteSaleDelivery = publicWidget.Widget.extend({ var $carrierBadge = $('#delivery_carrier input[name="delivery_type"][value=' + result.carrier_id + '] ~ .badge.d-none'); var $computeBadge = $('#delivery_carrier input[name="delivery_type"][value=' + result.carrier_id + '] ~ .o_delivery_compute'); - if (result.new_amount_order_discounted) { - // Cross module without bridge - // Update discount of the order - $('#order_discounted').find('.oe_currency_value').text(result.new_amount_order_discounted); - - // We are in freeshipping, so every carrier is Free but we don't - // want to replace error message by 'Free' - $('#delivery_carrier .badge:not(.o_wsale_delivery_carrier_error)').text(_t('Free')); - } - if (result.status === true) { // if free delivery (`free_over` field), show 'Free', not '$0' if (parseInt(result.new_amount_delivery)) {