diff options
| author | stephanchrst <stephanchrst@gmail.com> | 2022-05-10 21:51:50 +0700 |
|---|---|---|
| committer | stephanchrst <stephanchrst@gmail.com> | 2022-05-10 21:51:50 +0700 |
| commit | 3751379f1e9a4c215fb6eb898b4ccc67659b9ace (patch) | |
| tree | a44932296ef4a9b71d5f010906253d8c53727726 /addons/purchase/controllers | |
| parent | 0a15094050bfde69a06d6eff798e9a8ddf2b8c21 (diff) | |
initial commit 2
Diffstat (limited to 'addons/purchase/controllers')
| -rw-r--r-- | addons/purchase/controllers/__init__.py | 4 | ||||
| -rw-r--r-- | addons/purchase/controllers/portal.py | 156 |
2 files changed, 160 insertions, 0 deletions
diff --git a/addons/purchase/controllers/__init__.py b/addons/purchase/controllers/__init__.py new file mode 100644 index 00000000..903b755e --- /dev/null +++ b/addons/purchase/controllers/__init__.py @@ -0,0 +1,4 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from . import portal diff --git a/addons/purchase/controllers/portal.py b/addons/purchase/controllers/portal.py new file mode 100644 index 00000000..82de7c58 --- /dev/null +++ b/addons/purchase/controllers/portal.py @@ -0,0 +1,156 @@ +# -*- 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.portal import pager as portal_pager, CustomerPortal +from odoo.addons.web.controllers.main import Binary + + +class CustomerPortal(CustomerPortal): + + def _prepare_home_portal_values(self, counters): + values = super()._prepare_home_portal_values(counters) + if 'purchase_count' in counters: + values['purchase_count'] = request.env['purchase.order'].search_count([ + ('state', 'in', ['purchase', 'done', 'cancel']) + ]) if request.env['purchase.order'].check_access_rights('read', raise_exception=False) else 0 + return values + + def _purchase_order_get_page_view_values(self, order, access_token, **kwargs): + # + def resize_to_48(b64source): + if not b64source: + b64source = base64.b64encode(Binary.placeholder()) + return image_process(b64source, size=(48, 48)) + + values = { + 'order': order, + 'resize_to_48': resize_to_48, + } + return self._get_page_view_values(order, access_token, values, 'my_purchases_history', False, **kwargs) + + @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): + values = self._prepare_portal_layout_values() + PurchaseOrder = request.env['purchase.order'] + + domain = [] + + if date_begin and date_end: + domain += [('create_date', '>', date_begin), ('create_date', '<=', date_end)] + + searchbar_sortings = { + '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'}, + } + # default sort by value + if not sortby: + sortby = 'date' + order = searchbar_sortings[sortby]['order'] + + searchbar_filters = { + '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')]}, + } + # default filter by value + if not filterby: + filterby = 'all' + domain += searchbar_filters[filterby]['domain'] + + # count for pager + purchase_count = PurchaseOrder.search_count(domain) + # make pager + pager = portal_pager( + url="/my/purchase", + url_args={'date_begin': date_begin, 'date_end': date_end, 'sortby': sortby, 'filterby': filterby}, + total=purchase_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['my_purchases_history'] = orders.ids[:100] + + values.update({ + 'date': date_begin, + 'orders': orders, + 'page_name': 'purchase', + 'pager': pager, + 'searchbar_sortings': searchbar_sortings, + 'sortby': sortby, + 'searchbar_filters': OrderedDict(sorted(searchbar_filters.items())), + 'filterby': filterby, + 'default_url': '/my/purchase', + }) + return request.render("purchase.portal_my_purchase_orders", values) + + @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='http', methods=['POST'], 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) |
