[FIX] website_event, _sale: protect against inactive products

Commit 14d1f6f6c1 responded to the need to have clean server answers for SEO purposes
and specifically when the products on event tickets have been archived
BUT
it introduced an infinite redirect loop when the event was in state == done

This present commit normalize the behavior in a comprehensive manner and cleans up the code a bit

OPW 757117

Closes #18667
This commit is contained in:
Lucas Perais (lpe)
2017-08-07 09:51:15 +02:00
parent b5ce70e70e
commit 78014ff3ac
5 changed files with 13 additions and 14 deletions
+3
View File
@@ -276,6 +276,9 @@ class EventEvent(models.Model):
for attendee in self.registration_ids.filtered(filter_func): for attendee in self.registration_ids.filtered(filter_func):
self.env['mail.template'].browse(template_id).send_mail(attendee.id, force_send=force_send) self.env['mail.template'].browse(template_id).send_mail(attendee.id, force_send=force_send)
@api.multi
def _is_event_registrable(self):
return True
class EventRegistration(models.Model): class EventRegistration(models.Model):
_name = 'event.registration' _name = 'event.registration'
+6
View File
@@ -24,6 +24,12 @@ class Event(models.Model):
event_ticket_ids = fields.One2many('event.event.ticket', 'event_id', string='Event Ticket', event_ticket_ids = fields.One2many('event.event.ticket', 'event_id', string='Event Ticket',
default=lambda self: self._default_tickets(), copy=True) default=lambda self: self._default_tickets(), copy=True)
@api.multi
def _is_event_registrable(self):
self.ensure_one()
if not self.event_ticket_ids:
return True
return all(self.event_ticket_ids.with_context(active_test=False).mapped(lambda t: t.product_id.active))
class EventTicket(models.Model): class EventTicket(models.Model):
+1 -3
View File
@@ -165,13 +165,11 @@ class WebsiteEventController(http.Controller):
@http.route(['/event/<model("event.event"):event>/register'], type='http', auth="public", website=True) @http.route(['/event/<model("event.event"):event>/register'], type='http', auth="public", website=True)
def event_register(self, event, **post): def event_register(self, event, **post):
if event.state == 'done':
return request.redirect("/event/%s" % slug(event))
values = { values = {
'event': event, 'event': event,
'main_object': event, 'main_object': event,
'range': range, 'range': range,
'registrable': event._is_event_registrable()
} }
return request.render("website_event.event_description_full", values) return request.render("website_event.event_description_full", values)
@@ -303,7 +303,8 @@
<template id="event_description_full"> <template id="event_description_full">
<t t-call="website_event.event_details"> <t t-call="website_event.event_details">
<div class="col-md-8"> <div class="col-md-8">
<t t-call="website_event.registration_template"/> <div t-if="event.state == 'done' or not registrable" class="alert alert-info">Registration for this event is now closed</div>
<t t-if="event.state != 'done' and registrable" t-call="website_event.registration_template"/>
<div class="clearfix"/> <div class="clearfix"/>
<hr/> <hr/>
<div itemprop="description" t-field="event.description"></div> <div itemprop="description" t-field="event.description"></div>
+1 -10
View File
@@ -3,7 +3,6 @@
from odoo import http, _ from odoo import http, _
from odoo.addons.website_event.controllers.main import WebsiteEventController from odoo.addons.website_event.controllers.main import WebsiteEventController
from odoo.addons.website.models.website import slug
from odoo.http import request from odoo.http import request
@@ -11,16 +10,8 @@ class WebsiteEventSaleController(WebsiteEventController):
@http.route(['/event/<model("event.event"):event>/register'], type='http', auth="public", website=True) @http.route(['/event/<model("event.event"):event>/register'], type='http', auth="public", website=True)
def event_register(self, event, **post): def event_register(self, event, **post):
if event.state == 'done':
return request.redirect("/event/%s" % slug(event))
event = event.with_context(pricelist=request.website.get_current_pricelist().id) event = event.with_context(pricelist=request.website.get_current_pricelist().id)
values = { return super(WebsiteEventSaleController, self).event_register(event, **post)
'event': event,
'main_object': event,
'range': range,
}
return request.render("website_event.event_description_full", values)
def _process_tickets_details(self, data): def _process_tickets_details(self, data):
ticket_post = {} ticket_post = {}