toulouse_maelis: add endpoint to list school years (#72736)
gitea-wip/passerelle/pipeline/pr-main This commit looks good Details

This commit is contained in:
Serghei Mihai 2022-12-22 17:35:37 +01:00
parent fc52f572f3
commit 8aba28ad29
3 changed files with 126 additions and 45 deletions

View File

@ -18,6 +18,7 @@ from urllib.parse import urljoin
import zeep
from django.contrib.postgres.fields import JSONField
from django.core.serializers.json import DjangoJSONEncoder
from django.db import models
from django.utils.timezone import now
from zeep.helpers import serialize_object
@ -77,39 +78,15 @@ class ToulouseMaelis(BaseResource, HTTPResource):
assert self.call('Family', 'isWSRunning')
assert self.call('Activity', 'isWSRunning')
assert self.call('Invoice', 'isWSRunning')
assert self.call('Site', 'isWSRunning')
def update_referential(self, referential_name):
id_key, text_key = 'id', 'text'
# local referentials
if referential_name == 'Complement':
response = [
{'id': 'B', 'text': 'bis'},
{'id': 'Q', 'text': 'quater'},
{'id': 'T', 'text': 'ter'},
]
elif referential_name == 'Sex':
response = [
{'id': 'F', 'text': 'Féminin'},
{'id': 'M', 'text': 'Masculin'},
]
else:
# remote referentials
try:
response = self.call('Family', 'read' + referential_name + 'List')
response = serialize_object(response)
except Exception as e:
raise UpdateError('Service indisponible : %s' % str(e))
if referential_name == 'Organ':
id_key, text_key = 'id', 'code'
elif referential_name == 'Street':
id_key, text_key = 'idStreet', 'libelleStreet'
else:
id_key, text_key = 'code', 'libelle'
def update_referential(self, referential_name, data, id_key, text_key):
last_update = now()
for item in response:
text = (item[text_key] or '').strip()
for item in data:
text = item[text_key] or ''
if isinstance(text, int):
text = str(text)
text = text.strip()
self.referential.update_or_create(
resource_id=self.id,
referential_name=referential_name,
@ -123,12 +100,33 @@ class ToulouseMaelis(BaseResource, HTTPResource):
)
self.referential.filter(referential_name=referential_name, updated__lt=last_update).delete()
def update_referentials(self):
for name in (
def get_referential_data(self, service_name, referential_name):
try:
response = self.call(service_name, 'read' + referential_name + 'List')
return serialize_object(response)
except Exception as e:
raise UpdateError('Service indisponible : %s' % str(e))
def update_family_referentials(self):
# local referentials
complement_data = [
{'id': 'B', 'text': 'bis'},
{'id': 'Q', 'text': 'quater'},
{'id': 'T', 'text': 'ter'},
]
sex_data = [
{'id': 'F', 'text': 'Féminin'},
{'id': 'M', 'text': 'Masculin'},
]
self.update_referential('Complement', complement_data, 'id', 'text')
self.update_referential('Sex', sex_data, 'id', 'text')
# remote referentials
for referential_name in (
'Category',
'ChildIndicator',
'Civility',
'Complement',
'Country',
'CSP',
'DietCode',
@ -138,17 +136,29 @@ class ToulouseMaelis(BaseResource, HTTPResource):
'Quality',
'Quotient',
'RLIndicator',
'Sex',
'Situation',
'Street',
'Vaccin',
):
self.logger.info('Mise à jour du réferentiels %s' % name)
self.update_referential(name)
id_key, text_key = 'code', 'libelle'
data = self.get_referential_data('Family', referential_name)
if referential_name == 'Organ':
id_key, text_key = 'id', 'code'
elif referential_name == 'Street':
id_key, text_key = 'idStreet', 'libelleStreet'
self.update_referential(referential_name, data, id_key, text_key)
def update_site_referentials(self):
for referential_name in ('YearSchool',):
data = self.get_referential_data('Site', referential_name)
self.update_referential(referential_name, data, 'schoolYear', 'schoolYear')
def daily(self):
try:
self.update_referentials()
self.update_family_referentials()
self.update_site_referentials()
except UpdateError as e:
self.logger.warning('Erreur sur la mise à jour: %s' % e)
else:
@ -1646,6 +1656,15 @@ class ToulouseMaelis(BaseResource, HTTPResource):
data = serialize_object(response)
return {'data': data}
@endpoint(
display_category='Inscriptions',
description="Liste des années scolaires",
name='read-school-years-list',
perm='can_access',
)
def read_school_years_list(self, request):
return {'data': self.get_referential('YearSchool')}
class Link(models.Model):
resource = models.ForeignKey(ToulouseMaelis, on_delete=models.CASCADE)
@ -1669,7 +1688,7 @@ class Referential(models.Model):
item_id = models.TextField('Key')
item_text = models.TextField('Text')
item_unaccent_text = models.TextField('Text', null=True)
item_data = JSONField('Data')
item_data = JSONField('Data', encoder=DjangoJSONEncoder)
created = models.DateTimeField('Created', auto_now_add=True)
updated = models.DateTimeField('Updated', auto_now=True)

View File

@ -0,0 +1,20 @@
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<ns2:readYearSchoolListResponse xmlns:ns2="site.ws.maelis.sigec.com">
<yearSchoolList>
<schoolYear>2022</schoolYear>
<dateStartYearSchool>2022-09-01T00:00:00+02:00</dateStartYearSchool>
<dateEndYearSchool>2023-07-07T00:00:00+02:00</dateEndYearSchool>
<dateStartSubscribeSchool>2022-04-01T00:00:00+02:00</dateStartSubscribeSchool>
<dateEndSubscribeSchool>2023-07-08T00:00:00+02:00</dateEndSubscribeSchool>
</yearSchoolList>
<yearSchoolList>
<schoolYear>2023</schoolYear>
<dateStartYearSchool>2023-09-01T00:00:00+02:00</dateStartYearSchool>
<dateEndYearSchool>2024-07-07T00:00:00+02:00</dateEndYearSchool>
<dateStartSubscribeSchool>2022-12-01T00:00:00+01:00</dateStartSubscribeSchool>
<dateEndSubscribeSchool>2023-07-08T00:00:00+02:00</dateEndSubscribeSchool>
</yearSchoolList>
</ns2:readYearSchoolListResponse>
</soap:Body>
</soap:Envelope>

View File

@ -46,6 +46,7 @@ CONNECTION_ERROR = ConnectionError('No address associated with hostname')
FAMILY_SERVICE_WSDL = FakedResponse(content=get_xml_file('FamilyService.wsdl'), status_code=200)
ACTIVITY_SERVICE_WSDL = FakedResponse(content=get_xml_file('ActivityService.wsdl'), status_code=200)
INVOICE_SERVICE_WSDL = FakedResponse(content=get_xml_file('InvoiceService.wsdl'), status_code=200)
SITE_SERVICE_WSDL = FakedResponse(content=get_xml_file('SiteService.wsdl'), status_code=200)
FAILED_AUTH = FakedResponse(content=get_xml_file('R_failed_authentication.xml'), status_code=500)
ISWSRUNNING_TRUE = FakedResponse(content=get_xml_file('R_is_ws_running.xml') % b'true', status_code=200)
ISWSRUNNING_FALSE = FakedResponse(content=get_xml_file('R_is_ws_running.xml') % b'false', status_code=200)
@ -120,6 +121,12 @@ def django_db_setup(django_db_setup, django_db_blocker):
)[0]
)
site_service = ResponsesSoap(
wsdl_url='https://example.org/SiteService?wsdl',
wsdl_content=get_xml_file('SiteService.wsdl'),
settings=Settings(strict=False, xsd_ignore_sequence_order=True),
)
family_service = ResponsesSoap(
wsdl_url='https://example.org/FamilyService?wsdl',
wsdl_content=get_xml_file('FamilyService.wsdl'),
@ -143,7 +150,10 @@ def django_db_setup(django_db_setup, django_db_blocker):
soap_mock.add_soap_response('readSituationList', get_xml_file('R_read_situation_list.xml'))
soap_mock.add_soap_response('readStreetList', get_xml_file('R_read_street_list.xml'))
soap_mock.add_soap_response('readVaccinList', get_xml_file('R_read_vaccin_list.xml'))
con.daily()
con.update_family_referentials()
with site_service() as site_mock:
site_mock.add_soap_response('readYearSchoolList', get_xml_file('R_read_year_school_list.xml'))
con.update_site_referentials()
# reset change in zeep private interface to bypass clear_cache fixture
from zeep.cache import InMemoryCache
@ -194,8 +204,8 @@ def test_call(family_service, con):
'get_responses, post_responses, exception',
[
(
[FAMILY_SERVICE_WSDL, ACTIVITY_SERVICE_WSDL, INVOICE_SERVICE_WSDL],
[ISWSRUNNING_TRUE, ISWSRUNNING_TRUE, ISWSRUNNING_TRUE],
[FAMILY_SERVICE_WSDL, ACTIVITY_SERVICE_WSDL, INVOICE_SERVICE_WSDL, SITE_SERVICE_WSDL],
[ISWSRUNNING_TRUE, ISWSRUNNING_TRUE, ISWSRUNNING_TRUE, ISWSRUNNING_TRUE],
None,
),
(
@ -259,7 +269,8 @@ def test_update_referential(mocked_get, con):
mocked_post.return_value = FakedResponse(
content=get_xml_file('R_read_category_list.xml'), status_code=200
)
con.update_referential('Category')
data = con.get_referential_data('Family', 'Category')
con.update_referential('Category', data, 'code', 'libelle')
assert [
(x.item_id, x.item_text) for x in Referential.objects.filter(referential_name='Category')
] == [('BI', 'BIPARENTALE'), ('ACCEUI', "FAMILLE D'ACCUEIL"), ('MONO', 'MONOPARENTALE')]
@ -268,7 +279,9 @@ def test_update_referential(mocked_get, con):
mocked_post.return_value = FakedResponse(
content=get_xml_file('R_read_category_list_2_items.xml'), status_code=200
)
con.update_referential('Category')
data = con.get_referential_data('Family', 'Category')
con.update_referential('Category', data, 'code', 'libelle')
assert [
(x.item_id, x.item_text) for x in Referential.objects.filter(referential_name='Category')
] == [('BI', 'BIPARENTALE'), ('ACCEUI', 'Famille acceuillante')]
@ -286,7 +299,8 @@ def test_update_referential(mocked_get, con):
mocked_post.return_value = FakedResponse(
content=get_xml_file('R_read_category_list.xml'), status_code=200
)
new_con.update_referential('Category')
data = new_con.get_referential_data('Family', 'Category')
new_con.update_referential('Category', data, 'code', 'libelle')
assert new_con.referential.filter(referential_name='Category').count() == 3
assert con.referential.filter(referential_name='Category').count() == 2
@ -311,6 +325,7 @@ def test_cron(db):
'Situation',
'Street',
'Vaccin',
'YearSchool',
]
@ -3623,3 +3638,30 @@ def test_get_rl1_direct_debit_order_soap_error(family_service, invoice_service,
resp = app.get(url + '?NameID=local', params=params)
assert resp.json['err'] == 'Invoice-getDirectDebitOrder-soap:Server'
assert resp.json['err_desc'] == "E520 : La REGIE CS [{0}] n''existe pas dans la base Maelis"
def test_read_school_year_list(con, app):
url = get_endpoint('read-school-years-list')
resp = app.get(url)
assert resp.json['err'] == 0
assert len(resp.json['data']) == 2
assert resp.json['data'] == [
{
'id': 2022,
'text': '2022',
'schoolYear': 2022,
'dateStartYearSchool': '2022-09-01T00:00:00+02:00',
'dateEndYearSchool': '2023-07-07T00:00:00+02:00',
'dateStartSubscribeSchool': '2022-04-01T00:00:00+02:00',
'dateEndSubscribeSchool': '2023-07-08T00:00:00+02:00',
},
{
'id': 2023,
'text': '2023',
'schoolYear': 2023,
'dateStartYearSchool': '2023-09-01T00:00:00+02:00',
'dateEndYearSchool': '2024-07-07T00:00:00+02:00',
'dateStartSubscribeSchool': '2022-12-01T00:00:00+01:00',
'dateEndSubscribeSchool': '2023-07-08T00:00:00+02:00',
},
]