Projet

Général

Profil

0002-api-check-absence-reason-exists-53147.patch

Lauréline Guérin, 15 avril 2021 15:33

Télécharger (4,4 ko)

Voir les différences:

Subject: [PATCH 2/3] api: check absence reason exists (#53147)

 chrono/api/views.py | 25 +++++++++++++++++++++++--
 tests/test_api.py   | 34 ++++++++++++++++++++++++++++------
 2 files changed, 51 insertions(+), 8 deletions(-)
chrono/api/views.py
38 38
from rest_framework.views import APIView
39 39

  
40 40
from chrono.api.utils import Response, APIError
41
from ..agendas.models import Agenda, Event, Booking, MeetingType, TimePeriodException, Desk, BookingColor
41
from ..agendas.models import (
42
    AbsenceReason,
43
    Agenda,
44
    Event,
45
    Booking,
46
    MeetingType,
47
    TimePeriodException,
48
    Desk,
49
    BookingColor,
50
)
42 51
from ..interval import IntervalSet
43 52

  
44 53

  
......
1304 1313
        read_only_fields = ['id', 'in_waiting_list']
1305 1314

  
1306 1315
    def validate_user_absence_reason(self, value):
1307
        if value is None:
1316
        if not value:
1308 1317
            return ''
1318

  
1319
        if not self.instance.event.agenda.absence_reasons_group:
1320
            raise serializers.ValidationError(_('unknown absence reason'))
1321

  
1322
        reasons_qs = self.instance.event.agenda.absence_reasons_group.absence_reasons
1323
        try:
1324
            reason = reasons_qs.get(slug=value)
1325
            value = reason.label
1326
        except AbsenceReason.DoesNotExist:
1327
            if not reasons_qs.filter(label=value).exists():
1328
                raise serializers.ValidationError(_('unknown absence reason'))
1329

  
1309 1330
        return value
1310 1331

  
1311 1332

  
tests/test_api.py
12 12
from django.utils.timezone import now, make_aware, localtime
13 13

  
14 14
from chrono.agendas.models import (
15
    AbsenceReason,
16
    AbsenceReasonGroup,
15 17
    Agenda,
16 18
    Booking,
17 19
    Category,
......
2561 2563

  
2562 2564
    app.authorization = ('Basic', ('john.doe', 'password'))
2563 2565

  
2566
    # reasons not defined on agenda
2567
    resp = app.patch_json(
2568
        '/api/booking/%s/' % booking.pk, params={'user_absence_reason': 'foobar'}, status=400
2569
    )
2570
    assert resp.json['err'] == 4
2571
    assert resp.json['err_desc'] == 'invalid payload'
2572

  
2573
    group = AbsenceReasonGroup.objects.create(label='Foo')
2574
    reason = AbsenceReason.objects.create(group=group, label='Foo bar')
2575

  
2576
    resp = app.patch_json(
2577
        '/api/booking/%s/' % booking.pk, params={'user_absence_reason': 'foobar'}, status=400
2578
    )
2579
    assert resp.json['err'] == 4
2580
    assert resp.json['err_desc'] == 'invalid payload'
2581

  
2564 2582
    # set reason
2565
    app.patch_json('/api/booking/%s/' % booking.pk, params={'user_absence_reason': 'foobar'})
2583
    agenda.absence_reasons_group = group
2584
    agenda.save()
2585
    # it works with label
2586
    app.patch_json('/api/booking/%s/' % booking.pk, params={'user_absence_reason': 'Foo bar'})
2566 2587
    booking.refresh_from_db()
2567 2588
    assert booking.user_was_present is True  # not changed
2568
    assert booking.user_absence_reason == 'foobar'
2589
    assert booking.user_absence_reason == 'Foo bar'
2569 2590

  
2570 2591
    # reset
2571 2592
    app.patch_json('/api/booking/%s/' % booking.pk, params={'user_absence_reason': ''})
......
2583 2604
    # and other booking
2584 2605
    other_booking = Booking.objects.create(event=event)
2585 2606

  
2586
    app.patch_json('/api/booking/%s/' % booking.pk, params={'user_absence_reason': 'foobar'})
2607
    # it works also with slug
2608
    app.patch_json('/api/booking/%s/' % booking.pk, params={'user_absence_reason': reason.slug})
2587 2609
    booking.refresh_from_db()
2588 2610
    assert booking.user_was_present is True  # not changed
2589
    assert booking.user_absence_reason == 'foobar'
2611
    assert booking.user_absence_reason == 'Foo bar'
2590 2612
    # all secondary bookings are upadted
2591 2613
    assert list(booking.secondary_booking_set.values_list('user_absence_reason', flat=True)) == [
2592
        'foobar',
2593
        'foobar',
2614
        'Foo bar',
2615
        'Foo bar',
2594 2616
    ]
2595 2617
    assert list(booking.secondary_booking_set.values_list('user_was_present', flat=True)) == [
2596 2618
        False,
2597
-