agendas: refresh_computed_times on booking (#82848)
This commit is contained in:
parent
031961ad80
commit
9d1c33970c
|
@ -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()
|
||||
|
|
|
@ -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):
|
||||
|
|
|
@ -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')
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue