Projet

Général

Profil

0002-api-move-event-selection-code-to-function-55367.patch

Valentin Deniaud, 02 août 2021 16:07

Télécharger (5,46 ko)

Voir les différences:

Subject: [PATCH 2/3] api: move event selection code to function (#55367)

 chrono/api/views.py | 82 +++++++++++++++++++++++++--------------------
 1 file changed, 45 insertions(+), 37 deletions(-)
chrono/api/views.py
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
-