toulouse_maelis: add medical record webservice (#69045)

This commit is contained in:
Nicolas Roche 2022-09-11 17:07:32 +02:00
parent 5b08c35515
commit d4e7d064c5
6 changed files with 129 additions and 3 deletions

View File

@ -828,6 +828,28 @@ class ToulouseMaelis(BaseResource, HTTPResource):
self.call('Family', 'createOrUpdateFSL', arg0=child_id, arg1=post_data)
return {'data': 'ok'}
@endpoint(
display_category='Famille',
description="Créer ou mettre à jour les données médicales d'un enfant",
name='update-child-medical-record',
perm='can_access',
parameters={
'NameID': {'description': 'Publik NameID'},
'child_id': {'description': "Numéro de l'enfant"},
},
post={'request_body': {'schema': {'application/json': schemas.MEDICALRECORD_SCHEMA}}},
)
def update_child_medical_record(self, request, NameID, child_id, post_data):
self.get_link(NameID)
self.replace_null_values(post_data)
payload = {
'numPerson': child_id,
'medicalRecord': post_data,
}
self.call('Family', 'updateChildMedicalRecord', updateChildMedicalRecordRequest=payload)
return {'data': 'ok'}
class Link(models.Model):
resource = models.ForeignKey(ToulouseMaelis, on_delete=models.CASCADE)

View File

@ -374,15 +374,15 @@ DOCTORADDRESS_SCHEMA = {
'properties': {
'street1': {
'description': 'Libellé de la voie',
'type': 'string',
'oneOf': [{'type': 'null'}, {'type': 'string'}],
},
'town': {
'description': 'Ville',
'type': 'string',
'oneOf': [{'type': 'null'}, {'type': 'string'}],
},
'zipcode': {
'description': 'Code postal',
'type': 'string',
'oneOf': [{'type': 'null'}, {'type': 'string'}],
},
},
}
@ -449,6 +449,7 @@ MEDICALRECORD_SCHEMA = {
},
},
],
'unflatten': True,
}
PAIINFO_SCHEMA = {

View File

@ -0,0 +1,36 @@
<soap-env:Envelope xmlns:soap-env="http://schemas.xmlsoap.org/soap/envelope/">
<soap-env:Header>
<wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
<wsse:UsernameToken>
<wsse:Username>maelis-webservice</wsse:Username>
<wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">maelis-password</wsse:Password>
</wsse:UsernameToken>
</wsse:Security>
</soap-env:Header>
<soap-env:Body>
<ns0:updateChildMedicalRecord xmlns:ns0="family.ws.maelis.sigec.com">
<updateChildMedicalRecordRequest>
<numPerson>613878</numPerson>
<medicalRecord>
<familyDoctor>
<name>Dre</name>
<phone>0612341234</phone>
<address>
<street1>Alameda</street1>
<zipcode>90220</zipcode>
<town>Compton</town>
</address>
</familyDoctor>
<vaccinList>
<code>DTC</code>
<vaccinationDate>2011-01-11</vaccinationDate>
</vaccinList>
<vaccinList>
<code>ROR</code>
<vaccinationDate>2022-02-22</vaccinationDate>
</vaccinList>
</medicalRecord>
</updateChildMedicalRecordRequest>
</ns0:updateChildMedicalRecord>
</soap-env:Body>
</soap-env:Envelope>

View File

@ -0,0 +1,5 @@
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<ns2:updateChildMedicalRecordResponse xmlns:ns2="family.ws.maelis.sigec.com"/>
</soap:Body>
</soap:Envelope>

View File

@ -0,0 +1,8 @@
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<soap:Fault>
<faultcode>soap:Client</faultcode>
<faultstring>Unmarshalling Error: "2012-02-31" ne représente pas une valeur de calendrier grégorien XML valide. </faultstring>
</soap:Fault>
</soap:Body>
</soap:Envelope>

View File

@ -72,6 +72,10 @@ UPDATE_PAI = FakedResponse(content=get_xml_file('R_update_child_pai.xml'), statu
UPDATE_PAI_500 = FakedResponse(content=get_xml_file('R_update_child_pai_soap_error.xml'), status_code=500)
UPDATE_FSL = FakedResponse(content=get_xml_file('R_update_child_fsl.xml'), status_code=200)
UPDATE_FSL_500 = FakedResponse(content=get_xml_file('R_update_child_fsl_soap_error.xml'), status_code=500)
UPDATE_MEDICAL = FakedResponse(content=get_xml_file('R_update_child_fsl.xml'), status_code=200)
UPDATE_MEDICAL_500 = FakedResponse(
content=get_xml_file('R_update_child_medical_record_soap_error.xml'), status_code=500
)
def assert_sent_payload(mocked_post, query_file):
@ -1979,3 +1983,53 @@ def test_update_child_fsl_soap_error(mocked_post, mocked_get, con, app):
assert 'Une erreur est survenue' in resp.json['err_desc']
assert 'valeur trop grande' in resp.json['err_desc']
assert 'maximum : 70' in resp.json['err_desc']
@mock.patch('passerelle.utils.Request.get')
@mock.patch('passerelle.utils.Request.post')
def test_update_child_medical_record(mocked_post, mocked_get, con, app):
mocked_get.return_value = FAMILY_SERVICE_WSDL
mocked_post.return_value = UPDATE_MEDICAL
url = get_endpoint('update-child-medical-record')
params = {
'familyDoctor/name': 'Dre',
'familyDoctor/phone': '0612341234',
'familyDoctor/address/street1': 'Alameda',
'familyDoctor/address/zipcode': '90220',
'familyDoctor/address/town': 'Compton',
'vaccinList/0/code': 'DTC',
'vaccinList/0/vaccinationDate': '2011-01-11',
'vaccinList/1/code': 'ROR',
'vaccinList/1/vaccinationDate': '2022-02-22',
}
Link.objects.create(resource=con, family_id='1312', name_id='local')
resp = app.post_json(url + '?NameID=local&child_id=613878', params=params)
assert_sent_payload(mocked_post, 'Q_update_child_medical_record.xml')
assert resp.json['err'] == 0
assert resp.json['data'] == 'ok'
def test_update_child_medical_record_not_linked_error(con, app):
url = get_endpoint('update-child-medical-record')
resp = app.post_json(url + '?NameID=local&child_id=613878', params={})
assert resp.json['err'] == 'not-linked'
assert resp.json['err_desc'] == 'User not linked to family'
@mock.patch('passerelle.utils.Request.get')
@mock.patch('passerelle.utils.Request.post')
def test_update_child_medical_record_soap_error(mocked_post, mocked_get, con, app):
mocked_get.return_value = FAMILY_SERVICE_WSDL
mocked_post.return_value = UPDATE_MEDICAL_500
url = get_endpoint('update-child-medical-record')
params = {
'vaccinList/0/vaccinationDate': '2022-02-31',
}
Link.objects.create(resource=con, family_id='1312', name_id='local')
resp = app.post_json(url + '?NameID=local&child_id=613878', params=params)
assert resp.json['err'] == 'Family-updateChildMedicalRecord-soap:Client'
assert 'Unmarshalling Error' in resp.json['err_desc']
assert 'pas une valeur de calendrier grégorien' in resp.json['err_desc']