summaryrefslogtreecommitdiff
path: root/addons/website_quote/controllers/main.py
diff options
context:
space:
mode:
authorjpr-odoo <jpr@openerp.com>2018-08-13 21:34:09 +0200
committerSébastien Theys <seb@odoo.com>2018-08-13 21:53:19 +0200
commit4c31a758cf0715b1c1ff2f5b3cef18fec92c2d84 (patch)
treea82525949afd65d28d40c7015ac201c1663437e8 /addons/website_quote/controllers/main.py
parent5cf167abc61ee85d21302f21c631c4baa6ca92ce (diff)
[REF] various: move sale_payment and website_quote into sale and sale_management
[MOV] move sale_payment into sale ================================= Almost all use cases of sale require sale_payment down the line. There is only one case which does not: using sale_management without website_sale or website_quote. However, since we want to move most of the features of website_quote into sale_management, moving sale_payement first will make the task easier. [MOV] move website_quote into sale and sale_management ====================================================== We want to use some features of website_quote without having to install the whole module. The main issue with website_quote was that it had a requirement on website. What is common to website_sale and sale_management has been moved into sale. This is primarily the sales order portal view. What is only related to sale_management has been moved into it. This is notably: sales order templates, optional products, sign and pay, ... Everything that requires website has been moved into a new module named sale_quotation_builder. This is related to using the HTML builder to customize the quotation view. Models, files and routes have been renamed to better convey their purpose and to follow guidelines more closely. [IMP] merge sales order portal views ==================================== The old sales order view on the portal has been merged into the one from website_quote. The new view contains features of the two. A lot of fixes and improvements have also been done, related to BS4 issues but also to improve the sales order view in general. [IMP] add new settings ====================== The commit adds new settings related to activating the features that previously were activated by installing website_quote. PR: #26345 Task: 49205, 1838924
Diffstat (limited to 'addons/website_quote/controllers/main.py')
-rw-r--r--addons/website_quote/controllers/main.py225
1 files changed, 0 insertions, 225 deletions
diff --git a/addons/website_quote/controllers/main.py b/addons/website_quote/controllers/main.py
deleted file mode 100644
index 034773a0821..00000000000
--- a/addons/website_quote/controllers/main.py
+++ /dev/null
@@ -1,225 +0,0 @@
-# -*- coding: utf-8 -*-
-# Part of Odoo. See LICENSE file for full copyright and licensing details.
-
-import werkzeug
-
-from odoo import exceptions, fields, http, _
-from odoo.http import request
-from odoo.addons.portal.controllers.portal import get_records_pager
-from odoo.addons.sale.controllers.portal import CustomerPortal
-from odoo.addons.portal.controllers.mail import _message_post_helper
-from odoo.osv import expression
-
-
-class CustomerPortal(CustomerPortal):
-
- @http.route()
- def portal_order_page(self, order_id=None, access_token=None, **kw):
- try:
- order_sudo = self._document_check_access('sale.order', order_id, access_token=access_token)
- except exceptions.AccessError:
- pass
- else:
- if order_sudo.template_id and order_sudo.template_id.active:
- return request.redirect('/quote/%s/%s' % (order_id, access_token or ''))
- return super(CustomerPortal, self).portal_order_page(order_id=order_id, access_token=access_token, **kw)
-
- def _portal_quote_user_can_accept(self, order):
- result = super(CustomerPortal, self)._portal_quote_user_can_accept(order)
- # either use quote template settings or fallback on default behavior
- return order.require_signature if order.template_id else result
-
-
-class sale_quote(http.Controller):
-
- @http.route("/quote/<int:order_id>", type='http', auth="user", website=True)
- def view_user(self, *args, **kwargs):
- return self.view(*args, **kwargs)
-
- @http.route("/quote/<int:order_id>/<token>", type='http', auth="public", website=True)
- def view(self, order_id, pdf=None, token=None, message=False, **post):
- # use sudo to allow accessing/viewing orders for public user
- # only if he knows the private token
- now = fields.Date.today()
- if token:
- Order = request.env['sale.order'].sudo().search([('id', '=', order_id), ('access_token', '=', token)])
- else:
- Order = request.env['sale.order'].search([('id', '=', order_id)])
- # Log only once a day
- if Order and request.session.get('view_quote_%s' % Order.id) != now and request.env.user.share and token:
- request.session['view_quote_%s' % Order.id] = now
- body = _('Quotation viewed by customer')
- _message_post_helper(res_model='sale.order', res_id=Order.id, message=body, token=Order.access_token, message_type='notification', subtype="mail.mt_note", partner_ids=Order.user_id.sudo().partner_id.ids)
- if not Order:
- return request.render('website.404')
-
- # Token or not, sudo the order, since portal user has not access on
- # taxes, required to compute the total_amout of SO.
- order_sudo = Order.sudo()
-
- days = 0
- if order_sudo.validity_date:
- days = (fields.Date.from_string(order_sudo.validity_date) - fields.Date.from_string(fields.Date.today())).days + 1
- if pdf:
- pdf = request.env.ref('website_quote.report_web_quote').sudo().with_context(set_viewport_size=True).render_qweb_pdf([order_sudo.id])[0]
- pdfhttpheaders = [('Content-Type', 'application/pdf'), ('Content-Length', len(pdf))]
- return request.make_response(pdf, headers=pdfhttpheaders)
- transaction = order_sudo.get_portal_last_transaction()
- values = {
- 'quotation': order_sudo,
- 'message': message and int(message) or False,
- 'option': any(not x.line_id for x in order_sudo.options),
- 'order_valid': (not order_sudo.validity_date) or (now <= order_sudo.validity_date),
- 'days_valid': days,
- 'action': request.env.ref('sale.action_quotations').id,
- 'no_breadcrumbs': request.env.user.partner_id.commercial_partner_id not in order_sudo.message_partner_ids,
- 'tx_id': transaction.id if transaction else False,
- 'tx_state': transaction.state if transaction else False,
- 'payment_tx': transaction,
- 'tx_post_msg': transaction.acquirer_id.post_msg if transaction else False,
- 'need_payment': order_sudo.invoice_status == 'to invoice' and transaction.state in ['draft', 'cancel'],
- 'token': token,
- 'return_url': '/shop/payment/validate',
- 'bootstrap_formatting': True,
- 'partner_id': order_sudo.partner_id.id,
- }
-
- if order_sudo.has_to_be_paid() or values['need_payment']:
- domain = expression.AND([
- ['&', ('website_published', '=', True), ('company_id', '=', order_sudo.company_id.id)],
- ['|', ('specific_countries', '=', False), ('country_ids', 'in', [order_sudo.partner_id.country_id.id])]
- ])
- acquirers = request.env['payment.acquirer'].sudo().search(domain)
-
- values['form_acquirers'] = [acq for acq in acquirers if acq.payment_flow == 'form' and acq.view_template_id]
- values['s2s_acquirers'] = [acq for acq in acquirers if acq.payment_flow == 's2s' and acq.registration_view_template_id]
- values['pms'] = request.env['payment.token'].search(
- [('partner_id', '=', order_sudo.partner_id.id),
- ('acquirer_id', 'in', [acq.id for acq in values['s2s_acquirers']])])
-
- history = request.session.get('my_quotes_history', [])
- values.update(get_records_pager(history, order_sudo))
- return request.render('website_quote.so_quotation', values)
-
- @http.route(['/quote/<int:order_id>/<token>/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)
- if token != Order.access_token:
- return request.render('website.404')
- if Order.state != 'sent':
- return werkzeug.utils.redirect("/quote/%s/%s?message=4" % (order_id, token))
- Order.action_cancel()
- message = post.get('decline_message')
- if message:
- _message_post_helper(message=message, res_id=order_id, res_model='sale.order', **{'token': token} if token else {})
- return werkzeug.utils.redirect("/quote/%s/%s?message=2" % (order_id, token))
-
- @http.route(['/quote/update_line'], type='json', auth="public", website=True)
- def update(self, line_id, remove=False, unlink=False, order_id=None, token=None, **post):
- Order = request.env['sale.order'].sudo().browse(int(order_id))
- if token != Order.access_token:
- return request.render('website.404')
- if Order.state not in ('draft', 'sent'):
- return False
- OrderLine = request.env['sale.order.line'].sudo().browse(int(line_id))
- if unlink:
- OrderLine.unlink()
- return False
- number = -1 if remove else 1
- quantity = OrderLine.product_uom_qty + number
- OrderLine.write({'product_uom_qty': quantity})
- return [str(quantity), str(Order.amount_total)]
-
- @http.route(["/quote/template/<model('sale.quote.template'):quote>"], type='http', auth="user", website=True)
- def template_view(self, quote, **post):
- values = {'template': quote}
- return request.render('website_quote.so_template', values)
-
- @http.route(["/quote/add_line/<int:option_id>/<int:order_id>/<token>"], type='http', auth="public", website=True)
- def add(self, option_id, order_id, token, **post):
- Order = request.env['sale.order'].sudo().browse(order_id)
- if token != Order.access_token:
- return request.render('website.404')
- if Order.state not in ['draft', 'sent']:
- return request.render('website.http_error', {'status_code': 'Forbidden', 'status_message': _('You cannot add options to a confirmed order.')})
- Option = request.env['sale.order.option'].sudo().browse(option_id)
- vals = {
- 'price_unit': Option.price_unit,
- 'website_description': Option.website_description,
- 'name': Option.name,
- 'order_id': Order.id,
- 'product_id': Option.product_id.id,
- 'product_uom_qty': Option.quantity,
- 'product_uom': Option.uom_id.id,
- 'discount': Option.discount,
- }
-
- OrderLine = request.env['sale.order.line'].sudo().create(vals)
- OrderLine._compute_tax_id()
- Option.write({'line_id': OrderLine.id})
- return werkzeug.utils.redirect("/quote/%s/%s#pricing" % (Order.id, token))
-
- # note dbo: website_sale code
- @http.route(['/quote/<int:order_id>/transaction/'], type='json', auth="public", website=True)
- def payment_transaction_token(self, acquirer_id, order_id, save_token=False,access_token=None, **kwargs):
- """ Json method that creates a payment.transaction, used to create a
- transaction when the user clicks on 'pay now' button. After having
- created the transaction, the event continues and the user is redirected
- to the acquirer website.
-
- :param int acquirer_id: id of a payment.acquirer record. If not set the
- user is redirected to the checkout page
- """
- # Ensure a payment acquirer is selected
- if not acquirer_id:
- return False
-
- try:
- acquirer_id = int(acquirer_id)
- except:
- return False
-
- order = request.env['sale.order'].sudo().browse(order_id)
- if not order or not order.order_line:
- return False
-
- # Create transaction
- vals = {
- 'acquirer_id': acquirer_id,
- 'type': order._get_payment_type(),
- }
-
- transaction = order._create_payment_transaction(vals)
-
- return transaction.render_sale_button(
- order,
- '/quote/%s/%s' % (order_id, access_token) if access_token else '/quote/%s' % order_id,
- submit_txt=_('Pay & Confirm'),
- render_values={
- 'type': order._get_payment_type(),
- 'alias_usage': _('If we store your payment information on our server, subscription payments will be made automatically.'),
- }
- )
-
- @http.route('/quote/<int:order_id>/transaction/token', type='http', auth='public', website=True)
- def payment_token(self, order_id, pm_id=None, **kwargs):
-
- order = request.env['sale.order'].sudo().browse(order_id)
- if not order or not order.order_line or pm_id is None:
- return request.redirect("/quote/%s" % order_id)
-
- # try to convert pm_id into an integer, if it doesn't work redirect the user to the quote
- try:
- pm_id = int(pm_id)
- except ValueError:
- return request.redirect('/quote/%s' % order_id)
-
- # Create transaction
- vals = {
- 'payment_token_id': pm_id,
- 'type': 'server2server',
- }
-
- order._create_payment_transaction(vals)
-
- return request.redirect('/quote/%s/%s' % (order_id, order.access_token))