Projet

Général

Profil

0002-api-return-end_datetime-on-booking-events-37352.patch

Nicolas Roche, 02 juin 2020 17:37

Télécharger (7,37 ko)

Voir les différences:

Subject: [PATCH 2/2] api: return end_datetime on booking events (#37352)

 chrono/agendas/models.py |  6 +--
 chrono/api/views.py      |  5 +++
 tests/test_api.py        | 95 ++++++++++++++++++++++++++++++++++++++++
 3 files changed, 102 insertions(+), 4 deletions(-)
chrono/agendas/models.py
850 850
            self.event.agenda.pk,
851 851
            self.pk,
852 852
        )
853 853

  
854 854
        vevent.add('summary').value = self.user_display_label or self.label
855 855
        vevent.add('dtstart').value = self.event.start_datetime
856 856
        if self.user_name:
857 857
            vevent.add('attendee').value = self.user_name
858
        if self.event.meeting_type:
859
            vevent.add('dtend').value = self.event.start_datetime + datetime.timedelta(
860
                minutes=self.event.meeting_type.duration
861
            )
858
        if self.event.end_datetime:
859
            vevent.add('dtend').value = self.event.end_datetime
862 860

  
863 861
        for field in ('description', 'location', 'comment', 'url'):
864 862
            field_value = request and request.GET.get(field) or self.extra_data.get(field)
865 863
            if field_value:
866 864
                vevent.add(field).value = field_value
867 865
        ics.add(vevent)
868 866
        return ics.serialize()
869 867

  
chrono/api/views.py
988 988
            response['desk'] = {'label': available_desk.label, 'slug': available_desk.slug}
989 989
        if to_cancel_booking:
990 990
            response['cancelled_booking_id'] = cancelled_booking_id
991 991
        if agenda.kind == 'events' and not multiple_booking:
992 992
            event = events[0]
993 993
            # event.full is not up to date, it might have been changed by previous new_booking.save().
994 994
            event.refresh_from_db()
995 995
            response['places'] = get_event_places(event)
996
            if event.end_datetime:
997
                response['end_datetime'] = format_response_datetime(event.end_datetime)
998
            else:
999
                response['end_datetime'] = None
996 1000
        if agenda.kind == 'events' and multiple_booking:
997 1001
            response['events'] = [
998 1002
                {
999 1003
                    'slug': x.slug,
1000 1004
                    'text': str(x),
1001 1005
                    'datetime': format_response_datetime(x.start_datetime),
1006
                    'end_datetime': format_response_datetime(x.end_datetime) if x.end_datetime else None,
1002 1007
                    'description': x.description,
1003 1008
                }
1004 1009
                for x in events
1005 1010
            ]
1006 1011
        if agenda.kind == 'meetings':
1007 1012
            response['resources'] = [r.slug for r in resources]
1008 1013

  
1009 1014
        return Response(response)
tests/test_api.py
3619 3619
        )
3620 3620
        if next_agenda:
3621 3621
            assert booking.event.agenda == next_agenda
3622 3622

  
3623 3623
    foo_num_bookings = Booking.objects.filter(event__desk__agenda=foo_agenda).count()
3624 3624
    bar_num_bookings = Booking.objects.filter(event__desk__agenda=bar_agenda).count()
3625 3625
    assert foo_num_bookings == 2
3626 3626
    assert bar_num_bookings == 4
3627

  
3628

  
3629
@pytest.mark.freeze_time('2017-04-01')
3630
def test_duration_on_booking_api_fillslot_response(app, user):
3631
    agenda = Agenda(label=u'Foo bar')
3632
    agenda.save()
3633
    first_date = datetime.datetime(2017, 5, 20, 1, 12)
3634
    durations = [None, 0, 45]
3635
    evt = []
3636
    for i in range(3):
3637
        evt.append(Event(
3638
            start_datetime=first_date + datetime.timedelta(days=i),
3639
            duration=durations[i],
3640
            places=20,
3641
            agenda=agenda))
3642
        evt[i].save()
3643

  
3644
    assert evt[0].end_datetime is None
3645
    assert evt[1].end_datetime == evt[1].start_datetime
3646
    assert evt[2].end_datetime == evt[2].start_datetime + datetime.timedelta(minutes=45)
3647
    app.authorization = ('Basic', ('john.doe', 'password'))
3648

  
3649
    resp = app.post('/api/agenda/%s/fillslot/%s/' % (agenda.slug, evt[0].id))
3650
    assert resp.json['datetime'] == '2017-05-20 01:12:00'
3651
    assert resp.json['end_datetime'] is None
3652
    assert 'ics_url' in resp.json['api']
3653
    ics = app.get(resp.json['api']['ics_url']).text
3654
    assert 'DTSTART:20170519T231200Z' in ics
3655
    assert 'DTEND:' not in ics
3656

  
3657
    resp = app.post('/api/agenda/%s/fillslot/%s/' % (agenda.slug, evt[1].id))
3658
    assert resp.json['datetime'] == '2017-05-21 01:12:00'
3659
    assert resp.json['end_datetime'] == resp.json['datetime']
3660
    assert 'ics_url' in resp.json['api']
3661
    ics = app.get(resp.json['api']['ics_url']).text
3662
    assert 'DTSTART:20170520T231200Z' in ics
3663
    assert 'DTEND:20170520T231200Z' in ics
3664

  
3665
    resp = app.post('/api/agenda/%s/fillslot/%s/' % (agenda.slug, evt[2].id))
3666
    assert resp.json['datetime'] == '2017-05-22 01:12:00'
3667
    assert resp.json['end_datetime'] == '2017-05-22 01:57:00'
3668
    assert 'ics_url' in resp.json['api']
3669
    ics = app.get(resp.json['api']['ics_url']).text
3670
    assert 'DTSTART:20170521T231200Z' in ics
3671
    assert 'DTEND:20170521T235700Z' in ics
3672

  
3673

  
3674
@pytest.mark.freeze_time('2017-04-01')
3675
def test_duration_on_booking_api_fillslots_response(app, user):
3676
    agenda = Agenda(label=u'Foo bar')
3677
    agenda.save()
3678
    first_date = datetime.datetime(2017, 5, 20, 1, 12)
3679
    durations = [None, 0, 45]
3680
    evt = []
3681
    for i in range(3):
3682
        evt.append(Event(
3683
            start_datetime=first_date + datetime.timedelta(days=i),
3684
            duration=durations[i],
3685
            places=20,
3686
            agenda=agenda))
3687
        evt[i].save()
3688

  
3689
    assert evt[0].end_datetime is None
3690
    assert evt[1].end_datetime == evt[1].start_datetime
3691
    assert evt[2].end_datetime == evt[2].start_datetime + datetime.timedelta(minutes=45)
3692
    app.authorization = ('Basic', ('john.doe', 'password'))
3693

  
3694
    # first event having null duration
3695
    string_param = ','.join([str(e.id) for e in evt[::-1]])  # unordered parameters
3696
    resp = app.post_json('/api/agenda/%s/fillslots/' % agenda.slug, params={'slots': string_param})
3697
    r_evt = resp.json['events']
3698

  
3699
    assert r_evt[0]['datetime'] == '2017-05-20 01:12:00'
3700
    assert r_evt[0]['end_datetime'] is None
3701
    assert r_evt[1]['datetime'] == '2017-05-21 01:12:00'
3702
    assert r_evt[1]['end_datetime'] == r_evt[1]['datetime']
3703
    assert r_evt[2]['datetime'] == '2017-05-22 01:12:00'
3704
    assert r_evt[2]['end_datetime'] == '2017-05-22 01:57:00'
3705
    assert 'ics_url' in resp.json['api']
3706
    ics = app.get(resp.json['api']['ics_url']).text
3707
    assert 'DTSTART:20170519T231200Z' in ics
3708
    assert 'DTEND:' not in ics
3709

  
3710
    # first event having duration
3711
    evt[0].duration = 90
3712
    evt[0].save()
3713
    resp = app.post_json('/api/agenda/%s/fillslots/' % agenda.slug, params={'slots': string_param})
3714
    r_evt = resp.json['events']
3715

  
3716
    assert r_evt[0]['datetime'] == '2017-05-20 01:12:00'
3717
    assert r_evt[0]['end_datetime'] == '2017-05-20 02:42:00'
3718
    assert 'ics_url' in resp.json['api']
3719
    ics = app.get(resp.json['api']['ics_url']).text
3720
    assert 'DTSTART:20170519T231200Z' in ics
3721
    assert 'DTEND:20170520T004200Z' in ics
3627
-