[FIX] website_event: better sold out computation

Purpose of this commit is to remove some complex check embedded in templates
and replace them by a computed unstored field. It eases definition and
understanding.

Its computation has been cleaned, so that sold out appears only when tickets
are really sold out, not if their end sales date is reached. Sold out label
is displayed in both event list and event specific page views in frontend.

Small spacing issues in frontend registration form are also fixed.

Task ID 2228189
Community PR odoo/odoo#48652

X-original-commit: c36cf90e7b83d2424b2f52ad8a2fec0bf367e8d8
This commit is contained in:
Thibault Delavallée
2020-04-03 11:07:56 +00:00
parent b29b4bcbfc
commit bc1b5e134b
3 changed files with 30 additions and 10 deletions
+15
View File
@@ -170,6 +170,9 @@ class EventEvent(models.Model):
event_registrations_open = fields.Boolean(
'Registration open', compute='_compute_event_registrations_open', compute_sudo=True,
help='Registrations are open if event is not ended, seats are available on event and if tickets are sellable if ticketing is used.')
event_registrations_sold_out = fields.Boolean(
'Sold Out', compute='_compute_event_registrations_sold_out', compute_sudo=True,
help='Event is sold out if no more seats are available on event. If ticketing is used and all tickets are sold out event is sold out.')
start_sale_date = fields.Date(
'Start sale date', compute='_compute_start_sale_date',
help='If ticketing is used, this is the lowest starting sale date of tickets.')
@@ -268,6 +271,18 @@ class EventEvent(models.Model):
start_dates = [ticket.start_sale_date for ticket in event.event_ticket_ids if ticket.start_sale_date]
event.start_sale_date = min(start_dates) if start_dates else False
@api.depends('event_ticket_ids.sale_available')
def _compute_event_registrations_sold_out(self):
for event in self:
if event.seats_limited and not event.seats_available:
event.event_registrations_sold_out = True
elif event.event_ticket_ids:
event.event_registrations_sold_out = not any(
ticket.seats_available > 0 if ticket.seats_limited else True for ticket in event.event_ticket_ids
)
else:
event.event_registrations_sold_out = False
@api.depends('date_tz', 'date_begin')
def _compute_date_begin_tz(self):
for event in self:
-1
View File
@@ -208,7 +208,6 @@ class WebsiteEventController(http.Controller):
urls = event._get_event_resource_urls()
values = {
'event': event,
'sold_out': all(not ticket.sale_available and not ticket.is_expired for ticket in event.event_ticket_ids),
'main_object': event,
'range': range,
'google_url': urls.get('google_url'),
+15 -9
View File
@@ -237,9 +237,13 @@
<!-- Footer -->
<footer
t-attf-class="small align-self-end w-100 #{opt_events_list_cards and 'card-footer' or ((not opt_events_list_columns) and 'border-top mx-4 mt-auto pt-2' or 'border-top py-2')}">
<span class="text-danger"
t-if="event.seats_limited and not event.seats_available">
Sold Out
<span t-if="not event.event_registrations_open" class="text-danger">
<t t-if="event.event_registrations_sold_out">
Sold Out
</t>
<t t-else="">
Registrations Closed
</t>
</span>
</footer>
</div>
@@ -535,12 +539,12 @@
</t>
<t t-else="">
<div class="col-md-8">
<em t-if="not sold_out or event.date_end &lt; datetime.datetime.now()">Registrations are <b>closed</b></em>
<em t-else="">Tickets for this Event are <b>Sold Out</b></em>
<em t-if="event.event_registrations_sold_out">Tickets for this Event are <b>Sold Out</b></em>
<em t-else="">Registrations are <b>closed</b></em>
</div>
<button class="btn btn-danger ml-3 col-md-4 py-2" disabled="1">
<span t-if="not sold_out or event.date_end &lt; datetime.datetime.now()">Registrations Closed</span>
<span t-else="">Sold Out</span>
<button class="btn btn-danger ml-3 col-md-4 py-2" disabled="1">
<span t-if="event.event_registrations_sold_out">Sold Out</span>
<span t-else="">Registrations Closed</span>
</button>
</t>
</div>
@@ -603,7 +607,9 @@
</div>
<div class="row no-gutters">
<div class="col-md-4 offset-md-8 py-2 pl-md-0 pr-md-2">
<button type="submit" class="btn btn-primary o_wait_lazy_js btn-block a-submit" disabled="" t-attf-id="#{event.id}">Register<t t-if="event.seats_limited">(Available seats: <t t-esc="event.seats_available"/>)</t></button>
<button type="submit" class="btn btn-primary o_wait_lazy_js btn-block a-submit" disabled="" t-attf-id="#{event.id}">
Register<t t-if="event.seats_limited"> (Available seats: <t t-esc="event.seats_available"/>)</t>
</button>
</div>
</div>
</div>