odooapps/account_payment_portal/controllers/portal.py
madmooose e2492df90e
Some checks failed
pre-commit / pre-commit (push) Failing after 2m39s
tests / Detect unreleased dependencies (push) Successful in 5s
tests / test with OCB (push) Successful in 3m32s
tests / test with Odoo (push) Successful in 2m34s
account_payment_portal
* [WIP] account_payment_portal: first draft

* [ADD] account_payment_portal

* [IMP] account_payment_portal: Fix user rights and add test

---------

Co-authored-by: Niels Göttsch <ng@ife.de>
2026-06-08 20:36:22 +02:00

153 lines
5.3 KiB
Python

from collections import OrderedDict
from odoo import _, http
from odoo.http import request
from odoo.osv import expression
from odoo.addons.portal.controllers.portal import CustomerPortal
from odoo.addons.portal.controllers.portal import pager as portal_pager
class AccountPaymentPortal(CustomerPortal):
def _prepare_home_portal_values(self, counters):
values = super()._prepare_home_portal_values(counters)
if "payment_count" in counters:
payment_count = (
request.env["account.payment"].search_count(self._get_payment_domain())
if request.env["account.payment"].check_access_rights(
"read", raise_exception=False
)
else 0
)
values["payment_count"] = payment_count
return values
# ------------------------------------------------------------
# My Payments
# ------------------------------------------------------------
def _payment_get_page_view_values(self, payment, access_token, **kwargs):
values = {"page_name": "payment", "payment": payment}
return self._get_page_view_values(
payment, access_token, values, "my_invoices_history", False, **kwargs
)
def _get_payment_domain(self):
return [("is_internal_transfer", "=", False)]
def _get_account_searchbar_sortings(self):
return {
"date": {"label": _("Date"), "order": "date desc"},
"name": {"label": _("Reference"), "order": "name desc"},
"state": {"label": _("Status"), "order": "state"},
}
def _get_account_searchbar_filters(self):
# Add filter for payments and credit notes?
return {
"all": {"label": _("All"), "domain": []},
"sent": {
"label": _("Sent"),
"domain": [("payment_type", "=", "inbound")],
},
"received": {
"label": _("Received"),
"domain": [("payment_type", "=", "outbound")],
},
}
@http.route(
["/my/payments", "/my/payments/page/<int:page>"],
type="http",
auth="user",
website=True,
)
def portal_my_payments(
self, page=1, date_begin=None, date_end=None, sortby=None, filterby=None, **kw
):
values = self._prepare_my_payments_values(
page, date_begin, date_end, sortby, filterby
)
# pager
pager = portal_pager(**values["pager"])
# content according to pager and archive selected
payments = values["payments"](pager["offset"])
request.session["my_payments_history"] = payments.ids[:100]
values.update({"payments": payments, "pager": pager})
return request.render("account_payment_portal.portal_my_payments", values)
def _prepare_my_payments_values(
self,
page,
date_begin,
date_end,
sortby,
filterby,
domain=None,
url="/my/payments",
):
values = self._prepare_portal_layout_values()
AccountPayment = request.env["account.payment"]
domain = expression.AND([domain or [], self._get_payment_domain()])
searchbar_sortings = self._get_account_searchbar_sortings()
# default sort by order
if not sortby:
sortby = "date"
order = searchbar_sortings[sortby]["order"]
searchbar_filters = self._get_account_searchbar_filters()
# default filter by value
if not filterby:
filterby = "all"
domain += searchbar_filters[filterby]["domain"]
if date_begin and date_end:
domain += [
("create_date", ">", date_begin),
("create_date", "<=", date_end),
]
values.update(
{
"date": date_begin,
# content according to pager and archive selected lambda function to
# get the invoices recordset when the pager will be defined in the main
# method of a route
"payments": lambda pager_offset: (
AccountPayment.search(
domain,
order=order,
limit=self._items_per_page,
offset=pager_offset,
)
if AccountPayment.check_access_rights("read", raise_exception=False)
else AccountPayment
),
"page_name": "payment",
"pager": { # vals to define the pager.
"url": url,
"url_args": {
"date_begin": date_begin,
"date_end": date_end,
"sortby": sortby,
},
"total": AccountPayment.search_count(domain)
if AccountPayment.check_access_rights("read", raise_exception=False)
else 0,
"page": page,
"step": self._items_per_page,
},
"default_url": url,
"searchbar_sortings": searchbar_sortings,
"sortby": sortby,
"searchbar_filters": OrderedDict(sorted(searchbar_filters.items())),
"filterby": filterby,
}
)
return values