api: add shared custody views (#62146)

This commit is contained in:
Valentin Deniaud 2022-02-22 10:30:12 +01:00
parent c0679178ba
commit d82c194694
4 changed files with 165 additions and 0 deletions

View File

@ -371,3 +371,15 @@ class SubscriptionSerializer(serializers.ModelSerializer):
if attrs.get('date_start') and attrs.get('date_end') and attrs['date_start'] > attrs['date_end']:
raise ValidationError(_('start_datetime must be before end_datetime'))
return attrs
class SharedCustodyAgendaSerializer(serializers.Serializer):
first_guardian_name = serializers.CharField(max_length=250)
first_guardian_id = serializers.CharField(max_length=250)
second_guardian_name = serializers.CharField(max_length=250)
second_guardian_id = serializers.CharField(max_length=250)
class SharedCustodyChildSerializer(serializers.Serializer):
name = serializers.CharField(max_length=250)
user_external_id = serializers.CharField(max_length=250)

View File

@ -106,6 +106,12 @@ urlpatterns = [
url(r'^booking/(?P<booking_pk>\d+)/suspend/$', views.suspend_booking, name='api-suspend-booking'),
url(r'^booking/(?P<booking_pk>\d+)/resize/$', views.resize_booking, name='api-resize-booking'),
url(r'^booking/(?P<booking_pk>\d+)/ics/$', views.booking_ics, name='api-booking-ics'),
url(r'^shared-custody/$', views.shared_custody_agendas, name='api-shared-custody-agendas'),
url(
r'^shared-custody/(?P<agenda_pk>\d+)/add-child/$',
views.shared_custody_agenda_add_child,
name='api-shared-custody-agenda-add-child',
),
url(r'^statistics/$', views.statistics_list, name='api-statistics-list'),
url(r'^statistics/bookings/$', views.bookings_statistics, name='api-statistics-bookings'),
]

View File

@ -52,6 +52,8 @@ from chrono.agendas.models import (
Desk,
Event,
MeetingType,
Person,
SharedCustodyAgenda,
Subscription,
TimePeriodException,
)
@ -2641,6 +2643,68 @@ class BookingICS(APIView):
booking_ics = BookingICS.as_view()
class SharedCustodyAgendas(APIView):
permission_classes = (permissions.IsAuthenticated,)
serializer_class = serializers.SharedCustodyAgendaSerializer
def post(self, request):
serializer = self.serializer_class(data=request.data)
if not serializer.is_valid():
raise APIErrorBadRequest(N_('invalid payload'), errors=serializer.errors)
data = serializer.validated_data
with transaction.atomic():
first_guardian, dummy = Person.objects.get_or_create(
user_external_id=data['first_guardian_id'],
defaults={'name': data['first_guardian_name']},
)
second_guardian, dummy = Person.objects.get_or_create(
user_external_id=data['second_guardian_id'],
defaults={'name': data['second_guardian_name']},
)
agenda = SharedCustodyAgenda.objects.create(
first_guardian=first_guardian, second_guardian=second_guardian
)
response = {
'id': agenda.pk,
'settings_url': request.build_absolute_uri(agenda.get_settings_url()),
}
return Response({'err': 0, 'data': response})
shared_custody_agendas = SharedCustodyAgendas.as_view()
class SharedCustodyAgendaAddChild(APIView):
permission_classes = (permissions.IsAuthenticated,)
serializer_class = serializers.SharedCustodyChildSerializer
def post(self, request, agenda_pk):
agenda = get_object_or_404(SharedCustodyAgenda, pk=agenda_pk)
serializer = self.serializer_class(data=request.data)
if not serializer.is_valid():
raise APIErrorBadRequest(N_('invalid payload'), errors=serializer.errors)
data = serializer.validated_data
with transaction.atomic():
child, dummy = Person.objects.get_or_create(
user_external_id=data['user_external_id'],
defaults={'name': data['name']},
)
if child.agendas.exists():
raise APIError(N_('This child already has one custody agenda.'))
agenda.children.add(child)
return Response({'err': 0, 'data': {'child_id': child.pk}})
shared_custody_agenda_add_child = SharedCustodyAgendaAddChild.as_view()
class StatisticsList(APIView):
permission_classes = (permissions.IsAuthenticated,)

View File

@ -15,7 +15,9 @@ from chrono.agendas.models import (
Desk,
Event,
MeetingType,
Person,
Resource,
SharedCustodyAgenda,
TimePeriodException,
VirtualMember,
)
@ -766,3 +768,84 @@ def test_add_agenda(app, user, settings):
resp = app.get('/api/agendas/datetimes/?agendas=%s' % agenda.slug)
assert 'data' in resp.json
def test_add_shared_custody_agenda(app, user, settings):
app.authorization = ('Basic', ('john.doe', 'password'))
params = {
'first_guardian_name': 'John Doe',
'first_guardian_id': 'xxx',
'second_guardian_name': 'Jane Doe',
'second_guardian_id': 'yyy',
}
resp = app.post_json('/api/shared-custody/', params=params)
john = Person.objects.get(user_external_id='xxx', name='John Doe')
jane = Person.objects.get(user_external_id='yyy', name='Jane Doe')
agenda = SharedCustodyAgenda.objects.get()
assert agenda.first_guardian == john
assert agenda.second_guardian == jane
assert resp.json['data'] == {
'id': agenda.pk,
'settings_url': 'http://testserver/manage/shared-custody/%s/settings/' % agenda.pk,
}
params = {
'first_guardian_name': 'John Doe',
'first_guardian_id': 'xxx',
'second_guardian_name': 'Other',
'second_guardian_id': 'zzz',
}
resp = app.post_json('/api/shared-custody/', params=params)
assert resp.json['data']['id'] != agenda.pk
assert SharedCustodyAgenda.objects.filter(first_guardian=john).count() == 2
def test_shared_custody_agenda_add_child(app, user, settings):
father = Person.objects.create(user_external_id='father_id', name='John Doe')
mother = Person.objects.create(user_external_id='mother_id', name='Jane Doe')
agenda = SharedCustodyAgenda.objects.create(first_guardian=father, second_guardian=mother)
app.authorization = ('Basic', ('john.doe', 'password'))
params = {
'name': 'James Doe',
'user_external_id': 'xxx',
}
resp = app.post_json('/api/shared-custody/%s/add-child/' % agenda.pk, params=params)
child = Person.objects.get(name='James Doe', user_external_id='xxx')
assert resp.json['data']['child_id'] == child.pk
assert agenda.children.count() == 1
assert Person.objects.count() == 3
# adding again throws error
resp = app.post_json('/api/shared-custody/%s/add-child/' % agenda.pk, params=params)
assert resp.json['err'] == 1
assert resp.json['err_desc'] == 'This child already has one custody agenda.'
assert agenda.children.count() == 1
assert Person.objects.count() == 3
params = {
'name': 'Jack Doe',
'user_external_id': 'yyy',
}
resp = app.post_json('/api/shared-custody/%s/add-child/' % agenda.pk, params=params)
child = Person.objects.get(name='Jack Doe', user_external_id='yyy')
assert resp.json['data']['child_id'] == child.pk
assert agenda.children.count() == 2
assert Person.objects.count() == 4
other_father = Person.objects.create(user_external_id='other_father_id', name='John Doe')
other_mother = Person.objects.create(user_external_id='other_mother_id', name='Jane Doe')
other_agenda = SharedCustodyAgenda.objects.create(
first_guardian=other_father, second_guardian=other_mother
)
resp = app.post_json('/api/shared-custody/%s/add-child/' % other_agenda.pk, params=params)
assert resp.json['err'] == 1
assert resp.json['err_desc'] == 'This child already has one custody agenda.'