199 lines
8.0 KiB
Python
199 lines
8.0 KiB
Python
|
# -*- coding: utf-8 -*-
|
||
|
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
||
|
|
||
|
import base64
|
||
|
from collections import OrderedDict
|
||
|
from datetime import datetime
|
||
|
|
||
|
from odoo import http
|
||
|
from odoo.exceptions import AccessError, MissingError
|
||
|
from odoo.http import request, Response
|
||
|
from odoo.tools import image_process
|
||
|
from odoo.tools.translate import _
|
||
|
from odoo.addons.portal.controllers import portal
|
||
|
from odoo.addons.portal.controllers.portal import pager as portal_pager
|
||
|
|
||
|
|
||
|
class CustomerPortal(portal.CustomerPortal):
|
||
|
|
||
|
def _prepare_home_portal_values(self, counters):
|
||
|
values = super()._prepare_home_portal_values(counters)
|
||
|
PurchaseOrder = request.env['purchase.order']
|
||
|
if 'rfq_count' in counters:
|
||
|
values['rfq_count'] = PurchaseOrder.search_count([
|
||
|
('state', 'in', ['sent'])
|
||
|
]) if PurchaseOrder.check_access_rights('read', raise_exception=False) else 0
|
||
|
if 'purchase_count' in counters:
|
||
|
values['purchase_count'] = PurchaseOrder.search_count([
|
||
|
('state', 'in', ['purchase', 'done', 'cancel'])
|
||
|
]) if PurchaseOrder.check_access_rights('read', raise_exception=False) else 0
|
||
|
return values
|
||
|
|
||
|
def _get_purchase_searchbar_sortings(self):
|
||
|
return {
|
||
|
'date': {'label': _('Newest'), 'order': 'create_date desc, id desc'},
|
||
|
'name': {'label': _('Name'), 'order': 'name asc, id asc'},
|
||
|
'amount_total': {'label': _('Total'), 'order': 'amount_total desc, id desc'},
|
||
|
}
|
||
|
|
||
|
def _render_portal(self, template, page, date_begin, date_end, sortby, filterby, domain, searchbar_filters, default_filter, url, history, page_name, key):
|
||
|
values = self._prepare_portal_layout_values()
|
||
|
PurchaseOrder = request.env['purchase.order']
|
||
|
|
||
|
if date_begin and date_end:
|
||
|
domain += [('create_date', '>', date_begin), ('create_date', '<=', date_end)]
|
||
|
|
||
|
searchbar_sortings = self._get_purchase_searchbar_sortings()
|
||
|
# default sort
|
||
|
if not sortby:
|
||
|
sortby = 'date'
|
||
|
order = searchbar_sortings[sortby]['order']
|
||
|
|
||
|
if searchbar_filters:
|
||
|
# default filter
|
||
|
if not filterby:
|
||
|
filterby = default_filter
|
||
|
domain += searchbar_filters[filterby]['domain']
|
||
|
|
||
|
# count for pager
|
||
|
count = PurchaseOrder.search_count(domain)
|
||
|
|
||
|
# make pager
|
||
|
pager = portal_pager(
|
||
|
url=url,
|
||
|
url_args={'date_begin': date_begin, 'date_end': date_end, 'sortby': sortby, 'filterby': filterby},
|
||
|
total=count,
|
||
|
page=page,
|
||
|
step=self._items_per_page
|
||
|
)
|
||
|
|
||
|
# search the purchase orders to display, according to the pager data
|
||
|
orders = PurchaseOrder.search(
|
||
|
domain,
|
||
|
order=order,
|
||
|
limit=self._items_per_page,
|
||
|
offset=pager['offset']
|
||
|
)
|
||
|
request.session[history] = orders.ids[:100]
|
||
|
|
||
|
values.update({
|
||
|
'date': date_begin,
|
||
|
key: orders,
|
||
|
'page_name': page_name,
|
||
|
'pager': pager,
|
||
|
'searchbar_sortings': searchbar_sortings,
|
||
|
'sortby': sortby,
|
||
|
'searchbar_filters': OrderedDict(sorted(searchbar_filters.items())),
|
||
|
'filterby': filterby,
|
||
|
'default_url': url,
|
||
|
})
|
||
|
return request.render(template, values)
|
||
|
|
||
|
def _purchase_order_get_page_view_values(self, order, access_token, **kwargs):
|
||
|
#
|
||
|
def resize_to_48(source):
|
||
|
if not source:
|
||
|
source = request.env['ir.binary']._placeholder()
|
||
|
else:
|
||
|
source = base64.b64decode(source)
|
||
|
return base64.b64encode(image_process(source, size=(48, 48)))
|
||
|
|
||
|
values = {
|
||
|
'order': order,
|
||
|
'resize_to_48': resize_to_48,
|
||
|
'report_type': 'html',
|
||
|
}
|
||
|
if order.state in ('sent'):
|
||
|
history = 'my_rfqs_history'
|
||
|
else:
|
||
|
history = 'my_purchases_history'
|
||
|
return self._get_page_view_values(order, access_token, values, history, False, **kwargs)
|
||
|
|
||
|
@http.route(['/my/rfq', '/my/rfq/page/<int:page>'], type='http', auth="user", website=True)
|
||
|
def portal_my_requests_for_quotation(self, page=1, date_begin=None, date_end=None, sortby=None, filterby=None, **kw):
|
||
|
return self._render_portal(
|
||
|
"purchase.portal_my_purchase_rfqs",
|
||
|
page, date_begin, date_end, sortby, filterby,
|
||
|
[('state', '=', 'sent')],
|
||
|
{},
|
||
|
None,
|
||
|
"/my/rfq",
|
||
|
'my_rfqs_history',
|
||
|
'rfq',
|
||
|
'rfqs'
|
||
|
)
|
||
|
|
||
|
@http.route(['/my/purchase', '/my/purchase/page/<int:page>'], type='http', auth="user", website=True)
|
||
|
def portal_my_purchase_orders(self, page=1, date_begin=None, date_end=None, sortby=None, filterby=None, **kw):
|
||
|
return self._render_portal(
|
||
|
"purchase.portal_my_purchase_orders",
|
||
|
page, date_begin, date_end, sortby, filterby,
|
||
|
[],
|
||
|
{
|
||
|
'all': {'label': _('All'), 'domain': [('state', 'in', ['purchase', 'done', 'cancel'])]},
|
||
|
'purchase': {'label': _('Purchase Order'), 'domain': [('state', '=', 'purchase')]},
|
||
|
'cancel': {'label': _('Cancelled'), 'domain': [('state', '=', 'cancel')]},
|
||
|
'done': {'label': _('Locked'), 'domain': [('state', '=', 'done')]},
|
||
|
},
|
||
|
'all',
|
||
|
"/my/purchase",
|
||
|
'my_purchases_history',
|
||
|
'purchase',
|
||
|
'orders'
|
||
|
)
|
||
|
|
||
|
@http.route(['/my/purchase/<int:order_id>'], type='http', auth="public", website=True)
|
||
|
def portal_my_purchase_order(self, order_id=None, access_token=None, **kw):
|
||
|
try:
|
||
|
order_sudo = self._document_check_access('purchase.order', order_id, access_token=access_token)
|
||
|
except (AccessError, MissingError):
|
||
|
return request.redirect('/my')
|
||
|
|
||
|
report_type = kw.get('report_type')
|
||
|
if report_type in ('html', 'pdf', 'text'):
|
||
|
return self._show_report(model=order_sudo, report_type=report_type, report_ref='purchase.action_report_purchase_order', download=kw.get('download'))
|
||
|
|
||
|
confirm_type = kw.get('confirm')
|
||
|
if confirm_type == 'reminder':
|
||
|
order_sudo.confirm_reminder_mail(kw.get('confirmed_date'))
|
||
|
if confirm_type == 'reception':
|
||
|
order_sudo._confirm_reception_mail()
|
||
|
|
||
|
values = self._purchase_order_get_page_view_values(order_sudo, access_token, **kw)
|
||
|
update_date = kw.get('update')
|
||
|
if order_sudo.company_id:
|
||
|
values['res_company'] = order_sudo.company_id
|
||
|
if update_date == 'True':
|
||
|
return request.render("purchase.portal_my_purchase_order_update_date", values)
|
||
|
return request.render("purchase.portal_my_purchase_order", values)
|
||
|
|
||
|
@http.route(['/my/purchase/<int:order_id>/update'], type='json', auth="public", website=True)
|
||
|
def portal_my_purchase_order_update_dates(self, order_id=None, access_token=None, **kw):
|
||
|
"""User update scheduled date on purchase order line.
|
||
|
"""
|
||
|
try:
|
||
|
order_sudo = self._document_check_access('purchase.order', order_id, access_token=access_token)
|
||
|
except (AccessError, MissingError):
|
||
|
return request.redirect('/my')
|
||
|
|
||
|
updated_dates = []
|
||
|
for id_str, date_str in kw.items():
|
||
|
try:
|
||
|
line_id = int(id_str)
|
||
|
except ValueError:
|
||
|
return request.redirect(order_sudo.get_portal_url())
|
||
|
line = order_sudo.order_line.filtered(lambda l: l.id == line_id)
|
||
|
if not line:
|
||
|
return request.redirect(order_sudo.get_portal_url())
|
||
|
|
||
|
try:
|
||
|
updated_date = line._convert_to_middle_of_day(datetime.strptime(date_str, '%Y-%m-%d'))
|
||
|
except ValueError:
|
||
|
continue
|
||
|
|
||
|
updated_dates.append((line, updated_date))
|
||
|
|
||
|
if updated_dates:
|
||
|
order_sudo._update_date_planned_for_lines(updated_dates)
|
||
|
return Response(status=204)
|