From bebfe819720ee45f0614ae67f548edf04d666143 Mon Sep 17 00:00:00 2001 From: braisab Date: Fri, 5 Mar 2021 20:05:54 +0100 Subject: [PATCH] [WIP]pms: added reservations in portal --- pms/__manifest__.py | 1 + pms/controllers/pms_portal.py | 112 ++++++++++++- pms/models/pms_reservation.py | 5 + pms/security/ir.model.access.csv | 1 + pms/security/pms_security.xml | 7 + pms/views/reservation_portal_templates.xml | 180 +++++++++++++++++++++ 6 files changed, 305 insertions(+), 1 deletion(-) create mode 100644 pms/views/reservation_portal_templates.xml diff --git a/pms/__manifest__.py b/pms/__manifest__.py index 0c628585c..270cb2384 100644 --- a/pms/__manifest__.py +++ b/pms/__manifest__.py @@ -68,6 +68,7 @@ "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/pms_portal.py b/pms/controllers/pms_portal.py index db962effc..927320589 100644 --- a/pms/controllers/pms_portal.py +++ b/pms/controllers/pms_portal.py @@ -40,7 +40,7 @@ class PortalFolio(CustomerPortal): partner = request.env.user.partner_id values = self._prepare_portal_layout_values() PmsFolio = request.env["pms.folio"] - values["folios"] = PmsFolio.sudo().search( + values["folios"] = PmsFolio.search( [ ("partner_id", "child_of", partner.id), ] @@ -108,3 +108,113 @@ class PortalFolio(CustomerPortal): ) 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, "sortby": sortby}, + total=reservation_count, + page=page, + step=self._items_per_page, + ) + reservations = Reservation.search( + domain, order=sort_order, 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_reservation.py b/pms/models/pms_reservation.py index 04015fc96..48fd3593f 100644 --- a/pms/models/pms_reservation.py +++ b/pms/models/pms_reservation.py @@ -840,6 +840,11 @@ 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 _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 c41b2cae9..23c05a463 100644 --- a/pms/security/ir.model.access.csv +++ b/pms/security/ir.model.access.csv @@ -62,3 +62,4 @@ user_access_pms_invoice_filter_days_items,user_access_pms_invoice_filter_days_it 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 b1d35cae1..ff331b48f 100644 --- a/pms/security/pms_security.xml +++ b/pms/security/pms_security.xml @@ -230,5 +230,12 @@ + + Portal Personal Reservation + + [] + + + diff --git a/pms/views/reservation_portal_templates.xml b/pms/views/reservation_portal_templates.xml new file mode 100644 index 000000000..a4da35de5 --- /dev/null +++ b/pms/views/reservation_portal_templates.xml @@ -0,0 +1,180 @@ + + + + + + + + +