Projet

Général

Profil

0002-api-bypass_delays-parameter-for-datetimes-endpoints-.patch

Lauréline Guérin, 29 octobre 2021 10:42

Télécharger (6,1 ko)

Voir les différences:

Subject: [PATCH 2/3] api: bypass_delays parameter for datetimes endpoints
 (#57961)

 chrono/agendas/models.py    |  5 +++--
 chrono/api/serializers.py   |  1 +
 chrono/api/views.py         |  2 ++
 tests/api/test_datetimes.py | 31 +++++++++++++++++++++++++++++++
 4 files changed, 37 insertions(+), 2 deletions(-)
chrono/agendas/models.py
650 650
        min_start=None,
651 651
        max_start=None,
652 652
        user_external_id=None,
653
        bypass_delays=False,
653 654
    ):
654 655
        assert self.kind == 'events'
655 656

  
......
671 672
            if not include_full:
672 673
                entries = entries.filter(Q(full=False) | Q(primary_event__isnull=False))
673 674

  
674
        if self.minimal_booking_delay:
675
        if not bypass_delays and self.minimal_booking_delay:
675 676
            min_start = max(self.min_booking_datetime, min_start) if min_start else self.min_booking_datetime
676 677

  
677 678
        if min_start:
......
680 681
            else:
681 682
                entries = entries.filter(start_datetime__gte=min_start)
682 683

  
683
        if self.maximal_booking_delay:
684
        if not bypass_delays and self.maximal_booking_delay:
684 685
            max_start = min(self.max_booking_datetime, max_start) if max_start else self.max_booking_datetime
685 686

  
686 687
        if max_start:
chrono/api/serializers.py
116 116
    exclude_user_external_id = serializers.CharField(required=False, max_length=250, allow_blank=True)
117 117
    events = serializers.CharField(required=False, max_length=32, allow_blank=True)
118 118
    hide_disabled = serializers.BooleanField(default=False)
119
    bypass_delays = serializers.BooleanField(default=False)
119 120

  
120 121
    def validate(self, attrs):
121 122
        super().validate(attrs)
chrono/api/views.py
815 815
                min_start=payload.get('date_start'),
816 816
                max_start=payload.get('date_end'),
817 817
                user_external_id=user_external_id,
818
                bypass_delays=payload.get('bypass_delays'),
818 819
            )
819 820

  
820 821
        if payload['hide_disabled']:
......
897 898
                    prefetched_queryset=True,
898 899
                    min_start=payload.get('date_start'),
899 900
                    max_start=payload.get('date_end'),
901
                    bypass_delays=payload.get('bypass_delays'),
900 902
                )
901 903
            )
902 904

  
tests/api/test_datetimes.py
35 35
    resp = app.get('/api/agenda/%s/datetimes/' % agenda.slug)
36 36
    assert len(resp.json['data']) == 0
37 37
    check_bookability(resp.json['data'])
38
    resp = app.get('/api/agenda/%s/datetimes/' % agenda.slug, params={'bypass_delays': True})
39
    assert len(resp.json['data']) == 3
38 40

  
39 41
    agenda.minimal_booking_delay = 2
40 42
    agenda.save()
41 43
    resp = app.get('/api/agenda/%s/datetimes/' % agenda.slug)
42 44
    assert len(resp.json['data']) == 2
43 45
    check_bookability(resp.json['data'])
46
    resp = app.get('/api/agenda/%s/datetimes/' % agenda.slug, params={'bypass_delays': True})
47
    assert len(resp.json['data']) == 3
44 48

  
45 49
    agenda.minimal_booking_delay = 0
46 50
    agenda.maximal_booking_delay = 3
......
49 53
    assert len(resp.json['data']) == 2
50 54
    check_bookability(resp.json['data'])
51 55
    assert resp.json['data'][0]['description'] is None
56
    resp = app.get('/api/agenda/%s/datetimes/' % agenda.slug, params={'bypass_delays': True})
57
    assert len(resp.json['data']) == 3
52 58

  
53 59
    agenda.event_set.update(publication_datetime=now() + datetime.timedelta(minutes=1))
54 60
    resp = app.get('/api/agenda/%s/datetimes/' % agenda.slug)
......
685 691
        app.get('/api/agenda/%s/datetimes/' % agenda.slug)
686 692
        assert len(ctx.captured_queries) == 5
687 693

  
694
    # check delays
695
    resp = app.get('/api/agenda/%s/datetimes/' % agenda.slug)
696
    assert len(resp.json['data']) == 4
697
    resp = app.get('/api/agenda/%s/datetimes/' % agenda.slug, params={'bypass_delays': True})
698
    assert len(resp.json['data']) == 53
699
    agenda.minimal_booking_delay = 10
700
    agenda.mmaximal_booking_delay = 20
701
    agenda.save()
702
    resp = app.get('/api/agenda/%s/datetimes/' % agenda.slug)
703
    assert len(resp.json['data']) == 3
704
    resp = app.get('/api/agenda/%s/datetimes/' % agenda.slug, params={'bypass_delays': True})
705
    assert len(resp.json['data']) == 53
706

  
688 707

  
689 708
def test_recurring_events_api_various_times(app, user, mock_now):
690 709
    agenda = Agenda.objects.create(
......
1474 1493
    )
1475 1494
    assert len(resp.json['data']) == 0
1476 1495

  
1496
    # check delays
1497
    Agenda.objects.update(minimal_booking_delay=6, maximal_booking_delay=14)
1498
    date_end = localtime() + datetime.timedelta(days=60)  # with a date end to have recurring events
1499
    resp = app.get('/api/agendas/datetimes/', params={'agendas': agenda_slugs, 'date_end': date_end})
1500
    assert len(resp.json['data']) == 2
1501
    resp = app.get(
1502
        '/api/agendas/datetimes/',
1503
        params={'agendas': agenda_slugs, 'date_end': date_end, 'bypass_delays': True},
1504
    )
1505
    assert len(resp.json['data']) == 5
1506
    Agenda.objects.update(minimal_booking_delay=0, maximal_booking_delay=45)
1507

  
1477 1508
    # invalid slugs
1478 1509
    resp = app.get('/api/agendas/datetimes/', params={'agendas': 'xxx'}, status=400)
1479 1510
    assert resp.json['err_desc'] == 'invalid slugs: xxx'
1480
-