diff --git a/addons/website_quote/controllers/main.py b/addons/website_quote/controllers/main.py index f8c67177304..30ab9bb7b0f 100644 --- a/addons/website_quote/controllers/main.py +++ b/addons/website_quote/controllers/main.py @@ -1,6 +1,5 @@ # -*- coding: utf-8 -*- # Part of Odoo. See LICENSE file for full copyright and licensing details. -import base64 import werkzeug @@ -23,6 +22,19 @@ class CustomerPortal(CustomerPortal): return request.redirect('/quote/%s/%s' % (order, access_token or '')) return super(CustomerPortal, self).portal_order_page(order=order, access_token=access_token, **kw) + @http.route(['/my/quotes/accept'], type='json', auth="public", website=True) + def portal_quote_accept(self, res_id, access_token=None, partner_name=None, signature=None): + try: + order_sudo = self._order_check_access(res_id, access_token=access_token) + except exceptions.AccessError: + pass + else: + if order_sudo.require_payment: + return { + 'error': _('Order is not in a state requiring customer validation.') + } + return super(CustomerPortal, self).portal_quote_accept(res_id, access_token=access_token, partner_name=partner_name, signature=signature) + class sale_quote(http.Controller): @@ -102,19 +114,6 @@ class sale_quote(http.Controller): values.update(get_records_pager(history, order_sudo)) return request.render('website_quote.so_quotation', values) - @http.route(['/quote/accept'], type='json', auth="public", website=True) - def accept(self, order_id, token=None, signer=None, sign=None, **post): - Order = request.env['sale.order'].sudo().browse(order_id) - if token != Order.access_token or Order.require_payment: - return request.render('website.404') - if Order.state != 'sent': - return False - attachments = [('signature.png', base64.b64decode(sign))] if sign else [] - Order.action_confirm() - message = _('Order signed by %s') % (signer,) - _message_post_helper(message=message, res_id=order_id, res_model='sale.order', attachments=attachments, **({'token': token, 'token_field': 'access_token'} if token else {})) - return True - @http.route(['/quote///decline'], type='http', auth="public", methods=['POST'], website=True) def decline(self, order_id, token, **post): Order = request.env['sale.order'].sudo().browse(order_id) diff --git a/addons/website_quote/static/src/js/website_quotation.js b/addons/website_quote/static/src/js/website_quotation.js index 74b3aefe5e3..5c78c9d1363 100644 --- a/addons/website_quote/static/src/js/website_quotation.js +++ b/addons/website_quote/static/src/js/website_quotation.js @@ -46,77 +46,6 @@ if(!$('.o_website_quote').length) { update_button_list.push(button); }); - // Accept Modal, with jSignature - var AcceptModal = Widget.extend({ - events: { - 'shown.bs.modal': 'initSignature', - 'click #sign_clean': 'clearSignature', - 'submit #accept': 'submitForm', - }, - initSignature: function(ev){ - this.$("#signature").empty().jSignature({'decor-color' : '#D1D0CE', 'color': '#000', 'background-color': '#fff'}); - this.empty_sign = this.$("#signature").jSignature("getData",'image'); - }, - clearSignature: function(ev){ - this.$("#signature").jSignature('reset'); - }, - submitForm: function(ev){ - // extract data - var self = this; - var $confirm_btn = self.$el.find('button[type="submit"]'); - - // Support 2 routes: - // -
- // - - // The first route is deprecated but might still be used if the template is not updated - var href = self.$el.find('form').attr("action"); - var action, order_id, token; - if (href) { - action = href.match(/quote\/([a-z]+)/)[1]; - order_id = parseInt(href.match(/quote\/[a-z]+\/([0-9]+)/)[1]); - token = href.match(/token=(.*)/) && href.match(/token=(.*)/)[1]; - } - else { - action = 'accept'; - order_id = self.$el.find('form').data("order-id"); - token = self.$el.find('form').data("token"); - } - - if (action === 'accept') { - ev.preventDefault(); - // process : display errors, or submit - var signer_name = self.$("#name").val(); - var signature = self.$("#signature").jSignature("getData",'image'); - var is_empty = signature ? this.empty_sign[1] === signature[1] : false; - self.$('#signer').toggleClass('has-error', !signer_name); - self.$('#drawsign').toggleClass('panel-danger', is_empty).toggleClass('panel-default', !is_empty); - if (is_empty || ! signer_name){ - setTimeout(function () { - self.$('button[type="submit"], a.a-submit').removeAttr('data-loading-text').button('reset'); - }); - return false; - } - $confirm_btn.prepend(' '); - $confirm_btn.attr('disabled', true); - ajax.jsonRpc("/quote/"+action, 'call', { - 'order_id': order_id, - 'token': token, - 'signer': signer_name, - 'sign': signature?JSON.stringify(signature[1]):false, - }).then(function (data) { - var message_id = (data) ? 3 : 4; - self.$el.modal('hide'); - window.location.href = '/quote/'+order_id.toString()+'/'+token+'?message='+message_id; - }); - return false; - } - }, - }); - - var accept_modal = new AcceptModal(); - accept_modal.setElement($('#modalaccept')); - accept_modal.start(); - // Nav Menu ScrollSpy var NavigationSpyMenu = Widget.extend({ start: function(watched_selector){ diff --git a/addons/website_quote/views/website_quote_templates.xml b/addons/website_quote/views/website_quote_templates.xml index d1b546bbc81..c27bbf4fcd1 100644 --- a/addons/website_quote/views/website_quote_templates.xml +++ b/addons/website_quote/views/website_quote_templates.xml @@ -292,23 +292,19 @@ - @@ -534,21 +530,6 @@ - - -