api: configure events type on agenda (#63286)
This commit is contained in:
parent
a732e05a6f
commit
f2a1a97940
|
@ -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
|
||||
|
||||
|
||||
|
|
|
@ -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')
|
||||
)
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue