[IMP] sale: clean sale order portal page rendering

* Remove old unused parameters
* Move `backend_url` logic from qweb to python
* add comments, clean and simplify some code/logic related to portal
page of sale orders

Part-of: odoo/odoo#84644
This commit is contained in:
Victor Feyens
2022-02-28 14:46:56 +00:00
committed by Yannick Tivisse
parent 248e9d8d67
commit 213e0ba734
6 changed files with 44 additions and 47 deletions
+37 -31
View File
@@ -12,7 +12,7 @@ from odoo.addons.payment.controllers import portal as payment_portal
from odoo.addons.payment import utils as payment_utils
from odoo.addons.portal.controllers.mail import _message_post_helper
from odoo.addons.portal.controllers import portal
from odoo.addons.portal.controllers.portal import pager as portal_pager, get_records_pager
from odoo.addons.portal.controllers.portal import pager as portal_pager
class CustomerPortal(portal.CustomerPortal):
@@ -31,6 +31,18 @@ class CustomerPortal(portal.CustomerPortal):
return values
def _prepare_quotations_domain(self, partner):
return [
('message_partner_ids', 'child_of', [partner.commercial_partner_id.id]),
('state', 'in', ['sent', 'cancel'])
]
def _prepare_orders_domain(self, partner):
return [
('message_partner_ids', 'child_of', [partner.commercial_partner_id.id]),
('state', 'in', ['sale', 'done'])
]
def _get_sale_searchbar_sortings(self):
return {
'date': {'label': _('Order Date'), 'order': 'date_order desc'},
@@ -49,16 +61,12 @@ class CustomerPortal(portal.CustomerPortal):
partner = request.env.user.partner_id
values = self._prepare_portal_layout_values()
domain = [
('message_partner_ids', 'child_of', [partner.commercial_partner_id.id]),
]
if quotation_page:
url = "/my/quotes"
domain += [('state', 'in', ['sent', 'cancel'])]
domain = self._prepare_quotations_domain(partner)
else:
url = "/my/orders"
domain += [('state', 'in', ['sale', 'done'])]
domain = self._prepare_orders_domain(partner)
searchbar_sortings = self._get_sale_searchbar_sortings()
@@ -67,21 +75,21 @@ class CustomerPortal(portal.CustomerPortal):
if date_begin and date_end:
domain += [('create_date', '>', date_begin), ('create_date', '<=', date_end)]
pager = portal_pager(
pager_values = portal_pager(
url=url,
total=SaleOrder.search_count(domain),
page=page,
step=self._items_per_page,
url_args={'date_begin': date_begin, 'date_end': date_end, 'sortby': sortby},
)
orders = SaleOrder.search(domain, order=sort_order, limit=self._items_per_page, offset=pager['offset'])
orders = SaleOrder.search(domain, order=sort_order, limit=self._items_per_page, offset=pager_values['offset'])
values.update({
'date': date_begin,
'quotations': orders.sudo() if quotation_page else SaleOrder,
'orders': orders.sudo() if not quotation_page else SaleOrder,
'page_name': 'quote' if quotation_page else 'order',
'pager': pager,
'pager': pager_values,
'default_url': url,
'searchbar_sortings': searchbar_sortings,
'sortby': sortby,
@@ -111,39 +119,35 @@ class CustomerPortal(portal.CustomerPortal):
if report_type in ('html', 'pdf', 'text'):
return self._show_report(model=order_sudo, report_type=report_type, report_ref='sale.action_report_saleorder', download=download)
# use sudo to allow accessing/viewing orders for public user
# only if he knows the private token
# Log only once a day
if order_sudo:
# store the date as a string in the session to allow serialization
now = fields.Date.today().isoformat()
if request.env.user.share and access_token:
# If a public/portal user accesses the order with the access token
# Log a note on the chatter.
today = fields.Date.today().isoformat()
session_obj_date = request.session.get('view_quote_%s' % order_sudo.id)
if session_obj_date != now and request.env.user.share and access_token:
request.session['view_quote_%s' % order_sudo.id] = now
body = _('Quotation viewed by customer %s', order_sudo.partner_id.name)
if session_obj_date != today:
# store the date as a string in the session to allow serialization
request.session['view_quote_%s' % order_sudo.id] = today
_message_post_helper(
"sale.order",
order_sudo.id,
body,
message=_('Quotation viewed by customer %s', order_sudo.partner_id.name),
token=order_sudo.access_token,
message_type="notification",
subtype_xmlid="mail.mt_note",
partner_ids=order_sudo.user_id.sudo().partner_id.ids,
)
backend_url = f'/web#model={order_sudo._name}'\
f'&id={order_sudo.id}'\
f'&action={order_sudo._get_portal_return_action().id}'\
f'&view_type=form'
values = {
'sale_order': order_sudo,
'message': message,
'token': access_token,
'landing_route': '/shop/payment/validate',
'bootstrap_formatting': True,
'partner_id': order_sudo.partner_id.id,
'report_type': 'html',
'action': order_sudo._get_portal_return_action(),
**order_sudo._get_additional_order_page_values(),
'backend_url': backend_url,
'res_company': order_sudo.company_id, # Used to display correct company logo
}
if order_sudo.company_id:
values['res_company'] = order_sudo.company_id
# Payment values
if order_sudo.has_to_be_paid():
@@ -185,10 +189,12 @@ class CustomerPortal(portal.CustomerPortal):
})
if order_sudo.state in ('draft', 'sent', 'cancel'):
history = request.session.get('my_quotations_history', [])
history_session_key = 'my_quotations_history'
else:
history = request.session.get('my_orders_history', [])
values.update(get_records_pager(history, order_sudo))
history_session_key = 'my_orders_history'
values = self._get_page_view_values(
order_sudo, access_token, values, history_session_key, False)
return request.render('sale.sale_order_portal_template', values)
-4
View File
@@ -1162,10 +1162,6 @@ class SaleOrder(models.Model):
self.ensure_one()
return self.env.ref('sale.action_quotations_with_onboarding')
def _get_additional_order_page_values(self):
""" Return a dict of additional order page values for a sale.order."""
return {}
@api.model
def _prepare_down_payment_section_line(self, **optional_values):
"""
@@ -24,7 +24,7 @@ publicWidget.registry.SalePortalSidebar = PortalSidebar.extend({
this._setElementId($spyWatcheElement);
// Nav Menu ScrollSpy
this._generateMenu();
// After singature, automatically open the popup for payment
// After signature, automatically open the popup for payment
if ($.bbq.getState('allow_payment') === 'yes' && this.$('#o_sale_portal_paynow').length) {
this.$('#o_sale_portal_paynow').trigger('click');
$.bbq.removeState('allow_payment');
+2 -3
View File
@@ -114,9 +114,8 @@
<template id="sale_order_portal_template" name="Sales Order Portal Template" inherit_id="portal.portal_sidebar" primary="True">
<xpath expr="//div[hasclass('o_portal_sidebar')]" position="inside">
<t t-set="o_portal_fullwidth_alert" groups="sales_team.group_sale_salesman">
<t t-call="portal.portal_back_in_edit_mode">
<t t-set="backend_url" t-value="'/web#model=%s&amp;id=%s&amp;action=%s&amp;view_type=form' % (sale_order._name, sale_order.id, action.id)"/>
</t>
<!-- Uses backend_url provided in rendering values -->
<t t-call="portal.portal_back_in_edit_mode"/>
</t>
<div class="row mt16 o_portal_sale_sidebar">
-5
View File
@@ -47,8 +47,3 @@ class SaleOrder(models.Model):
'view_mode': 'tree,form',
})
return action
def _get_additional_order_page_values(self):
rendering_context_values = super()._get_additional_order_page_values()
rendering_context_values['mrp_production_ids'] = self.mrp_production_ids
return rendering_context_values
@@ -2,12 +2,13 @@
<odoo>
<template id="sale_order_portal_content_inherit_sale_mrp" name="Orders MOs" inherit_id="sale.sale_order_portal_content">
<xpath expr="//div[@id='informations']" position="inside">
<t t-if="mrp_production_ids">
<t t-set="mrp_productions" t-value="sale_order.mrp_production_ids"/>
<t t-if="mrp_productions">
<div>
<strong>Manufacturing Orders</strong>
</div>
<div>
<t t-foreach="mrp_production_ids" t-as="mo">
<t t-foreach="mrp_productions" t-as="mo">
<div class="d-flex flex-wrap align-items-center justify-content-between o_sale_stock_picking">
<div>
<span t-out="mo.name"/>
@@ -25,5 +26,5 @@
</div>
</t>
</xpath>
</template>
</template>
</odoo>