agendas: add times in notify_checked for partial bookings (#82842)
gitea/chrono/pipeline/head This commit looks good Details

This commit is contained in:
Lauréline Guérin 2023-10-26 11:05:30 +02:00 committed by Lauréline Guérin
parent cff4ce0861
commit 5b8419efe5
2 changed files with 53 additions and 6 deletions

View File

@ -2182,6 +2182,7 @@ class Event(models.Model):
self.notify_checked()
def notify_checked(self):
partial_bookings = self.agenda.partial_bookings
for user_check in BookingCheck.objects.filter(booking__event=self).select_related('booking'):
if user_check.presence is True and user_check.booking.presence_callback_url:
url = user_check.booking.presence_callback_url
@ -2194,6 +2195,19 @@ class Event(models.Model):
'user_check_type_slug': user_check.type_slug,
'user_check_type_label': user_check.type_label,
}
if partial_bookings:
payload.update(
{
'start_time': user_check.start_time.isoformat() if user_check.start_time else None,
'end_time': user_check.end_time.isoformat() if user_check.end_time else None,
'computed_start_time': user_check.computed_start_time.isoformat()
if user_check.computed_start_time
else None,
'computed_end_time': user_check.computed_end_time.isoformat()
if user_check.computed_end_time
else None,
}
)
try:
response = requests_wrapper.post(url, json=payload, remote_service='auto', timeout=15)
if response and not response.ok:

View File

@ -1,9 +1,10 @@
import datetime
import json
from unittest import mock
import pytest
from chrono.agendas.models import Agenda, Booking, Event, Subscription
from chrono.agendas.models import Agenda, Booking, BookingCheck, Event, Subscription
from chrono.utils.lingo import CheckType
from chrono.utils.timezone import make_aware, now
from tests.utils import login
@ -716,8 +717,18 @@ def test_manager_partial_bookings_event_checked(app, admin_user):
event=event,
start_time=datetime.time(8, 00),
end_time=datetime.time(10, 00),
presence_callback_url='https://example.invalid/presence/%s' % i,
absence_callback_url='https://example.invalid/absence/%s' % i,
)
if i < 3:
if i == 0:
booking.mark_user_presence(start_time=datetime.time(8, 00), end_time=datetime.time(9, 00))
BookingCheck.objects.create(
booking=booking,
start_time=datetime.time(9, 00),
end_time=datetime.time(10, 00),
presence=False,
)
elif i < 3:
booking.mark_user_presence(start_time=datetime.time(8, 00), end_time=datetime.time(10, 00))
elif i < 7:
booking.mark_user_absence(start_time=datetime.time(8, 00), end_time=datetime.time(10, 00))
@ -732,10 +743,13 @@ def test_manager_partial_bookings_event_checked(app, admin_user):
assert 'invoiced' not in resp
token = resp.context['csrf_token']
resp = app.post(
'/manage/agendas/%s/events/%s/checked' % (agenda.pk, event.pk),
params={'csrfmiddlewaretoken': token},
)
with mock.patch('chrono.utils.requests_wrapper.RequestsSession.send') as mock_send:
mock_response = mock.Mock(status_code=200)
mock_send.return_value = mock_response
resp = app.post(
'/manage/agendas/%s/events/%s/checked' % (agenda.pk, event.pk),
params={'csrfmiddlewaretoken': token},
)
event.refresh_from_db()
assert event.checked is True
resp = resp.follow()
@ -748,6 +762,25 @@ def test_manager_partial_bookings_event_checked(app, admin_user):
assert '<span class="checked tag">Checked</span>' in resp
assert 'check-locked' not in resp
assert 'invoiced' not in resp
assert {x[0][0].url for x in mock_send.call_args_list} == {
'https://example.invalid/presence/0',
'https://example.invalid/presence/1',
'https://example.invalid/presence/2',
'https://example.invalid/absence/0',
'https://example.invalid/absence/3',
'https://example.invalid/absence/4',
'https://example.invalid/absence/5',
'https://example.invalid/absence/6',
}
assert set(json.loads(mock_send.call_args_list[0][0][0].body).keys()) == {
'user_check_type_label',
'user_check_type_slug',
'user_was_present',
'start_time',
'end_time',
'computed_start_time',
'computed_end_time',
}
# event not in past
agenda.disable_check_update = False