diff --git a/chrono/api/serializers.py b/chrono/api/serializers.py index 2974ea46..198d9eb0 100644 --- a/chrono/api/serializers.py +++ b/chrono/api/serializers.py @@ -3,7 +3,7 @@ from django.utils.translation import ugettext_lazy as _ from rest_framework import serializers from rest_framework.exceptions import ValidationError -from chrono.agendas.models import AbsenceReason, Agenda, Booking, Event +from chrono.agendas.models import AbsenceReason, Agenda, Booking, Category, Event class StringOrListField(serializers.ListField): @@ -163,6 +163,7 @@ class EventSerializer(serializers.ModelSerializer): class AgendaSerializer(serializers.ModelSerializer): edit_role = serializers.CharField(required=False, max_length=150) view_role = serializers.CharField(required=False, max_length=150) + category = serializers.SlugField(required=False, max_length=160) class Meta: model = Agenda @@ -176,6 +177,7 @@ class AgendaSerializer(serializers.ModelSerializer): 'anonymize_delay', 'edit_role', 'view_role', + 'category', ] def get_role(self, value): @@ -190,6 +192,12 @@ class AgendaSerializer(serializers.ModelSerializer): def validate_view_role(self, value): return self.get_role(value) + def validate_category(self, value): + try: + return Category.objects.get(slug=value) + except Category.DoesNotExist: + raise serializers.ValidationError(_('unknown category: %s' % value)) + def validate(self, attrs): super().validate(attrs) if attrs['minimal_booking_delay_in_working_days'] and attrs.get('kind', 'events') != 'events': diff --git a/tests/api/test_all.py b/tests/api/test_all.py index f25c2604..5ac8a075 100644 --- a/tests/api/test_all.py +++ b/tests/api/test_all.py @@ -603,6 +603,7 @@ def test_virtual_agendas_meetingtypes_api(app): @pytest.mark.freeze_time('2021-07-09') def test_add_agenda(app, user, settings): + category_a = Category.objects.create(label='Category A') api_url = '/api/agenda/' # no authentication @@ -631,6 +632,7 @@ def test_add_agenda(app, user, settings): 'anonymize_delay': 'oups', 'edit_role': 'oups', 'view_role': 'plop', + 'category': 'oups', } resp = app.post(api_url, params=params, status=400) assert resp.json['err'] @@ -641,6 +643,7 @@ def test_add_agenda(app, user, settings): 'anonymize_delay': ['A valid integer is required.'], 'edit_role': ['unknown role: oups'], 'view_role': ['unknown role: plop'], + 'category': ['unknown category: oups'], } # slug already used @@ -692,6 +695,7 @@ def test_add_agenda(app, user, settings): 'anonymize_delay': 30, 'edit_role': 'Edit', 'view_role': 'View', + 'category': 'category-a', } resp = app.post(api_url, params=params) assert not resp.json['err'] @@ -700,6 +704,7 @@ def test_add_agenda(app, user, settings): assert agenda.min_booking_datetime.date() == datetime.date(2021, 7, 10) assert agenda.edit_role == edit_group assert agenda.view_role == view_group + assert agenda.category == category_a # add an events agenda params = { @@ -712,6 +717,7 @@ def test_add_agenda(app, user, settings): 'anonymize_delay': 30, 'edit_role': 'Edit', 'view_role': 'View', + 'category': 'category-a', } resp = app.post(api_url, params=params) assert not resp.json['err'] @@ -720,3 +726,4 @@ def test_add_agenda(app, user, settings): assert agenda.edit_role == edit_group assert agenda.view_role == view_group assert agenda.min_booking_datetime.date() == datetime.date(2021, 7, 12) + assert agenda.category == category_a