From 47c5d679c418ca74449a2551372383086c49e6df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20P=C3=A9ters?= Date: Sun, 26 Nov 2017 10:56:11 +0100 Subject: [PATCH 1/5] general: add label/user_name/backoffice_url metadata on bookings (#20280) --- .../agendas/migrations/0021_auto_20171126_1330.py | 29 ++++++++++++++++++++++ chrono/agendas/models.py | 4 +++ chrono/api/views.py | 3 +++ tests/test_api.py | 12 +++++++++ 4 files changed, 48 insertions(+) create mode 100644 chrono/agendas/migrations/0021_auto_20171126_1330.py diff --git a/chrono/agendas/migrations/0021_auto_20171126_1330.py b/chrono/agendas/migrations/0021_auto_20171126_1330.py new file mode 100644 index 0000000..47b5576 --- /dev/null +++ b/chrono/agendas/migrations/0021_auto_20171126_1330.py @@ -0,0 +1,29 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('agendas', '0020_auto_20171102_1021'), + ] + + operations = [ + migrations.AddField( + model_name='booking', + name='backoffice_url', + field=models.URLField(blank=True), + ), + migrations.AddField( + model_name='booking', + name='label', + field=models.CharField(max_length=250, blank=True), + ), + migrations.AddField( + model_name='booking', + name='user_name', + field=models.CharField(max_length=250, blank=True), + ), + ] diff --git a/chrono/agendas/models.py b/chrono/agendas/models.py index 047ab33..5899edb 100644 --- a/chrono/agendas/models.py +++ b/chrono/agendas/models.py @@ -345,6 +345,10 @@ class Booking(models.Model): primary_booking = models.ForeignKey('self', null=True, on_delete=models.CASCADE, related_name='secondary_booking_set') + label = models.CharField(max_length=250, blank=True) + user_name = models.CharField(max_length=250, blank=True) + backoffice_url = models.URLField(blank=True) + def save(self, *args, **kwargs): with transaction.atomic(): super(Booking, self).save(*args, **kwargs) diff --git a/chrono/api/views.py b/chrono/api/views.py index f4144a2..3bc2daa 100644 --- a/chrono/api/views.py +++ b/chrono/api/views.py @@ -350,6 +350,9 @@ class Fillslot(GenericAPIView): event = Event.objects.filter(id=event_pk)[0] new_booking = Booking(event_id=event_pk, extra_data=request.data) + for attr in ('label', 'user_name', 'backoffice_url'): + if isinstance(request.data.get(attr), basestring): + setattr(new_booking, attr, request.data.get(attr)) if event.waiting_list_places: if (event.booked_places + places_count) > event.places or event.waiting_list: diff --git a/tests/test_api.py b/tests/test_api.py index 199c6d9..4fff246 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -290,6 +290,18 @@ def test_booking_api(app, some_data, user): assert Booking.objects.count() == 2 assert Booking.objects.filter(event__agenda=agenda).count() == 2 + # test with additional data + resp = app.post_json('/api/agenda/%s/fillslot/%s/' % (agenda.id, event.id), + params={'label': 'foo', 'user_name': 'bar', 'backoffice_url': 'http://baz/'}) + assert Booking.objects.get(id=resp.json['booking_id']).label == 'foo' + assert Booking.objects.get(id=resp.json['booking_id']).user_name == 'bar' + assert Booking.objects.get(id=resp.json['booking_id']).backoffice_url == 'http://baz/' + + # test invalid data are silently ignored + resp = app.post_json('/api/agenda/%s/fillslot/%s/' % (agenda.id, event.id), + params={'user_name': {'foo': 'bar'}}) + assert Booking.objects.get(id=resp.json['booking_id']).user_name == '' + resp = app.post('/api/agenda/foobar/fillslot/%s/' % event.id, status=404) resp = app.post('/api/agenda/233/fillslot/%s/' % event.id, status=404) -- 2.15.0