api: check time periods have enough time for a single meeting (#21463)
This commit is contained in:
parent
d2d589e55e
commit
51bd5c752d
|
@ -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)
|
||||
|
|
|
@ -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]
|
||||
|
|
Loading…
Reference in New Issue