toulouse-maelis: read-child-agenda endpoint (#72774)
This commit is contained in:
parent
b37dd96cfd
commit
569764da59
|
@ -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",
|
||||
|
|
|
@ -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
|
|
@ -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>
|
|
@ -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)'
|
||||
|
|
Loading…
Reference in New Issue