api: check absence reason exists (#53147)

This commit is contained in:
Lauréline Guérin 2021-04-15 14:34:42 +02:00
parent 992189a335
commit 4fe0a35cd2
No known key found for this signature in database
GPG Key ID: 1FAB9B9B4F93D473
2 changed files with 51 additions and 8 deletions

View File

@ -38,7 +38,16 @@ from rest_framework.views import APIView
from chrono.api.utils import APIError, Response
from ..agendas.models import Agenda, Booking, BookingColor, Desk, Event, MeetingType, TimePeriodException
from ..agendas.models import (
AbsenceReason,
Agenda,
Booking,
BookingColor,
Desk,
Event,
MeetingType,
TimePeriodException,
)
from ..interval import IntervalSet
@ -1355,8 +1364,20 @@ class BookingSerializer(serializers.ModelSerializer):
read_only_fields = ['id', 'in_waiting_list']
def validate_user_absence_reason(self, value):
if value is None:
if not value:
return ''
if not self.instance.event.agenda.absence_reasons_group:
raise serializers.ValidationError(_('unknown absence reason'))
reasons_qs = self.instance.event.agenda.absence_reasons_group.absence_reasons
try:
reason = reasons_qs.get(slug=value)
value = reason.label
except AbsenceReason.DoesNotExist:
if not reasons_qs.filter(label=value).exists():
raise serializers.ValidationError(_('unknown absence reason'))
return value

View File

@ -12,6 +12,8 @@ from django.test.utils import CaptureQueriesContext
from django.utils.timezone import localtime, make_aware, now
from chrono.agendas.models import (
AbsenceReason,
AbsenceReasonGroup,
Agenda,
Booking,
BookingColor,
@ -2616,11 +2618,30 @@ def test_booking_patch_api_absence_reason(app, user):
app.authorization = ('Basic', ('john.doe', 'password'))
# reasons not defined on agenda
resp = app.patch_json(
'/api/booking/%s/' % booking.pk, params={'user_absence_reason': 'foobar'}, status=400
)
assert resp.json['err'] == 4
assert resp.json['err_desc'] == 'invalid payload'
group = AbsenceReasonGroup.objects.create(label='Foo')
reason = AbsenceReason.objects.create(group=group, label='Foo bar')
resp = app.patch_json(
'/api/booking/%s/' % booking.pk, params={'user_absence_reason': 'foobar'}, status=400
)
assert resp.json['err'] == 4
assert resp.json['err_desc'] == 'invalid payload'
# set reason
app.patch_json('/api/booking/%s/' % booking.pk, params={'user_absence_reason': 'foobar'})
agenda.absence_reasons_group = group
agenda.save()
# it works with label
app.patch_json('/api/booking/%s/' % booking.pk, params={'user_absence_reason': 'Foo bar'})
booking.refresh_from_db()
assert booking.user_was_present is True # not changed
assert booking.user_absence_reason == 'foobar'
assert booking.user_absence_reason == 'Foo bar'
# reset
app.patch_json('/api/booking/%s/' % booking.pk, params={'user_absence_reason': ''})
@ -2638,14 +2659,15 @@ def test_booking_patch_api_absence_reason(app, user):
# and other booking
other_booking = Booking.objects.create(event=event)
app.patch_json('/api/booking/%s/' % booking.pk, params={'user_absence_reason': 'foobar'})
# it works also with slug
app.patch_json('/api/booking/%s/' % booking.pk, params={'user_absence_reason': reason.slug})
booking.refresh_from_db()
assert booking.user_was_present is True # not changed
assert booking.user_absence_reason == 'foobar'
assert booking.user_absence_reason == 'Foo bar'
# all secondary bookings are upadted
assert list(booking.secondary_booking_set.values_list('user_absence_reason', flat=True)) == [
'foobar',
'foobar',
'Foo bar',
'Foo bar',
]
assert list(booking.secondary_booking_set.values_list('user_was_present', flat=True)) == [
False,