api: configure events type on agenda (#63286)

This commit is contained in:
Lauréline Guérin 2022-04-04 15:56:18 +02:00
parent a732e05a6f
commit f2a1a97940
No known key found for this signature in database
GPG Key ID: 1FAB9B9B4F93D473
3 changed files with 39 additions and 4 deletions

View File

@ -5,7 +5,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, Category, Event, Subscription
from chrono.agendas.models import AbsenceReason, Agenda, Booking, Category, Event, EventsType, Subscription
def get_objects_from_slugs(slugs, qs):
@ -321,6 +321,7 @@ 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)
events_type = serializers.SlugField(required=False, max_length=160)
class Meta:
model = Agenda
@ -335,6 +336,7 @@ class AgendaSerializer(serializers.ModelSerializer):
'edit_role',
'view_role',
'category',
'events_type',
]
def get_role(self, value):
@ -355,6 +357,12 @@ class AgendaSerializer(serializers.ModelSerializer):
except Category.DoesNotExist:
raise serializers.ValidationError(_('unknown category: %s' % value))
def validate_events_type(self, value):
try:
return EventsType.objects.get(slug=value)
except EventsType.DoesNotExist:
raise serializers.ValidationError(_('unknown events type: %s' % value))
def validate(self, attrs):
super().validate(attrs)
if attrs.get('minimal_booking_delay_in_working_days') and attrs.get('kind', 'events') != 'events':
@ -364,6 +372,8 @@ class AgendaSerializer(serializers.ModelSerializer):
% attrs['kind']
}
)
if attrs.get('events_type') and attrs.get('kind', 'events') != 'events':
raise ValidationError({'events_type': _('Option not available on %s agenda') % attrs['kind']})
return attrs

View File

@ -370,6 +370,7 @@ def get_agenda_detail(request, agenda, check_events=False):
{'id': r.slug, 'text': r.label, 'description': r.description} for r in agenda.resources.all()
]
if agenda.kind == 'events':
agenda_detail['events_type'] = agenda.events_type.slug if agenda.events_type else None
agenda_detail['minimal_booking_delay_in_working_days'] = agenda.minimal_booking_delay_in_working_days
agenda_detail['api'] = {
'datetimes_url': request.build_absolute_uri(
@ -726,7 +727,7 @@ class Agendas(APIView):
def get(self, request, format=None):
agendas_queryset = (
Agenda.objects.all()
.select_related('absence_reasons_group', 'category', 'edit_role', 'view_role')
.select_related('absence_reasons_group', 'category', 'edit_role', 'view_role', 'events_type')
.prefetch_related('resources', 'absence_reasons_group__absence_reasons')
.order_by('label')
)

View File

@ -14,6 +14,7 @@ from chrono.agendas.models import (
Category,
Desk,
Event,
EventsType,
Resource,
TimePeriodException,
)
@ -29,11 +30,17 @@ def test_agendas_api(app):
group = AbsenceReasonGroup.objects.create(label='Foo')
reason = AbsenceReason.objects.create(group=group, label='Foo bar')
reason2 = AbsenceReason.objects.create(group=group, label='Foo bar baz')
events_type = EventsType.objects.create(label='Type A')
events_type2 = EventsType.objects.create(label='Type B')
event_agenda = Agenda.objects.create(
label='Foo bar', category=category_a, absence_reasons_group=group, edit_role=edit_group
label='Foo bar',
category=category_a,
absence_reasons_group=group,
events_type=events_type,
edit_role=edit_group,
)
Desk.objects.create(agenda=event_agenda, slug='_exceptions_holder')
event_agenda2 = Agenda.objects.create(label='Foo bar 2', category=category_a)
event_agenda2 = Agenda.objects.create(label='Foo bar 2', category=category_a, events_type=events_type2)
Desk.objects.create(agenda=event_agenda2, slug='_exceptions_holder')
event_agenda3 = Agenda.objects.create(label='Foo bar 3', absence_reasons_group=group)
Desk.objects.create(agenda=event_agenda3, slug='_exceptions_holder')
@ -68,6 +75,7 @@ def test_agendas_api(app):
'edit_role': 'Edit',
'view_role': None,
'category': 'category-a',
'events_type': 'type-a',
'absence_reasons': [
{'id': reason.slug, 'slug': reason.slug, 'text': reason.label, 'label': reason.label},
{'id': reason2.slug, 'slug': reason2.slug, 'text': reason2.label, 'label': reason2.label},
@ -89,6 +97,7 @@ def test_agendas_api(app):
'edit_role': None,
'view_role': None,
'category': 'category-a',
'events_type': 'type-b',
'api': {
'datetimes_url': 'http://testserver/api/agenda/foo-bar-2/datetimes/',
'fillslots_url': 'http://testserver/api/agenda/foo-bar-2/fillslots/',
@ -106,6 +115,7 @@ def test_agendas_api(app):
'edit_role': None,
'view_role': None,
'category': None,
'events_type': None,
'absence_reasons': [
{'id': reason.slug, 'slug': reason.slug, 'text': reason.label, 'label': reason.label},
{'id': reason2.slug, 'slug': reason2.slug, 'text': reason2.label, 'label': reason2.label},
@ -456,6 +466,7 @@ def test_agenda_api_delete_busy(app, user):
@pytest.mark.freeze_time('2021-07-09')
def test_add_agenda(app, user, settings):
events_type = EventsType.objects.create(label='Type A')
category_a = Category.objects.create(label='Category A')
api_url = '/api/agenda/'
@ -486,6 +497,7 @@ def test_add_agenda(app, user, settings):
'edit_role': 'oups',
'view_role': 'plop',
'category': 'oups',
'events_type': 'oups',
}
resp = app.post(api_url, params=params, status=400)
assert resp.json['err']
@ -497,6 +509,7 @@ def test_add_agenda(app, user, settings):
'edit_role': ['unknown role: oups'],
'view_role': ['unknown role: plop'],
'category': ['unknown category: oups'],
'events_type': ['unknown events type: oups'],
}
# slug already used
@ -522,6 +535,15 @@ def test_add_agenda(app, user, settings):
assert resp.json['errors'] == {
'minimal_booking_delay_in_working_days': ['Option not available on meetings agenda']
}
params = {
'label': 'foo',
'slug': 'foo',
'kind': 'meetings',
'events_type': 'type-a',
}
resp = app.post(api_url, params=params, status=400)
assert resp.json['err']
assert resp.json['errors'] == {'events_type': ['Option not available on meetings agenda']}
# add an agenda using only required fields
params = {
@ -572,6 +594,7 @@ def test_add_agenda(app, user, settings):
'edit_role': 'Edit',
'view_role': 'View',
'category': 'category-a',
'events_type': 'type-a',
}
resp = app.post(api_url, params=params)
assert not resp.json['err']
@ -581,6 +604,7 @@ def test_add_agenda(app, user, settings):
assert agenda.view_role == view_group
assert agenda.min_booking_datetime.date() == datetime.date(2021, 7, 12)
assert agenda.category == category_a
assert agenda.events_type == events_type
assert Desk.objects.filter(agenda=agenda, slug='_exceptions_holder').exists()
resp = app.get('/api/agendas/datetimes/?agendas=%s' % agenda.slug)