Projet

Général

Profil

0001-api-store-the-reason-of-an-absence-49179.patch

Lauréline Guérin, 04 janvier 2021 14:08

Télécharger (6,61 ko)

Voir les différences:

Subject: [PATCH] api: store the reason of an absence (#49179)

 .../migrations/0072_booking_absence_reason.py | 19 +++++++
 chrono/agendas/models.py                      |  1 +
 chrono/api/views.py                           | 15 +++++-
 tests/test_api.py                             | 49 ++++++++++++++++++-
 4 files changed, 81 insertions(+), 3 deletions(-)
 create mode 100644 chrono/agendas/migrations/0072_booking_absence_reason.py
chrono/agendas/migrations/0072_booking_absence_reason.py
1
# -*- coding: utf-8 -*-
2
from __future__ import unicode_literals
3

  
4
from django.db import migrations, models
5

  
6

  
7
class Migration(migrations.Migration):
8

  
9
    dependencies = [
10
        ('agendas', '0071_booking_attendance'),
11
    ]
12

  
13
    operations = [
14
        migrations.AddField(
15
            model_name='booking',
16
            name='user_absence_reason',
17
            field=models.CharField(blank=True, max_length=250),
18
        ),
19
    ]
chrono/agendas/models.py
1099 1099
    user_email = models.EmailField(blank=True)
1100 1100
    user_phone_number = models.CharField(max_length=16, blank=True)
1101 1101
    user_was_present = models.NullBooleanField()
1102
    user_absence_reason = models.CharField(max_length=250, blank=True)
1102 1103

  
1103 1104
    form_url = models.URLField(blank=True)
1104 1105
    backoffice_url = models.URLField(blank=True)
chrono/api/views.py
1163 1163

  
1164 1164

  
1165 1165
class BookingSerializer(serializers.ModelSerializer):
1166
    user_absence_reason = serializers.CharField(required=False, allow_blank=True, allow_null=True)
1167

  
1166 1168
    class Meta:
1167 1169
        model = Booking
1168
        fields = ['user_was_present']
1170
        fields = ['user_was_present', 'user_absence_reason']
1171

  
1172
    def validate_user_absence_reason(self, value):
1173
        if value is None:
1174
            return ''
1175
        return value
1169 1176

  
1170 1177

  
1171 1178
class BookingAPI(APIView):
......
1203 1210
            'booking_id': self.booking.pk,
1204 1211
            'in_waiting_list': self.booking.in_waiting_list,
1205 1212
            'user_was_present': self.booking.user_was_present,
1213
            'user_absence_reason': self.booking.user_absence_reason,
1206 1214
        }
1207 1215
        return Response(response)
1208 1216

  
......
1225 1233
            )
1226 1234

  
1227 1235
        serializer.save()
1228
        self.booking.secondary_booking_set.update(user_was_present=self.booking.user_was_present)
1236
        if 'user_was_present' in request.data:
1237
            self.booking.secondary_booking_set.update(user_was_present=self.booking.user_was_present)
1238
        if 'user_absence_reason' in request.data:
1239
            self.booking.secondary_booking_set.update(user_absence_reason=self.booking.user_absence_reason)
1229 1240

  
1230 1241
        response = {'err': 0, 'booking_id': self.booking.pk}
1231 1242
        return Response(response)
tests/test_api.py
1908 1908
def test_booking_api_present(app, user, flag):
1909 1909
    agenda = Agenda.objects.create(kind='events')
1910 1910
    event = Event.objects.create(agenda=agenda, start_datetime=now(), places=10)
1911
    booking = Booking.objects.create(event=event, user_was_present=flag)
1911
    booking = Booking.objects.create(event=event, user_was_present=flag, user_absence_reason='foobar')
1912 1912

  
1913 1913
    app.authorization = ('Basic', ('john.doe', 'password'))
1914 1914
    resp = app.get('/api/booking/%s/' % booking.pk)
1915 1915
    assert resp.json['booking_id'] == booking.pk
1916 1916
    assert resp.json['user_was_present'] == flag
1917
    assert resp.json['user_absence_reason'] == 'foobar'
1917 1918

  
1918 1919

  
1919 1920
@pytest.mark.parametrize('flag', [True, False])
......
2015 2016
    assert other_booking.user_was_present is None  # not changed
2016 2017

  
2017 2018

  
2019
def test_booking_patch_api_absence_reason(app, user):
2020
    agenda = Agenda.objects.create(kind='events')
2021
    event = Event.objects.create(agenda=agenda, start_datetime=now(), places=10)
2022
    booking = Booking.objects.create(event=event, user_was_present=True)
2023

  
2024
    app.authorization = ('Basic', ('john.doe', 'password'))
2025

  
2026
    # set reason
2027
    app.patch_json('/api/booking/%s/' % booking.pk, params={'user_absence_reason': 'foobar'})
2028
    booking.refresh_from_db()
2029
    assert booking.user_was_present is True  # not changed
2030
    assert booking.user_absence_reason == 'foobar'
2031

  
2032
    # reset
2033
    app.patch_json('/api/booking/%s/' % booking.pk, params={'user_absence_reason': ''})
2034
    booking.refresh_from_db()
2035
    assert booking.user_was_present is True  # not changed
2036
    assert booking.user_absence_reason == ''
2037
    app.patch_json('/api/booking/%s/' % booking.pk, params={'user_absence_reason': None})
2038
    booking.refresh_from_db()
2039
    assert booking.user_was_present is True  # not changed
2040
    assert booking.user_absence_reason == ''
2041

  
2042
    # make secondary bookings
2043
    Booking.objects.create(event=event, primary_booking=booking, user_was_present=False)
2044
    Booking.objects.create(event=event, primary_booking=booking, user_was_present=False)
2045
    # and other booking
2046
    other_booking = Booking.objects.create(event=event)
2047

  
2048
    app.patch_json('/api/booking/%s/' % booking.pk, params={'user_absence_reason': 'foobar'})
2049
    booking.refresh_from_db()
2050
    assert booking.user_was_present is True  # not changed
2051
    assert booking.user_absence_reason == 'foobar'
2052
    # all secondary bookings are upadted
2053
    assert list(booking.secondary_booking_set.values_list('user_absence_reason', flat=True)) == [
2054
        'foobar',
2055
        'foobar',
2056
    ]
2057
    assert list(booking.secondary_booking_set.values_list('user_was_present', flat=True)) == [
2058
        False,
2059
        False,
2060
    ]  # not changed
2061
    other_booking.refresh_from_db()
2062
    assert other_booking.user_absence_reason == ''  # not changed
2063

  
2064

  
2018 2065
def test_booking_cancellation_api(app, some_data, user):
2019 2066
    agenda = Agenda.objects.filter(label=u'Foo bar')[0]
2020 2067
    event = [x for x in Event.objects.filter(agenda=agenda) if x.in_bookable_period()][0]
2021
-