agendas: honor real agendas booking delay when booking through a virtual agenda (#63358)
This commit is contained in:
parent
78140afb4a
commit
89289ad665
|
@ -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)
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue