agendas: refresh_computed_times on booking (#82848)

This commit is contained in:
Lauréline Guérin 2023-10-26 14:23:20 +02:00 committed by Lauréline Guérin
parent 031961ad80
commit 9d1c33970c
4 changed files with 43 additions and 30 deletions

View File

@ -1621,23 +1621,22 @@ class Agenda(models.Model):
self.refresh_booking_computed_times()
def refresh_booking_computed_times(self):
bookings_queryset = Booking.objects.filter(
event__agenda__kind='events',
event__agenda__partial_bookings=True,
event__agenda=self,
event__check_locked=False,
event__invoiced=False,
event__cancelled=False,
cancellation_datetime__isnull=True,
)
booking_checks = BookingCheck.objects.filter(booking__in=bookings_queryset).select_related(
'booking', 'booking__event__agenda'
bookings_queryset = (
Booking.objects.filter(
event__agenda__kind='events',
event__agenda__partial_bookings=True,
event__agenda=self,
event__check_locked=False,
event__invoiced=False,
event__cancelled=False,
cancellation_datetime__isnull=True,
)
.prefetch_related('user_checks')
.select_related('event__agenda')
)
to_update = []
for booking_check in booking_checks:
changed = booking_check.refresh_computed_times()
if changed:
to_update.append(booking_check)
for booking in bookings_queryset:
to_update += booking.refresh_computed_times()
if to_update:
BookingCheck.objects.bulk_update(to_update, ['computed_start_time', 'computed_end_time'])
@ -2249,14 +2248,11 @@ class Event(models.Model):
event__invoiced=False,
event__cancelled=False,
cancellation_datetime__isnull=True,
)
booking_checks = BookingCheck.objects.filter(booking__in=bookings_queryset).select_related('booking')
).prefetch_related('user_checks')
to_update = []
for booking_check in booking_checks:
booking_check.booking.event = self # to avoid lots of querysets
changed = booking_check.refresh_computed_times()
if changed:
to_update.append(booking_check)
for booking in bookings_queryset:
booking.event = self # to avoid lots of querysets
to_update += booking.refresh_computed_times()
if to_update:
BookingCheck.objects.bulk_update(to_update, ['computed_start_time', 'computed_end_time'])
@ -2949,6 +2945,16 @@ class Booking(models.Model):
self.save()
self.event.set_is_checked()
def refresh_computed_times(self, commit=False):
to_update = []
for user_check in self.user_checks.all():
changed = user_check._refresh_computed_times()
if changed:
to_update.append(user_check)
if commit and to_update:
BookingCheck.objects.bulk_update(to_update, ['computed_start_time', 'computed_end_time'])
return to_update
def get_user_block(self):
template_vars = Context(settings.TEMPLATE_VARS, autoescape=False)
template_vars.update(
@ -3111,7 +3117,7 @@ class BookingCheck(models.Model):
# else take next_slot
return next_slot
def refresh_computed_times(self):
def _refresh_computed_times(self):
old_computed_start_time = self.computed_start_time
old_computed_end_time = self.computed_end_time
self.computed_start_time = self.get_computed_start_time()

View File

@ -657,13 +657,15 @@ class PartialBookingCheckForm(forms.ModelForm):
)
def save(self):
booking = self.instance.booking
if self.cleaned_data['presence'] is None:
self.instance.delete()
booking.refresh_computed_times(commit=True)
return self.instance
self.instance.refresh_computed_times()
return super().save()
super().save()
booking.refresh_computed_times(commit=True)
return self.instance
class EventsTimesheetForm(forms.Form):

View File

@ -1398,8 +1398,8 @@ def test_events_check_status_events(app, user, partial_bookings):
booking1.mark_user_presence(
check_type_slug='foo-reason', start_time=datetime.time(7, 55), end_time=datetime.time(17, 15)
)
booking1.user_check.refresh_computed_times()
booking1.user_check.save()
booking1.refresh_computed_times(commit=True)
booking1.user_check.refresh_from_db()
assert booking1.user_check.computed_start_time == datetime.time(8, 0)
assert booking1.user_check.computed_end_time == datetime.time(17, 30)
booking2 = Booking.objects.create(event=event, user_external_id='child:42')

View File

@ -11,6 +11,7 @@ from django.core.management import call_command
from django.db import IntegrityError, connection, transaction
from django.db.models import Q
from django.test import override_settings
from django.test.utils import CaptureQueriesContext
from chrono.agendas.models import (
Agenda,
@ -4061,7 +4062,9 @@ def test_agenda_refresh_booking_computed_times():
booking.user_check.save()
def test_booking(success):
agenda.refresh_booking_computed_times()
with CaptureQueriesContext(connection) as ctx:
agenda.refresh_booking_computed_times()
assert len(ctx.captured_queries) in [1, 3]
booking.refresh_from_db()
if success is True:
assert booking.user_check.computed_start_time == datetime.time(7, 0)
@ -4158,7 +4161,9 @@ def test_event_refresh_booking_computed_times():
booking.user_check.save()
def test_booking(success):
event.refresh_booking_computed_times()
with CaptureQueriesContext(connection) as ctx:
event.refresh_booking_computed_times()
assert len(ctx.captured_queries) in [1, 3]
booking.refresh_from_db()
if success is True:
assert booking.user_check.computed_start_time == datetime.time(7, 0)