toulouse-maelis: read-child-agenda endpoint (#72774)

This commit is contained in:
Lauréline Guérin 2023-01-03 11:24:40 +01:00
parent b37dd96cfd
commit 569764da59
No known key found for this signature in database
GPG Key ID: 1FAB9B9B4F93D473
4 changed files with 776 additions and 1 deletions

View File

@ -14,12 +14,16 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>.
import base64
import datetime
from operator import itemgetter
from urllib.parse import urljoin
import zeep
from dateutil import rrule
from django.contrib.postgres.fields import JSONField
from django.core.serializers.json import DjangoJSONEncoder
from django.db import models
from django.utils import dateformat
from django.utils.timezone import now
from zeep.helpers import serialize_object
from zeep.wsse.username import UsernameToken
@ -30,7 +34,7 @@ from passerelle.utils.conversion import simplify
from passerelle.utils.jsonresponse import APIError
from passerelle.utils.templates import render_to_string
from . import family_schemas, invoice_schemas, schemas
from . import family_schemas, invoice_schemas, schemas, utils
class UpdateError(Exception):
@ -1613,6 +1617,115 @@ class ToulouseMaelis(BaseResource, HTTPResource):
raise APIError('maelis fails to add the supplied document')
return {'data': 'ok'}
def get_start_and_end_dates(self, start_date, end_date):
try:
start_date = datetime.datetime.strptime(start_date, utils.json_date_format).date()
end_date = datetime.datetime.strptime(end_date, utils.json_date_format).date()
except ValueError:
raise APIError('bad date format, should be YYYY-MM-DD', err_code='bad-request', http_status=400)
if start_date > end_date:
raise APIError(
'start_date should be before end_date',
err_code='bad-request',
http_status=400,
)
reference_year = utils.get_reference_year_from_date(start_date)
end_reference_year = utils.get_reference_year_from_date(end_date)
if reference_year != end_reference_year:
raise APIError(
'start_date and end_date are in different reference year (%s != %s)'
% (reference_year, end_reference_year),
err_code='bad-request',
http_status=400,
)
return start_date, end_date, reference_year
def get_bookings(self, family_id, child_id, start_date, end_date):
bookings = []
for booking_date in rrule.rrule(rrule.MONTHLY, dtstart=start_date.replace(day=1), until=end_date):
payload = {
'requestBean': {
'numDossier': family_id,
'numPerson': child_id,
'year': booking_date.year,
'month': booking_date.month,
}
}
response = self.call('Activity', 'getPersonScheduleList', **payload)
result = serialize_object(response)
for result_data in result or []:
for schedule in result_data['activityScheduleList']:
activity = schedule['activity']
if activity['activityType']['natureSpec']['code'] not in ['A', 'R']:
continue
activity_id = activity['idAct']
for unit in schedule['unitScheduleList']:
days = unit['dayInfoList']
for day in days:
if day['status'] in ['NO_READ', 'NO_CUSTODY']:
continue
booking = {
'id': '%s:%s:%s'
% (child_id, activity_id, day['day'].strftime(utils.json_date_format)),
'text': dateformat.format(day['day'], 'l j F Y'),
'prefill': day['scheduledPresence'] > 0 or day['realPresence'] > 1,
'disabled': day['status'] != 'WRITABLE',
'details': day,
}
color = 'white'
if booking['prefill']:
color = 'green'
booking['details']['status_color'] = color
booking['details']['activity_id'] = activity_id
booking['details']['activity_type'] = activity['activityType']['code']
booking['details']['activity_label'] = activity['activityType']['libelle']
booking['details']['child_id'] = child_id
booking['details']['day_str'] = day['day'].strftime(utils.json_date_format)
bookings.append(booking)
# sort bookings
activity_types = ['ACCMAT', 'RESTSCOL']
bookings = [
(
b['details']['day'],
activity_types.index(b['details']['activity_type'])
if b['details']['activity_type'] in activity_types
else 0,
b['details']['activity_label'],
b,
)
for b in bookings
]
bookings = sorted(bookings, key=itemgetter(0, 1, 2))
bookings = [b for d, a, l, b in bookings]
return bookings
@endpoint(
display_category='Réservation',
description="Agenda d'un enfant",
name='read-child-agenda',
perm='can_access',
parameters={
'NameID': {'description': 'Publik NameID'},
'child_id': {'description': "Numéro de l'enfant"},
'start_date': {'description': 'Début de la période'},
'end_date': {'description': 'Fin de la période'},
},
)
def read_child_agenda(self, request, NameID, child_id, start_date, end_date):
family_id = self.get_link(NameID).family_id
start_date, end_date, reference_year = self.get_start_and_end_dates(start_date, end_date)
bookings = self.get_bookings(family_id, child_id, start_date, end_date)
return {
'data': bookings,
'extra_data': {
'start_date': start_date,
'end_date': end_date,
'school_year': '%s/%s' % (reference_year, reference_year + 1),
},
}
@endpoint(
display_category='Facture',
description="Ajout d'autorisation de prélèvement",

View File

@ -0,0 +1,23 @@
# Copyright (C) 2023 Entr'ouvert
#
# This program is free software: you can redistribute it and/or modify it
# under the terms of the GNU Affero General Public License as published
# by the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
json_date_format = '%Y-%m-%d'
def get_reference_year_from_date(some_date):
if some_date.month <= 8:
# between january and august, reference year is the year just before
return some_date.year - 1
return some_date.year

View File

@ -0,0 +1,250 @@
<soap:Envelope
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<ns2:getPersonScheduleListResponse
xmlns:ns2="activity.ws.maelis.sigec.com"
xmlns:ns3="bean.persistence.activity.ws.maelis.sigec.com">
<resultBean>
<personScheduleList>
<person>
<numPerson>613880</numPerson>
<lastname>DOE</lastname>
<firstname>JANNIS</firstname>
</person>
<activityScheduleList>
<activity>
<idAct>A10049327689</idAct>
<libelle>CLAE MATIN 22/23</libelle>
<activityType>
<code>ACCMAT</code>
<libelle>Accueil du matin</libelle>
<natureSpec>
<code>A</code>
<libelle>Accueil P\xc3\xa9riscolaire</libelle>
</natureSpec>
</activityType>
</activity>
<unitScheduleList>
<unit>
<idUnit>A10049327690</idUnit>
<libelle>CLAE MATIN 22/23</libelle>
</unit>
<dayInfoList>
<day>2023-01-01T00:00:00+01:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>NO_READ</ns3:status>
</dayInfoList>
<dayInfoList>
<day>2023-01-02T00:00:00+01:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>READ_ONLY</ns3:status>
</dayInfoList>
<dayInfoList>
<day>2023-01-03T00:00:00+01:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>READ_ONLY</ns3:status>
</dayInfoList>
<dayInfoList>
<day>2023-01-04T00:00:00+01:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>NO_READ</ns3:status>
</dayInfoList>
<dayInfoList>
<day>2023-01-05T00:00:00+01:00</day>
<scheduledPresence>1</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>WRITABLE</ns3:status>
<ns3:action>ADD_ABSENCE</ns3:action>
</dayInfoList>
<dayInfoList>
<day>2023-01-06T00:00:00+01:00</day>
<scheduledPresence>1</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>WRITABLE</ns3:status>
<ns3:action>ADD_ABSENCE</ns3:action>
</dayInfoList>
<dayInfoList>
<day>2023-01-07T00:00:00+01:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>NO_READ</ns3:status>
</dayInfoList>
<dayInfoList>
<day>2023-01-08T00:00:00+01:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>NO_READ</ns3:status>
</dayInfoList>
<dayInfoList>
<day>2023-01-09T00:00:00+01:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>WRITABLE</ns3:status>
<ns3:action>ADD_PRES_PREVI</ns3:action>
</dayInfoList>
<dayInfoList>
<day>2023-01-10T00:00:00+01:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>WRITABLE</ns3:status>
<ns3:action>ADD_PRES_PREVI</ns3:action>
</dayInfoList>
<dayInfoList>
<day>2023-01-11T00:00:00+01:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>NO_READ</ns3:status>
</dayInfoList>
<dayInfoList>
<day>2023-01-12T00:00:00+01:00</day>
<scheduledPresence>1</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>WRITABLE</ns3:status>
<ns3:action>DEL_PRES_PREVI</ns3:action>
</dayInfoList>
<dayInfoList>
<day>2023-01-13T00:00:00+01:00</day>
<scheduledPresence>1</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>WRITABLE</ns3:status>
<ns3:action>DEL_PRES_PREVI</ns3:action>
</dayInfoList>
<dayInfoList>
<day>2023-01-14T00:00:00+01:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>NO_READ</ns3:status>
</dayInfoList>
<dayInfoList>
<day>2023-01-15T00:00:00+01:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>NO_READ</ns3:status>
</dayInfoList>
</unitScheduleList>
</activityScheduleList>
<activityScheduleList>
<activity>
<idAct>A10049327682</idAct>
<libelle>RESTAURATION SCOLAIRE 22/23</libelle>
<activityType>
<code>RESTSCOL</code>
<libelle>Restauration scolaire</libelle>
<natureSpec>
<code>R</code>
<libelle>Restauration Scolaire</libelle>
</natureSpec>
</activityType>
</activity>
<unitScheduleList>
<unit>
<idUnit>A10049327683</idUnit>
<libelle>RESTAURATION SCOLAIRE 22/23</libelle>
</unit>
<dayInfoList>
<day>2023-01-01T00:00:00+01:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>NO_READ</ns3:status>
</dayInfoList>
<dayInfoList>
<day>2023-01-02T00:00:00+01:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>READ_ONLY</ns3:status>
</dayInfoList>
<dayInfoList>
<day>2023-01-03T00:00:00+01:00</day>
<scheduledPresence>1</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>READ_ONLY</ns3:status>
</dayInfoList>
<dayInfoList>
<day>2023-01-04T00:00:00+01:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>NO_READ</ns3:status>
</dayInfoList>
<dayInfoList>
<day>2023-01-05T00:00:00+01:00</day>
<scheduledPresence>1</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>WRITABLE</ns3:status>
<ns3:action>ADD_ABSENCE</ns3:action>
</dayInfoList>
<dayInfoList>
<day>2023-01-06T00:00:00+01:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>WRITABLE</ns3:status>
<ns3:action>ADD_PRES_REAL</ns3:action>
</dayInfoList>
<dayInfoList>
<day>2023-01-07T00:00:00+01:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>NO_READ</ns3:status>
</dayInfoList>
<dayInfoList>
<day>2023-01-08T00:00:00+01:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>NO_READ</ns3:status>
</dayInfoList>
<dayInfoList>
<day>2023-01-09T00:00:00+01:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>WRITABLE</ns3:status>
<ns3:action>ADD_PRES_PREVI</ns3:action>
</dayInfoList>
<dayInfoList>
<day>2023-01-10T00:00:00+01:00</day>
<scheduledPresence>1</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>WRITABLE</ns3:status>
<ns3:action>DEL_PRES_PREVI</ns3:action>
</dayInfoList>
<dayInfoList>
<day>2023-01-11T00:00:00+01:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>NO_READ</ns3:status>
</dayInfoList>
<dayInfoList>
<day>2023-01-12T00:00:00+01:00</day>
<scheduledPresence>1</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>WRITABLE</ns3:status>
<ns3:action>DEL_PRES_PREVI</ns3:action>
</dayInfoList>
<dayInfoList>
<day>2023-01-13T00:00:00+01:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>WRITABLE</ns3:status>
<ns3:action>ADD_PRES_PREVI</ns3:action>
</dayInfoList>
<dayInfoList>
<day>2023-01-14T00:00:00+01:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>NO_READ</ns3:status>
</dayInfoList>
<dayInfoList>
<day>2023-01-15T00:00:00+01:00</day>
<scheduledPresence>0</scheduledPresence>
<realPresence>0</realPresence>
<ns3:status>NO_READ</ns3:status>
</dayInfoList>
</unitScheduleList>
</activityScheduleList>
</personScheduleList>
</resultBean>
</ns2:getPersonScheduleListResponse>
</soap:Body>
</soap:Envelope>

View File

@ -3698,3 +3698,392 @@ def test_read_exemption_reasons_list(con, app):
for item in resp.json['data']:
assert 'id' in item
assert 'text' in item
def test_read_child_agenda(activity_service, con, app):
activity_service.add_soap_response(
'getPersonScheduleList', get_xml_file('R_get_person_schedule_list.xml')
)
url = get_endpoint('read-child-agenda')
Link.objects.create(resource=con, family_id='1312', name_id='local')
resp = app.get(url + '?NameID=local&child_id=613880&start_date=2023-01-01&end_date=2023-01-15')
assert resp.json['err'] == 0
assert resp.json['extra_data'] == {
'start_date': '2023-01-01',
'end_date': '2023-01-15',
'school_year': '2022/2023',
}
assert len(resp.json['data']) == 16
assert resp.json['data'] == [
{
'details': {
'absence': None,
'action': None,
'activity_id': 'A10049327689',
'activity_label': 'Accueil du matin',
'activity_type': 'ACCMAT',
'child_id': '613880',
'day': '2023-01-02T00:00:00+01:00',
'day_str': '2023-01-02',
'hasPlace': None,
'realPresence': 0,
'scheduledPresence': 0,
'status': 'READ_ONLY',
'status_color': 'white',
},
'disabled': True,
'id': '613880:A10049327689:2023-01-02',
'prefill': False,
'text': 'Monday 2 January 2023',
},
{
'details': {
'absence': None,
'action': None,
'activity_id': 'A10049327682',
'activity_label': 'Restauration scolaire',
'activity_type': 'RESTSCOL',
'child_id': '613880',
'day': '2023-01-02T00:00:00+01:00',
'day_str': '2023-01-02',
'hasPlace': None,
'realPresence': 0,
'scheduledPresence': 0,
'status': 'READ_ONLY',
'status_color': 'white',
},
'disabled': True,
'id': '613880:A10049327682:2023-01-02',
'prefill': False,
'text': 'Monday 2 January 2023',
},
{
'details': {
'absence': None,
'action': None,
'activity_id': 'A10049327689',
'activity_label': 'Accueil du matin',
'activity_type': 'ACCMAT',
'child_id': '613880',
'day': '2023-01-03T00:00:00+01:00',
'day_str': '2023-01-03',
'hasPlace': None,
'realPresence': 0,
'scheduledPresence': 0,
'status': 'READ_ONLY',
'status_color': 'white',
},
'disabled': True,
'id': '613880:A10049327689:2023-01-03',
'prefill': False,
'text': 'Tuesday 3 January 2023',
},
{
'details': {
'absence': None,
'action': None,
'activity_id': 'A10049327682',
'activity_label': 'Restauration scolaire',
'activity_type': 'RESTSCOL',
'child_id': '613880',
'day': '2023-01-03T00:00:00+01:00',
'day_str': '2023-01-03',
'hasPlace': None,
'realPresence': 0,
'scheduledPresence': 1,
'status': 'READ_ONLY',
'status_color': 'green',
},
'disabled': True,
'id': '613880:A10049327682:2023-01-03',
'prefill': True,
'text': 'Tuesday 3 January 2023',
},
{
'details': {
'absence': None,
'action': 'ADD_ABSENCE',
'activity_id': 'A10049327689',
'activity_label': 'Accueil du matin',
'activity_type': 'ACCMAT',
'child_id': '613880',
'day': '2023-01-05T00:00:00+01:00',
'day_str': '2023-01-05',
'hasPlace': None,
'realPresence': 0,
'scheduledPresence': 1,
'status': 'WRITABLE',
'status_color': 'green',
},
'disabled': False,
'id': '613880:A10049327689:2023-01-05',
'prefill': True,
'text': 'Thursday 5 January 2023',
},
{
'details': {
'absence': None,
'action': 'ADD_ABSENCE',
'activity_id': 'A10049327682',
'activity_label': 'Restauration scolaire',
'activity_type': 'RESTSCOL',
'child_id': '613880',
'day': '2023-01-05T00:00:00+01:00',
'day_str': '2023-01-05',
'hasPlace': None,
'realPresence': 0,
'scheduledPresence': 1,
'status': 'WRITABLE',
'status_color': 'green',
},
'disabled': False,
'id': '613880:A10049327682:2023-01-05',
'prefill': True,
'text': 'Thursday 5 January 2023',
},
{
'details': {
'absence': None,
'action': 'ADD_ABSENCE',
'activity_id': 'A10049327689',
'activity_label': 'Accueil du matin',
'activity_type': 'ACCMAT',
'child_id': '613880',
'day': '2023-01-06T00:00:00+01:00',
'day_str': '2023-01-06',
'hasPlace': None,
'realPresence': 0,
'scheduledPresence': 1,
'status': 'WRITABLE',
'status_color': 'green',
},
'disabled': False,
'id': '613880:A10049327689:2023-01-06',
'prefill': True,
'text': 'Friday 6 January 2023',
},
{
'details': {
'absence': None,
'action': 'ADD_PRES_REAL',
'activity_id': 'A10049327682',
'activity_label': 'Restauration scolaire',
'activity_type': 'RESTSCOL',
'child_id': '613880',
'day': '2023-01-06T00:00:00+01:00',
'day_str': '2023-01-06',
'hasPlace': None,
'realPresence': 0,
'scheduledPresence': 0,
'status': 'WRITABLE',
'status_color': 'white',
},
'disabled': False,
'id': '613880:A10049327682:2023-01-06',
'prefill': False,
'text': 'Friday 6 January 2023',
},
{
'details': {
'absence': None,
'action': 'ADD_PRES_PREVI',
'activity_id': 'A10049327689',
'activity_label': 'Accueil du matin',
'activity_type': 'ACCMAT',
'child_id': '613880',
'day': '2023-01-09T00:00:00+01:00',
'day_str': '2023-01-09',
'hasPlace': None,
'realPresence': 0,
'scheduledPresence': 0,
'status': 'WRITABLE',
'status_color': 'white',
},
'disabled': False,
'id': '613880:A10049327689:2023-01-09',
'prefill': False,
'text': 'Monday 9 January 2023',
},
{
'details': {
'absence': None,
'action': 'ADD_PRES_PREVI',
'activity_id': 'A10049327682',
'activity_label': 'Restauration scolaire',
'activity_type': 'RESTSCOL',
'child_id': '613880',
'day': '2023-01-09T00:00:00+01:00',
'day_str': '2023-01-09',
'hasPlace': None,
'realPresence': 0,
'scheduledPresence': 0,
'status': 'WRITABLE',
'status_color': 'white',
},
'disabled': False,
'id': '613880:A10049327682:2023-01-09',
'prefill': False,
'text': 'Monday 9 January 2023',
},
{
'details': {
'absence': None,
'action': 'ADD_PRES_PREVI',
'activity_id': 'A10049327689',
'activity_label': 'Accueil du matin',
'activity_type': 'ACCMAT',
'child_id': '613880',
'day': '2023-01-10T00:00:00+01:00',
'day_str': '2023-01-10',
'hasPlace': None,
'realPresence': 0,
'scheduledPresence': 0,
'status': 'WRITABLE',
'status_color': 'white',
},
'disabled': False,
'id': '613880:A10049327689:2023-01-10',
'prefill': False,
'text': 'Tuesday 10 January 2023',
},
{
'details': {
'absence': None,
'action': 'DEL_PRES_PREVI',
'activity_id': 'A10049327682',
'activity_label': 'Restauration scolaire',
'activity_type': 'RESTSCOL',
'child_id': '613880',
'day': '2023-01-10T00:00:00+01:00',
'day_str': '2023-01-10',
'hasPlace': None,
'realPresence': 0,
'scheduledPresence': 1,
'status': 'WRITABLE',
'status_color': 'green',
},
'disabled': False,
'id': '613880:A10049327682:2023-01-10',
'prefill': True,
'text': 'Tuesday 10 January 2023',
},
{
'details': {
'absence': None,
'action': 'DEL_PRES_PREVI',
'activity_id': 'A10049327689',
'activity_label': 'Accueil du matin',
'activity_type': 'ACCMAT',
'child_id': '613880',
'day': '2023-01-12T00:00:00+01:00',
'day_str': '2023-01-12',
'hasPlace': None,
'realPresence': 0,
'scheduledPresence': 1,
'status': 'WRITABLE',
'status_color': 'green',
},
'disabled': False,
'id': '613880:A10049327689:2023-01-12',
'prefill': True,
'text': 'Thursday 12 January 2023',
},
{
'details': {
'absence': None,
'action': 'DEL_PRES_PREVI',
'activity_id': 'A10049327682',
'activity_label': 'Restauration scolaire',
'activity_type': 'RESTSCOL',
'child_id': '613880',
'day': '2023-01-12T00:00:00+01:00',
'day_str': '2023-01-12',
'hasPlace': None,
'realPresence': 0,
'scheduledPresence': 1,
'status': 'WRITABLE',
'status_color': 'green',
},
'disabled': False,
'id': '613880:A10049327682:2023-01-12',
'prefill': True,
'text': 'Thursday 12 January 2023',
},
{
'details': {
'absence': None,
'action': 'DEL_PRES_PREVI',
'activity_id': 'A10049327689',
'activity_label': 'Accueil du matin',
'activity_type': 'ACCMAT',
'child_id': '613880',
'day': '2023-01-13T00:00:00+01:00',
'day_str': '2023-01-13',
'hasPlace': None,
'realPresence': 0,
'scheduledPresence': 1,
'status': 'WRITABLE',
'status_color': 'green',
},
'disabled': False,
'id': '613880:A10049327689:2023-01-13',
'prefill': True,
'text': 'Friday 13 January 2023',
},
{
'details': {
'absence': None,
'action': 'ADD_PRES_PREVI',
'activity_id': 'A10049327682',
'activity_label': 'Restauration scolaire',
'activity_type': 'RESTSCOL',
'child_id': '613880',
'day': '2023-01-13T00:00:00+01:00',
'day_str': '2023-01-13',
'hasPlace': None,
'realPresence': 0,
'scheduledPresence': 0,
'status': 'WRITABLE',
'status_color': 'white',
},
'disabled': False,
'id': '613880:A10049327682:2023-01-13',
'prefill': False,
'text': 'Friday 13 January 2023',
},
]
def test_read_child_agenda_not_linked_error(con, app):
url = get_endpoint('read-child-agenda')
resp = app.get(url + '?NameID=local&child_id=613880&start_date=2022-09-01&end_date=2023-08-31')
assert resp.json['err'] == 'not-linked'
assert resp.json['err_desc'] == 'User not linked to family'
def test_read_child_agenda_date_error(con, app):
url = get_endpoint('read-child-agenda')
Link.objects.create(resource=con, family_id='1312', name_id='local')
resp = app.get(url + '?NameID=local&child_id=613880&start_date=bad&end_date=2023-08-31', status=400)
assert resp.json['err'] == 'bad-request'
assert resp.json['err_desc'] == 'bad date format, should be YYYY-MM-DD'
resp = app.get(url + '?NameID=local&child_id=613880&start_date=2022-09-01&end_date=bad', status=400)
assert resp.json['err'] == 'bad-request'
assert resp.json['err_desc'] == 'bad date format, should be YYYY-MM-DD'
resp = app.get(
url + '?NameID=local&child_id=613880&start_date=2023-09-01&end_date=2023-08-31', status=400
)
assert resp.json['err'] == 'bad-request'
assert resp.json['err_desc'] == 'start_date should be before end_date'
resp = app.get(
url + '?NameID=local&child_id=613880&start_date=2022-09-01&end_date=2024-08-31', status=400
)
assert resp.json['err'] == 'bad-request'
assert resp.json['err_desc'] == 'start_date and end_date are in different reference year (2022 != 2023)'