agendas: honor real agendas booking delay when booking through a virtual agenda (#63358)

This commit is contained in:
Emmanuel Cazenave 2022-03-30 15:34:28 +02:00
parent 78140afb4a
commit 89289ad665
2 changed files with 74 additions and 2 deletions

View File

@ -142,8 +142,12 @@ def get_all_slots(
agenda_ids_by_min_max_datetimes = collections.defaultdict(set)
agenda_id_min_max_datetime = {}
for agenda in agendas:
used_min_datetime = base_min_datetime or get_min_datetime(agenda, start_datetime)
used_max_datetime = base_max_datetime or get_max_datetime(agenda, end_datetime)
used_min_datetime = base_min_datetime
if base_agenda.minimal_booking_delay is None:
used_min_datetime = get_min_datetime(agenda, start_datetime)
used_max_datetime = base_max_datetime
if base_agenda.maximal_booking_delay is None:
used_max_datetime = get_max_datetime(agenda, end_datetime)
agenda_ids_by_min_max_datetimes[(used_min_datetime, used_max_datetime)].add(agenda.id)
agenda_id_min_max_datetime[agenda.id] = (used_min_datetime, used_max_datetime)

View File

@ -18,6 +18,7 @@ from chrono.agendas.models import (
Person,
Resource,
SharedCustodyAgenda,
TimePeriod,
TimePeriodException,
VirtualMember,
)
@ -857,3 +858,70 @@ def test_shared_custody_agenda_add_child(app, user, settings):
resp = app.post_json('/api/shared-custody/%s/add-child/' % other_agenda.pk, params=params)
assert resp.json['err'] == 1
assert resp.json['err_desc'] == 'This child already has one custody agenda.'
@pytest.mark.freeze_time('2022-03-30 08:00') # wednesday
def test_virtual_honor_real_agenda_booking_delay(app, user):
foo_agenda = Agenda.objects.create(
label='Foo', kind='meetings', minimal_booking_delay=0, maximal_booking_delay=1
)
foo_meeting_type = MeetingType.objects.create(agenda=foo_agenda, label='Plop', duration=60)
foo_desk = Desk.objects.create(agenda=foo_agenda, label='desk')
bar_agenda = Agenda.objects.create(
label='Foo', kind='meetings', minimal_booking_delay=1, maximal_booking_delay=2
)
MeetingType.objects.create(agenda=bar_agenda, label='Plop', duration=60)
bar_desk = Desk.objects.create(agenda=bar_agenda, label='desk')
for desk in (foo_desk, bar_desk):
TimePeriod.objects.create(
weekday=2, # wednesday
start_time=datetime.time(11, 0),
end_time=datetime.time(12, 0),
desk=desk,
)
TimePeriod.objects.create(
weekday=3, # thursday
start_time=datetime.time(11, 0),
end_time=datetime.time(12, 0),
desk=desk,
)
virtual_agenda = Agenda.objects.create(
label='Agenda Virtual', kind='virtual', minimal_booking_delay=None, maximal_booking_delay=None
)
virtual_agenda.real_agendas.add(foo_agenda, bar_agenda)
api_url = '/api/agenda/%s/meetings/%s/datetimes/' % (virtual_agenda.slug, foo_meeting_type.slug)
datetimes_resp = app.get(api_url)
assert len(datetimes_resp.json['data']) == 2
assert datetimes_resp.json['data'][0]['datetime'] == '2022-03-30 11:00:00' # comes from foo_agenda
assert datetimes_resp.json['data'][1]['datetime'] == '2022-03-31 11:00:00' # comes from bar_agenda
assert Booking.objects.count() == 0
app.authorization = ('Basic', ('john.doe', 'password'))
# minimal_booking_delay of bar_agenda must be honored
fillslot_url = datetimes_resp.json['data'][0]['api']['fillslot_url']
# book, this must end up in foo_agenda
resp = app.post(fillslot_url)
assert resp.json['err'] == 0
assert Booking.objects.count() == 1
booking = Booking.objects.first()
assert booking.event.agenda == foo_agenda
# try to book again, this must fail
resp = app.post(fillslot_url)
assert resp.json['err'] == 1
booking.delete()
assert Booking.objects.count() == 0
# maximal_booking_delay of foo_agenda must be honored
fillslot_url = datetimes_resp.json['data'][1]['api']['fillslot_url']
# book, this must end up in bar_agenda
resp = app.post(fillslot_url)
assert resp.json['err'] == 0
assert Booking.objects.count() == 1
booking = Booking.objects.first()
assert booking.event.agenda == bar_agenda
# try to book again, this must fail
resp = app.post(fillslot_url)
assert resp.json['err'] == 1