diff --git a/functests/toulouse_axel/test_toulouse_axel.py b/functests/toulouse_axel/test_toulouse_axel.py
index e7c43f04..7c6e0971 100644
--- a/functests/toulouse_axel/test_toulouse_axel.py
+++ b/functests/toulouse_axel/test_toulouse_axel.py
@@ -3,6 +3,15 @@ import requests
def test_link(conn, user):
+ print("Get update management dates")
+ url = conn + '/update_management_dates'
+ resp = requests.get(url)
+ resp.raise_for_status()
+ res = resp.json()
+ assert res['err'] == 0
+ pprint.pprint(res)
+ print('\n')
+
name_id = user['name_id']
url = conn + '/link?NameID=%s' % name_id
payload = {
diff --git a/passerelle/contrib/toulouse_axel/models.py b/passerelle/contrib/toulouse_axel/models.py
index a3c002fb..2eedb105 100644
--- a/passerelle/contrib/toulouse_axel/models.py
+++ b/passerelle/contrib/toulouse_axel/models.py
@@ -172,7 +172,10 @@ class AxelError(Exception):
def xml_schema_converter(name, root_element):
- return AxelSchema(os.path.join(BASE_XSD_PATH, name), root_element)
+ xsd_path = os.path.join(BASE_XSD_PATH, name)
+ if not os.path.exists(xsd_path):
+ return None
+ return AxelSchema(xsd_path, root_element)
OperationResult = namedtuple('OperationResult', ['json_response', 'xml_request', 'xml_response'])
@@ -196,21 +199,23 @@ class Operation(object):
schema['merge_extra'] = True
return schema
- def __call__(self, resource, request_data):
+ def __call__(self, resource, request_data=None):
client = resource.soap_client()
- try:
- serialized_request = self.request_converter.encode(request_data)
- except xmlschema.XMLSchemaValidationError as e:
- raise AxelError('invalid request %s' % str(e))
- indent(serialized_request)
- serialized_request = ET.tostring(serialized_request)
- try:
- self.request_converter.xml_schema.validate(serialized_request)
- except xmlschema.XMLSchemaValidationError as e:
- raise AxelError(
- 'invalid request %s' % str(e),
- xml_request=serialized_request)
+ serialized_request = ''
+ if self.request_converter:
+ try:
+ serialized_request = self.request_converter.encode(request_data)
+ except xmlschema.XMLSchemaValidationError as e:
+ raise AxelError('invalid request %s' % str(e))
+ indent(serialized_request)
+ serialized_request = ET.tostring(serialized_request)
+ try:
+ self.request_converter.xml_schema.validate(serialized_request)
+ except xmlschema.XMLSchemaValidationError as e:
+ raise AxelError(
+ 'invalid request %s' % str(e),
+ xml_request=serialized_request)
result = client.service.getData(
self.operation,
@@ -240,6 +245,7 @@ class Operation(object):
xml_response=pretty_result)
+ref_date_gestion_dui = Operation('RefDateGestionDui')
ref_verif_dui = Operation('RefVerifDui')
ref_famille_dui = Operation('RefFamilleDui')
form_maj_famille_dui = Operation('FormMajFamilleDui')
@@ -402,6 +408,20 @@ class ToulouseAxel(BaseResource):
except Lock.DoesNotExist:
return {'key': key, 'locked': False}
+ @endpoint(
+ description=_("Get dates of the update management"),
+ perm='can_access')
+ def management_dates(self, request):
+ try:
+ result = ref_date_gestion_dui(self)
+ except AxelError as e:
+ raise APIError(
+ 'Axel error: %s' % e,
+ err_code='error',
+ data={'xml_request': e.xml_request,
+ 'xml_response': e.xml_response})
+ return {'data': result.json_response['DATA']['PORTAIL']['DUIDATEGESTION']}
+
@endpoint(
description=_('Create link between user and Toulouse Axel'),
perm='can_access',
diff --git a/passerelle/contrib/toulouse_axel/xsd/Dui/R_RefDateGestionDui.xsd b/passerelle/contrib/toulouse_axel/xsd/Dui/R_RefDateGestionDui.xsd
new file mode 100644
index 00000000..c591c2a8
--- /dev/null
+++ b/passerelle/contrib/toulouse_axel/xsd/Dui/R_RefDateGestionDui.xsd
@@ -0,0 +1,38 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/test_toulouse_axel.py b/tests/test_toulouse_axel.py
index 0cbf94ba..e46291ff 100644
--- a/tests/test_toulouse_axel.py
+++ b/tests/test_toulouse_axel.py
@@ -32,6 +32,7 @@ from passerelle.contrib.toulouse_axel.models import (
OperationResult,
ToulouseAxel,
form_maj_famille_dui,
+ ref_date_gestion_dui,
ref_famille_dui,
ref_facture_a_payer,
ref_facture_pdf,
@@ -238,6 +239,15 @@ def mock_getdata(content, operation):
yield
+@pytest.mark.parametrize('content', [
+ '',
+])
+def test_operation_ref_date_gestion_dui(resource, content):
+ with mock_getdata(content, 'RefDateGestionDui'):
+ with pytest.raises(AxelError):
+ ref_date_gestion_dui(resource)
+
+
@pytest.mark.parametrize('content', [
'',
'foo
',
@@ -317,6 +327,30 @@ def test_operation_ref_facture_pdf(resource, content):
})
+def test_management_dates_endpoint_axel_error(app, resource):
+ with mock.patch('passerelle.contrib.toulouse_axel.models.ref_date_gestion_dui') as operation:
+ operation.side_effect = AxelError('FooBar')
+ resp = app.get('/toulouse-axel/test/management_dates')
+ assert resp.json['err_desc'] == "Axel error: FooBar"
+ assert resp.json['err'] == 'error'
+ assert resp.json['data'] == {'xml_request': None, 'xml_response': None}
+
+
+def test_management_dates_endpoint(app, resource):
+ content = '''
+
+ 08/08/2019
+ 18/10/2019
+ 18/01/2020
+
+'''
+ with mock_getdata(content, 'RefDateGestionDui'):
+ resp = app.get('/toulouse-axel/test/management_dates')
+ assert set(resp.json.keys()) == set(['err', 'data'])
+ assert resp.json['err'] == 0
+ assert set(resp.json['data'].keys()) == set(['REPORT-REVENUS', 'EXTRACTION-FAMILLES', 'EXTRACTION-CAFPRO'])
+
+
def test_link_endpoint_nameid_empty(app, resource, link_params):
resp = app.post_json('/toulouse-axel/test/link?NameID=', params=link_params, status=400)
assert resp.json['err_desc'] == "NameID is empty"