551 |
551 |
)
|
552 |
552 |
|
553 |
553 |
|
|
554 |
def get_events_from_slots(slots, request, agenda, payload):
|
|
555 |
user_external_id = payload.get('user_external_id') or None
|
|
556 |
exclude_user = payload.get('exclude_user')
|
|
557 |
book_events = payload.get('events') or request.query_params.get('events') or 'future'
|
|
558 |
book_past = book_events in ['all', 'past']
|
|
559 |
book_future = book_events in ['all', 'future']
|
|
560 |
|
|
561 |
# convert event recurrence identifiers to real event slugs
|
|
562 |
for i, slot in enumerate(slots.copy()):
|
|
563 |
if ':' not in slot:
|
|
564 |
continue
|
|
565 |
event = get_event_recurrence(agenda, slot)
|
|
566 |
slots[i] = event.slug
|
|
567 |
|
|
568 |
try:
|
|
569 |
events = agenda.event_set.filter(id__in=[int(s) for s in slots]).order_by('start_datetime')
|
|
570 |
except ValueError:
|
|
571 |
events = agenda.event_set.filter(slug__in=slots).order_by('start_datetime')
|
|
572 |
|
|
573 |
for event in events:
|
|
574 |
if event.start_datetime >= now():
|
|
575 |
if not book_future or not event.in_bookable_period():
|
|
576 |
raise APIError(_('event not bookable'), err_class='event not bookable')
|
|
577 |
else:
|
|
578 |
if not book_past:
|
|
579 |
raise APIError(_('event not bookable'), err_class='event not bookable')
|
|
580 |
if event.cancelled:
|
|
581 |
raise APIError(_('event is cancelled'), err_class='event is cancelled')
|
|
582 |
if exclude_user and user_external_id:
|
|
583 |
if event.booking_set.filter(user_external_id=user_external_id).exists():
|
|
584 |
raise APIError(
|
|
585 |
_('event is already booked by user'), err_class='event is already booked by user'
|
|
586 |
)
|
|
587 |
|
|
588 |
if not events.exists():
|
|
589 |
raise APIError(
|
|
590 |
_('unknown event identifiers or slugs'),
|
|
591 |
err_class='unknown event identifiers or slugs',
|
|
592 |
http_status=status.HTTP_400_BAD_REQUEST,
|
|
593 |
)
|
|
594 |
return events
|
|
595 |
|
|
596 |
|
554 |
597 |
def get_resources_from_request(request, agenda):
|
555 |
598 |
if agenda.kind != 'meetings' or 'resources' not in request.GET:
|
556 |
599 |
return []
|
... | ... | |
1233 |
1276 |
color = None
|
1234 |
1277 |
user_external_id = payload.get('user_external_id') or None
|
1235 |
1278 |
exclude_user = payload.get('exclude_user')
|
1236 |
|
book_events = payload.get('events') or request.query_params.get('events') or 'future'
|
1237 |
|
book_past = book_events in ['all', 'past']
|
1238 |
|
book_future = book_events in ['all', 'future']
|
1239 |
1279 |
|
1240 |
1280 |
if agenda.accept_meetings():
|
1241 |
1281 |
# slots are actually timeslot ids (meeting_type:start_datetime), not events ids.
|
... | ... | |
1378 |
1418 |
event.resources.add(*resources)
|
1379 |
1419 |
events.append(event)
|
1380 |
1420 |
else:
|
1381 |
|
# convert event recurrence identifiers to real event slugs
|
1382 |
|
for i, slot in enumerate(slots.copy()):
|
1383 |
|
if ':' not in slot:
|
1384 |
|
continue
|
1385 |
|
event = get_event_recurrence(agenda, slot)
|
1386 |
|
slots[i] = event.slug
|
1387 |
|
|
1388 |
|
try:
|
1389 |
|
events = agenda.event_set.filter(id__in=[int(s) for s in slots]).order_by('start_datetime')
|
1390 |
|
except ValueError:
|
1391 |
|
events = agenda.event_set.filter(slug__in=slots).order_by('start_datetime')
|
1392 |
|
|
1393 |
|
for event in events:
|
1394 |
|
if event.start_datetime >= now():
|
1395 |
|
if not book_future or not event.in_bookable_period():
|
1396 |
|
raise APIError(_('event not bookable'), err_class='event not bookable')
|
1397 |
|
else:
|
1398 |
|
if not book_past:
|
1399 |
|
raise APIError(_('event not bookable'), err_class='event not bookable')
|
1400 |
|
if event.cancelled:
|
1401 |
|
raise APIError(_('event is cancelled'), err_class='event is cancelled')
|
1402 |
|
if exclude_user and user_external_id:
|
1403 |
|
if event.booking_set.filter(user_external_id=user_external_id).exists():
|
1404 |
|
raise APIError(
|
1405 |
|
_('event is already booked by user'), err_class='event is already booked by user'
|
1406 |
|
)
|
1407 |
|
|
1408 |
|
if not events.count():
|
1409 |
|
raise APIError(
|
1410 |
|
_('unknown event identifiers or slugs'),
|
1411 |
|
err_class='unknown event identifiers or slugs',
|
1412 |
|
http_status=status.HTTP_400_BAD_REQUEST,
|
1413 |
|
)
|
|
1421 |
events = get_events_from_slots(slots, request, agenda, payload)
|
1414 |
1422 |
|
1415 |
1423 |
# search free places. Switch to waiting list if necessary.
|
1416 |
1424 |
in_waiting_list = False
|
... | ... | |
1451 |
1459 |
# now we have a list of events, book them.
|
1452 |
1460 |
primary_booking = None
|
1453 |
1461 |
for event in events:
|
1454 |
|
for i in range(places_count):
|
|
1462 |
for dummy in range(places_count):
|
1455 |
1463 |
new_booking = make_booking(
|
1456 |
1464 |
event, payload, extra_data, primary_booking, in_waiting_list, color
|
1457 |
1465 |
)
|
1458 |
|
-
|