[FIX] (website_)event: fix 'sold out' display condition on frontend

One condition among other to determine if SOLD OUT should be displayed for a
ticket is start_sale_date < current date. However is start_sale_date is not
set a traceback is raised.

Moreover timezones are not taken into account when comparing dates, which may
create issues.

A tool method 'is_launched' has been added to overcome this problem. It works
like the already existing field 'is_expired'. Its value is computed based on
start_sale_date and event_id.date_tz. This will be changed into a not stored
computed field in master.

Task ID 2244487
PR #51503

X-original-commit: 9f81e126cdb1ce79ef26077a708cad8a7614031f
This commit is contained in:
Sébastien Mottet (oms)
2020-05-19 10:14:39 +00:00
committed by Thibault Delavallée
parent 28734ac268
commit 179c5fcaba
2 changed files with 13 additions and 7 deletions
+12 -6
View File
@@ -82,14 +82,10 @@ class EventTicket(models.Model):
else:
ticket.is_expired = False
@api.depends('start_sale_date', 'end_sale_date', 'event_id.date_tz', 'seats_available', 'seats_max')
@api.depends('is_expired', 'start_sale_date', 'event_id.date_tz', 'seats_available', 'seats_max')
def _compute_sale_available(self):
for ticket in self:
ticket = ticket._set_tz_context()
current_date = fields.Date.context_today(ticket)
if (ticket.start_sale_date and ticket.start_sale_date > current_date) or \
ticket.end_sale_date and ticket.end_sale_date < current_date or \
ticket.seats_available <= 0 and ticket.seats_max > 0:
if not ticket.is_launched() or ticket.is_expired or (ticket.seats_max and ticket.seats_available <= 0):
ticket.sale_available = False
else:
ticket.sale_available = True
@@ -142,3 +138,13 @@ class EventTicket(models.Model):
def _set_tz_context(self):
self.ensure_one()
return self.with_context(tz=self.event_id.date_tz or 'UTC')
def is_launched(self):
# TDE FIXME: in master, make a computed field, easier to use
self.ensure_one()
if self.start_sale_date:
ticket = self._set_tz_context()
current_date = fields.Date.context_today(ticket)
return ticket.start_sale_date < current_date
else:
return True
@@ -599,7 +599,7 @@
</t>
</select>
<div t-else="" class="text-danger">
<span t-if="not ticket.sale_available and not ticket.is_expired and ticket.start_sale_date &lt; datetime.date.today()" >Sold Out</span>
<span t-if="not ticket.sale_available and not ticket.is_expired and ticket.is_launched()" >Sold Out</span>
<span t-if="ticket.is_expired">Expired</span>
</div>
</div>