From f9a8c53e485445bc8e3474eb3978b0f83d5645c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Fri, 7 Apr 2017 17:23:46 +0200 Subject: [PATCH 1/6] [REF] website_sale(_delivery): correctly set data processing methods for payment in controllers instead of model Currently /shop/payment controller perform some data processing. It calls model methods _get_errors and _get_website_data that are defined on sale order model only to be inherited in website_sale_delivery. This commit proposes instead to have a data processing method in sale controllers that is inherited in website_sale_delivery. There is no need to have model methods only to format data. --- addons/website_sale/controllers/main.py | 73 ++++++++++--------- addons/website_sale/models/sale_order.py | 11 --- .../website_sale_delivery/controllers/main.py | 18 ++++- .../models/sale_order.py | 23 ------ 4 files changed, 55 insertions(+), 70 deletions(-) diff --git a/addons/website_sale/controllers/main.py b/addons/website_sale/controllers/main.py index 9ff71a4f1a0..1da4afa3716 100644 --- a/addons/website_sale/controllers/main.py +++ b/addons/website_sale/controllers/main.py @@ -696,6 +696,39 @@ class WebsiteSale(http.Controller): # Payment # ------------------------------------------------------ + def _get_shop_payment_values(self, order, **kwargs): + shipping_partner_id = False + if order: + shipping_partner_id = order.partner_shipping_id.id or order.partner_invoice_id.id + + values = dict( + website_sale_order=order, + errors=[], + partner=order.partner_id.id, + order=order, + ) + + acquirers = request.env['payment.acquirer'].search( + [('website_published', '=', True), ('company_id', '=', order.company_id.id)] + ) + values['acquirers'] = [] + for acquirer in acquirers: + acquirer_button = acquirer.with_context(submit_class='btn btn-primary', submit_txt=_('Pay Now')).sudo().render( + '/', + order.amount_total, + order.pricelist_id.currency_id.id, + values={ + 'return_url': '/shop/payment/validate', + 'partner_id': shipping_partner_id, + 'billing_partner_id': order.partner_invoice_id.id, + } + ) + acquirer.button = acquirer_button + values['acquirers'].append(acquirer) + values['tokens'] = request.env['payment.token'].search([('partner_id', '=', order.partner_id.id), ('acquirer_id', 'in', acquirers.ids)]) + + return values + @http.route(['/shop/payment'], type='http', auth="public", website=True) def payment(self, **post): """ Payment step. This page proposes several payment means based on available @@ -707,48 +740,18 @@ class WebsiteSale(http.Controller): did go to a payment.acquirer website but closed the tab without paying / canceling """ - SaleOrder = request.env['sale.order'] - order = request.website.sale_get_order() - redirection = self.checkout_redirection(order) if redirection: return redirection - shipping_partner_id = False - if order: - if order.partner_shipping_id.id: - shipping_partner_id = order.partner_shipping_id.id - else: - shipping_partner_id = order.partner_invoice_id.id + render_values = self._get_shop_payment_values(order, **post) - values = { - 'website_sale_order': order - } - values['errors'] = SaleOrder._get_errors(order) - values.update(SaleOrder._get_website_data(order)) - if not values['errors']: - acquirers = request.env['payment.acquirer'].search( - [('website_published', '=', True), ('company_id', '=', order.company_id.id)] - ) - values['acquirers'] = [] - for acquirer in acquirers: - acquirer_button = acquirer.with_context(submit_class='btn btn-primary', submit_txt=_('Pay Now')).sudo().render( - '/', - order.amount_total, - order.pricelist_id.currency_id.id, - values={ - 'return_url': '/shop/payment/validate', - 'partner_id': shipping_partner_id, - 'billing_partner_id': order.partner_invoice_id.id, - } - ) - acquirer.button = acquirer_button - values['acquirers'].append(acquirer) + if render_values['errors']: + render_values.pop('acquirers', '') + render_values.pop('tokens', '') - values['tokens'] = request.env['payment.token'].search([('partner_id', '=', order.partner_id.id), ('acquirer_id', 'in', acquirers.ids)]) - - return request.render("website_sale.payment", values) + return request.render("website_sale.payment", render_values) @http.route(['/shop/payment/transaction_token/confirm'], type='json', auth="public", website=True) def payment_transaction_token_confirm(self, tx, **kwargs): diff --git a/addons/website_sale/models/sale_order.py b/addons/website_sale/models/sale_order.py index baf78e4c01b..355af951f61 100644 --- a/addons/website_sale/models/sale_order.py +++ b/addons/website_sale/models/sale_order.py @@ -31,17 +31,6 @@ class SaleOrder(models.Model): order.cart_quantity = int(sum(order.mapped('website_order_line.product_uom_qty'))) order.only_services = all(l.product_id.type in ('service', 'digital') for l in order.website_order_line) - @api.model - def _get_errors(self, order): - return [] - - @api.model - def _get_website_data(self, order): - return { - 'partner': order.partner_id.id, - 'order': order - } - @api.multi def _cart_find_product_line(self, product_id=None, line_id=None, **kwargs): self.ensure_one() diff --git a/addons/website_sale_delivery/controllers/main.py b/addons/website_sale_delivery/controllers/main.py index 0e0f60aa70a..d4c908c9c38 100644 --- a/addons/website_sale_delivery/controllers/main.py +++ b/addons/website_sale_delivery/controllers/main.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- # Part of Odoo. See LICENSE file for full copyright and licensing details. -from odoo import http + +from odoo import http, _ from odoo.http import request from odoo.addons.website_sale.controllers.main import WebsiteSale @@ -32,3 +33,18 @@ class WebsiteSaleDelivery(WebsiteSale): if line.is_delivery: ret['transaction']['shipping'] = line.price_unit return ret + + def _get_shop_payment_values(self, order, **kwargs): + values = super(WebsiteSaleDelivery, self)._get_shop_payment_values(order, **kwargs) + if not order._get_delivery_methods(): + values['errors'].append( + (_('Sorry, we are unable to ship your order'), + _('No shipping method is available for your current order and shipping address. ' + 'Please contact us for more information.'))) + + has_stockable_products = any(line.product_id.type in ['consu', 'product'] for line in order.order_line) + if has_stockable_products: + delivery_carriers = order._get_delivery_methods() + values['deliveries'] = delivery_carriers.sudo().with_context(order_id=order.id) + + return values diff --git a/addons/website_sale_delivery/models/sale_order.py b/addons/website_sale_delivery/models/sale_order.py index 279dd758711..9b3c98741f8 100644 --- a/addons/website_sale_delivery/models/sale_order.py +++ b/addons/website_sale_delivery/models/sale_order.py @@ -90,29 +90,6 @@ class SaleOrder(models.Model): _logger.debug("Carrier #%s removed from e-commerce carrier list. %s" % (carrier_id, e)) return available_carriers - @api.model - def _get_errors(self, order): - errors = super(SaleOrder, self)._get_errors(order) - if not order._get_delivery_methods(): - errors.append( - (_('Sorry, we are unable to ship your order'), - _('No shipping method is available for your current order and shipping address. ' - 'Please contact us for more information.'))) - return errors - - @api.model - def _get_website_data(self, order): - """ Override to add delivery-related website data. """ - values = super(SaleOrder, self)._get_website_data(order) - # We need a delivery only if we have stockable products - has_stockable_products = any(order.order_line.filtered(lambda line: line.product_id.type in ['consu', 'product'])) - if not has_stockable_products: - return values - - delivery_carriers = order._get_delivery_methods() - values['deliveries'] = delivery_carriers.sudo().with_context(order_id=order.id) - return values - @api.multi def _cart_update(self, product_id=None, line_id=None, add_qty=0, set_qty=0, **kwargs): """ Override to update carrier quotation if quantity changed """ From 6c2535b9b62b1dbe0152bc483d66567336d8cc70 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Fri, 7 Apr 2017 17:33:24 +0200 Subject: [PATCH 2/6] [IMP] website_sale(_delivery): allow to choose a payment / delivery methods in frontend When choosing a payment and/or delivery provider in website_sale admin now see a link to install and configure them. --- addons/website_sale/controllers/main.py | 1 + addons/website_sale/views/templates.xml | 10 ++-- .../website_sale_delivery/controllers/main.py | 1 + .../views/website_sale_delivery_templates.xml | 48 ++++++++++--------- 4 files changed, 35 insertions(+), 25 deletions(-) diff --git a/addons/website_sale/controllers/main.py b/addons/website_sale/controllers/main.py index 1da4afa3716..c14db463d47 100644 --- a/addons/website_sale/controllers/main.py +++ b/addons/website_sale/controllers/main.py @@ -706,6 +706,7 @@ class WebsiteSale(http.Controller): errors=[], partner=order.partner_id.id, order=order, + payment_action_id=request.env.ref('payment.action_payment_acquirer').id, ) acquirers = request.env['payment.acquirer'].search( diff --git a/addons/website_sale/views/templates.xml b/addons/website_sale/views/templates.xml index 63bf22b2a8b..f9db360d5e7 100644 --- a/addons/website_sale/views/templates.xml +++ b/addons/website_sale/views/templates.xml @@ -1369,8 +1369,8 @@
-
-

Payment Method:

+
+

Choose a payment method

    @@ -1411,8 +1411,12 @@
+ + Setup payment methods +
-
+