api: check time periods have enough time for a single meeting (#21463)

This commit is contained in:
Frédéric Péters 2018-01-29 16:28:32 +01:00
parent d2d589e55e
commit 51bd5c752d
2 changed files with 37 additions and 0 deletions

View File

@ -55,8 +55,14 @@ def get_all_slots(agenda, meeting_type):
'meeting_type': meeting_type
}
base_date = now().date()
open_slots_by_desk = defaultdict(lambda: Intervals())
for time_period in TimePeriod.objects.filter(desk__agenda=agenda):
duration = (datetime.datetime.combine(base_date, time_period.end_time) -
datetime.datetime.combine(base_date, time_period.start_time)).seconds / 60
if duration < meeting_type.duration:
# skip time period that can't even hold a single meeting
continue
for slot in time_period.get_time_slots(**time_period_filters):
slot.full = False
open_slots_by_desk[time_period.desk_id].add(slot.start_datetime, slot.end_datetime, slot)

View File

@ -265,6 +265,37 @@ def test_datetimes_api_meetings_agenda(app, meetings_agenda):
resp = app.get('/api/agenda/meetings/%s/datetimes/' % meeting_type.id)
assert len(resp.json['data']) == 3
def test_datetimes_api_meetings_agenda_short_time_periods(app, meetings_agenda, user):
meetings_agenda.minimal_booking_delay = 0
meetings_agenda.maximal_booking_delay = 10
meetings_agenda.save()
default_desk, _ = Desk.objects.get_or_create(agenda=meetings_agenda, slug='desk-1')
meeting_type = MeetingType.objects.get(agenda=meetings_agenda)
api_url = '/api/agenda/%s/meetings/%s/datetimes/' % (
meeting_type.agenda.slug, meeting_type.slug)
# test with short time periods
TimePeriod.objects.filter(desk=default_desk).delete()
test_1st_weekday = (localtime(now()).weekday() + 2) % 7
time_period = TimePeriod(weekday=test_1st_weekday,
start_time=datetime.time(10, 0), end_time=datetime.time(10, 30), desk=default_desk)
time_period.save()
resp = app.get('/api/agenda/meetings/%s/datetimes/' % meeting_type.id)
assert len(resp.json['data']) == 2
fillslot_url = resp.json['data'][0]['api']['fillslot_url']
time_period.end_time = datetime.time(10, 15)
time_period.save()
resp = app.get('/api/agenda/meetings/%s/datetimes/' % meeting_type.id)
assert len(resp.json['data']) == 0
# check booking is not possible
app.authorization = ('Basic', ('john.doe', 'password'))
resp = app.post(fillslot_url)
assert resp.json['err'] == 1
assert resp.json['reason'] == 'no more desk available'
def test_booking_api(app, some_data, user):
agenda = Agenda.objects.filter(label=u'Foo bar')[0]
event = [x for x in Event.objects.filter(agenda=agenda) if x.in_bookable_period()][0]