diff --git a/pms/__init__.py b/pms/__init__.py index 22280bdac..36176c525 100644 --- a/pms/__init__.py +++ b/pms/__init__.py @@ -2,4 +2,5 @@ from . import models from . import wizards +from . import controllers from .init_hook import post_init_hook diff --git a/pms/__manifest__.py b/pms/__manifest__.py index b04aadc5f..a8d4fb0d5 100644 --- a/pms/__manifest__.py +++ b/pms/__manifest__.py @@ -70,6 +70,8 @@ "views/webclient_templates.xml", "views/ir_sequence_views.xml", "views/account_journal_views.xml", + "views/folio_portal_templates.xml", + "views/reservation_portal_templates.xml", "wizards/wizard_reservation.xml", "wizards/wizard_massive_changes.xml", "wizards/wizard_advanced_filters.xml", diff --git a/pms/controllers/__init__.py b/pms/controllers/__init__.py new file mode 100644 index 000000000..52d463f19 --- /dev/null +++ b/pms/controllers/__init__.py @@ -0,0 +1 @@ +from . import pms_portal diff --git a/pms/controllers/pms_portal.py b/pms/controllers/pms_portal.py new file mode 100644 index 000000000..89b8b2c4b --- /dev/null +++ b/pms/controllers/pms_portal.py @@ -0,0 +1,220 @@ +from odoo import _, http +from odoo.exceptions import AccessError, MissingError +from odoo.http import request + +from odoo.addons.portal.controllers.portal import CustomerPortal, pager as portal_pager + + +class PortalFolio(CustomerPortal): + def _prepare_home_portal_values(self, counters): + partner = request.env.user.partner_id + values = super()._prepare_home_portal_values(counters) + Folio = request.env["pms.folio"] + if "folio_count" in counters: + values["folio_count"] = ( + Folio.search_count( + [ + ("partner_id", "=", partner.id), + ] + ) + if Folio.check_access_rights("read", raise_exception=False) + else 0 + ) + return values + + def _folio_get_page_view_values(self, folio, access_token, **kwargs): + values = {"folio": folio, "token": access_token} + return self._get_page_view_values( + folio, access_token, values, "my_folios_history", False, **kwargs + ) + + @http.route( + ["/my/folios", "/my/folios/page/"], + type="http", + auth="user", + website=True, + ) + def portal_my_folios( + self, page=1, date_begin=None, date_end=None, sortby=None, filterby=None, **kw + ): + partner = request.env.user.partner_id + values = self._prepare_portal_layout_values() + PmsFolio = request.env["pms.folio"] + values["folios"] = PmsFolio.search( + [ + ("partner_id", "child_of", partner.id), + ] + ) + domain = [ + ("partner_id", "child_of", partner.id), + ] + searchbar_sortings = { + "date": {"label": _("Order Date"), "folio": "date_order desc"}, + "name": {"label": _("Reference"), "folio": "name"}, + "stage": {"label": _("Stage"), "folio": "state"}, + } + if not sortby: + sortby = "date" + sort_order = searchbar_sortings[sortby]["folio"] + + if date_begin and date_end: + domain += [ + ("create_date", ">", date_begin), + ("create_date", "<=", date_end), + ] + folio_count = PmsFolio.search_count(domain) + pager = portal_pager( + url="/my/folios", + url_args={"date_begin": date_begin, "date_end": date_end, "sortby": sortby}, + total=folio_count, + page=page, + step=self._items_per_page, + ) + folios = PmsFolio.search( + domain, order=sort_order, limit=self._items_per_page, offset=pager["offset"] + ) + request.session["my_folios_history"] = folios.ids[:100] + values.update( + { + "date": date_begin, + "folios": folios.sudo(), + "page_name": "folios", + "pager": pager, + "default_url": "/my/folios", + "searchbar_sortings": searchbar_sortings, + "sortby": sortby, + } + ) + return request.render("pms.portal_my_folio", values) + + @http.route(["/my/folios/"], type="http", auth="user", website=True) + def portal_my_folio_detail( + self, folio_id, access_token=None, report_type=None, download=False, **kw + ): + try: + folio_sudo = self._document_check_access( + "pms.folio", + folio_id, + access_token=access_token, + ) + except (AccessError, MissingError): + return request.redirect("/my") + if report_type in ("html", "pdf", "text"): + return self._show_report( + model=folio_sudo, + report_type=report_type, + report_ref="pms.action_report_folio", + download=download, + ) + values = self._folio_get_page_view_values(folio_sudo, access_token, **kw) + return request.render("pms.folio_portal_template", values) + + +class PortalReservation(CustomerPortal): + def _prepare_home_portal_values(self, counters): + partner = request.env.user.partner_id + values = super()._prepare_home_portal_values(counters) + Reservation = request.env["pms.reservation"] + if "reservation_count" in counters: + values["reservation_count"] = ( + Reservation.search_count( + [ + ("partner_id", "=", partner.id), + ] + ) + if Reservation.check_access_rights("read", raise_exception=False) + else 0 + ) + return values + + def _reservation_get_page_view_values(self, reservation, access_token, **kwargs): + values = {"reservation": reservation, "token": access_token} + return self._get_page_view_values( + reservation, + access_token, + values, + "my_reservations_history", + False, + **kwargs + ) + + @http.route( + ["/my/reservations", "/my/reservations/page/"], + type="http", + auth="user", + website=True, + ) + def portal_my_reservations( + self, page=1, date_begin=None, date_end=None, sortby=None, filterby=None, **kw + ): + partner = request.env.user.partner_id + values = self._prepare_portal_layout_values() + Reservation = request.env["pms.reservation"] + values["reservations"] = Reservation.search( + [ + ("partner_id", "child_of", partner.id), + ] + ) + domain = [ + ("partner_id", "child_of", partner.id), + ] + # searchbar_sortings = { + # "date": {"label": _("Order Date"), "reservation": "date_order desc"}, + # "name": {"label": _("Reference"), "reservation": "name"}, + # "stage": {"label": _("Stage"), "reservation": "state"}, + # } + # if not sortby: + # sortby = "date" + # sort_order = searchbar_sortings[sortby]["reservation"] + + if date_begin and date_end: + domain += [ + ("create_date", ">", date_begin), + ("create_date", "<=", date_end), + ] + reservation_count = Reservation.search_count(domain) + pager = portal_pager( + url="/my/reservations", + url_args={"date_begin": date_begin, "date_end": date_end}, + total=reservation_count, + page=page, + step=self._items_per_page, + ) + reservations = Reservation.search( + domain, limit=self._items_per_page, offset=pager["offset"] + ) + request.session["my_reservations_history"] = reservations.ids[:100] + values.update( + { + "date": date_begin, + "reservations": reservations.sudo(), + "page_name": "reservations", + "pager": pager, + "default_url": "/my/reservations", + # "searchbar_sortings": searchbar_sortings, + # "sortby": sortby, + } + ) + return request.render("pms.portal_my_reservation", values) + + @http.route( + ["/my/reservations/"], + type="http", + auth="user", + website=True, + ) + def portal_my_reservation_detail(self, reservation_id, access_token=None, **kw): + try: + reservation_sudo = self._document_check_access( + "pms.reservation", + reservation_id, + access_token=access_token, + ) + except (AccessError, MissingError): + return request.redirect("/my") + # for attachment in reservation_sudo.attachment_ids: + # attachment.generate_access_token() + values = self._reservation_get_page_view_values( + reservation_sudo, access_token, **kw + ) + return request.render("pms.portal_my_reservation_detail", values) diff --git a/pms/models/pms_folio.py b/pms/models/pms_folio.py index 2b4169701..96213a3c0 100644 --- a/pms/models/pms_folio.py +++ b/pms/models/pms_folio.py @@ -553,6 +553,19 @@ class PmsFolio(models.Model): order.move_ids = invoices order.invoice_count = len(invoices) + def _compute_access_url(self): + super(PmsFolio, self)._compute_access_url() + for folio in self: + folio.access_url = "/my/folios/%s" % (folio.id) + + def preview_folio(self): + self.ensure_one() + return { + "type": "ir.actions.act_url", + "target": "self", + "url": self.get_portal_url(), + } + def _search_invoice_ids(self, operator, value): if operator == "in" and value: self.env.cr.execute( @@ -757,6 +770,9 @@ class PmsFolio(models.Model): record.max_reservation_prior = max(reservation_priors) # Action methods + def _get_report_base_filename(self): + self.ensure_one() + return "Folio %s" % self.name def action_pay(self): self.ensure_one() diff --git a/pms/models/pms_reservation.py b/pms/models/pms_reservation.py index 651392cb1..23af3a5e6 100644 --- a/pms/models/pms_reservation.py +++ b/pms/models/pms_reservation.py @@ -846,6 +846,19 @@ class PmsReservation(models.Model): else False ) + def _compute_access_url(self): + super(PmsReservation, self)._compute_access_url() + for reservation in self: + reservation.access_url = "/my/reservations/%s" % (reservation.id) + + def preview_reservation(self): + self.ensure_one() + return { + "type": "ir.actions.act_url", + "target": "self", + "url": self.get_portal_url(), + } + def _search_left_for_checkin(self, operator, value): if operator not in ("=",): raise UserError( diff --git a/pms/security/ir.model.access.csv b/pms/security/ir.model.access.csv index ce18fbbfd..23c05a463 100644 --- a/pms/security/ir.model.access.csv +++ b/pms/security/ir.model.access.csv @@ -61,3 +61,5 @@ user_access_pms_invoice_filter_days,user_access_pms_invoice_filter_days,model_pm user_access_pms_invoice_filter_days_items,user_access_pms_invoice_filter_days_items,model_pms_invoice_filter_days_items,pms.group_pms_user,1,1,1,1 user_access_wizard_payment_folio,user_access_wizard_payment_folio,model_wizard_payment_folio,pms.group_pms_user,1,1,1,1 user_access_wizard_folio_changes,user_access_wizard_folio_changes,model_wizard_folio_changes,pms.group_pms_user,1,1,1,1 +user_access_pms_folio_portal,user_access_pms_folio_portal,model_pms_folio,base.group_portal,1,0,0,0 +user_access_pms_reservation_portal,user_access_pms_reservation_portal,model_pms_reservation,base.group_portal,1,0,0,0 diff --git a/pms/security/pms_security.xml b/pms/security/pms_security.xml index d9af58fb9..ff331b48f 100644 --- a/pms/security/pms_security.xml +++ b/pms/security/pms_security.xml @@ -223,5 +223,19 @@ user.get_active_property_ids())] + + Portal Personal Folios + + [] + + + + + Portal Personal Reservation + + [] + + + diff --git a/pms/views/folio_portal_templates.xml b/pms/views/folio_portal_templates.xml new file mode 100644 index 000000000..5c5f754fc --- /dev/null +++ b/pms/views/folio_portal_templates.xml @@ -0,0 +1,470 @@ + + + + + + + + + + + diff --git a/pms/views/pms_folio_views.xml b/pms/views/pms_folio_views.xml index 0c3287647..2bd9b6d62 100644 --- a/pms/views/pms_folio_views.xml +++ b/pms/views/pms_folio_views.xml @@ -130,6 +130,17 @@ > New Booking Group + +