api: correctly remove all timeslots overlapped by exceptions (#20386)

This commit is contained in:
Frédéric Péters 2017-12-01 13:21:50 +01:00
parent add27d0933
commit 1111695dd5
2 changed files with 31 additions and 1 deletions

View File

@ -66,7 +66,7 @@ def get_all_slots(agenda, meeting_type):
for desk, excluded_interval in excluded_slot_by_desk.iteritems():
for interval in excluded_interval:
begin, end = interval
open_slots_by_desk[desk].remove_envelop(localtime(begin), localtime(end))
open_slots_by_desk[desk].remove_overlap(localtime(begin), localtime(end))
# keep a copy of all time slot before removing busy time slots
all_time_slots = reduce(operator.__or__, deepcopy(open_slots_by_desk).values())

View File

@ -1092,3 +1092,33 @@ def test_agenda_meeting_gcd_durations(app, meetings_agenda, user):
assert [x for x in resp.json['data'] if not x.get('disabled')][0]['datetime'].startswith('2017-05-22 12:00:00')
resp = app.get('/api/agenda/meetings/%s/datetimes/' % meeting_type_30.id)
assert [x for x in resp.json['data'] if not x.get('disabled')][0]['datetime'].startswith('2017-05-22 12:00:00')
def test_agenda_meeting_gcd_durations_and_exceptions(app, meetings_agenda, user):
meetings_agenda.maximal_booking_delay = 2
meetings_agenda.save()
MeetingType.objects.all().delete()
meeting_type_20 = MeetingType(agenda=meetings_agenda, label='Blah 20', duration=20)
meeting_type_20.save()
meeting_type_40 = MeetingType(agenda=meetings_agenda, label='Blah 40', duration=40)
meeting_type_40.save()
desk = meetings_agenda.desk_set.all()[0]
resp = app.get('/api/agenda/meetings/%s/datetimes/' % meeting_type_20.id)
assert len(resp.json['data']) == 6
resp = app.get('/api/agenda/meetings/%s/datetimes/' % meeting_type_40.id)
assert len(resp.json['data']) == 5
# exception to just leave enough place for a single 20-minutes meeting.
TimePeriodException.objects.create(
desk=desk, start_datetime=datetime.datetime(2017, 5, 22, 10, 20),
end_datetime=datetime.datetime(2017, 5, 22, 12, 00))
resp = app.get('/api/agenda/meetings/%s/datetimes/' % meeting_type_20.id)
assert len(resp.json['data']) == 1
resp = app.get('/api/agenda/meetings/%s/datetimes/' % meeting_type_40.id)
assert len(resp.json['data']) == 0