api: add shared custody views (#62146)
This commit is contained in:
parent
c0679178ba
commit
d82c194694
|
@ -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)
|
||||
|
|
|
@ -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'),
|
||||
]
|
||||
|
|
|
@ -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,)
|
||||
|
||||
|
|
|
@ -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.'
|
||||
|
|
Loading…
Reference in New Issue