0001-api-store-the-reason-of-an-absence-49179.patch
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 |
- |