diff --git a/passerelle/apps/litteralis/models.py b/passerelle/apps/litteralis/models.py index 75d72aca..1747b1f2 100644 --- a/passerelle/apps/litteralis/models.py +++ b/passerelle/apps/litteralis/models.py @@ -83,6 +83,23 @@ class Litteralis(BaseResource, HTTPResource): return resp.text + def _upload(self, url, post_data): + try: + file_byte_content = base64.b64decode(post_data['file']['content']) + except (TypeError, binascii.Error): + raise APIError("Can't decode file") + + files = { + 'file': (post_data['file']['filename'], file_byte_content, post_data['file']['content_type']) + } + return { + 'data': self._call( + url, + method='post', + files=files, + ) + } + @endpoint( name='demandes-recues', description=_('Create submission'), @@ -130,32 +147,35 @@ class Litteralis(BaseResource, HTTPResource): @endpoint( name='upload', - description=_('Upload file'), + description=_('Upload summary file'), perm='can_access', post={ 'request_body': { 'schema': { - 'application/json': schemas.UPLOAD, + 'application/json': schemas.UPLOAD_ANNEXES, } } }, ) def upload(self, request, post_data): - try: - file_byte_content = base64.b64decode(post_data['file']['content']) - except (TypeError, binascii.Error): - raise APIError("Can't decode file") + url = 'demandes-recues/%s/upload' % post_data['id_demande'] + return self._upload(url, post_data) - files = { - 'file': (post_data['file']['filename'], file_byte_content, post_data['file']['content_type']) - } - return { - 'data': self._call( - 'demandes-recues/%s/upload' % post_data['id_demande'], - method='post', - files=files, - ) - } + @endpoint( + name='annexes', + description=_('Upload appendix file'), + perm='can_access', + post={ + 'request_body': { + 'schema': { + 'application/json': schemas.UPLOAD_ANNEXES, + } + } + }, + ) + def annexes(self, request, post_data): + url = 'demandes-recues/%s/annexes' % post_data['id_demande'] + return self._upload(url, post_data) @endpoint( methods=['get'], diff --git a/passerelle/apps/litteralis/schemas.py b/passerelle/apps/litteralis/schemas.py index fef90666..67abfbe6 100644 --- a/passerelle/apps/litteralis/schemas.py +++ b/passerelle/apps/litteralis/schemas.py @@ -150,7 +150,7 @@ DEMANDES_RECUES = { 'unflatten': True, } -UPLOAD = { +UPLOAD_ANNEXES = { '$schema': 'http://json-schema.org/draft-04/schema#', 'type': 'object', 'additionalProperties': False, diff --git a/tests/test_litteralis.py b/tests/test_litteralis.py index 79bcc508..ed707def 100644 --- a/tests/test_litteralis.py +++ b/tests/test_litteralis.py @@ -126,6 +126,25 @@ def test_upload(app, connector): assert json_resp['data'] == '' +def test_annexes(app, connector): + params = { + 'file': { + 'filename': 'bla', + 'content': base64.b64encode(b'who what').decode(), + 'content_type': 'text/plain', + }, + 'id_demande': '1234', + } + with responses.RequestsMock() as rsps: + rsps.post('http://litteralis.invalid/demandes-recues/1234/annexes', status=200, body='') + resp = app.post_json('/litteralis/slug-litteralis/annexes', params=params) + assert len(rsps.calls) == 1 + assert rsps.calls[0].request.headers['Content-Type'].startswith('multipart/form-data') + json_resp = resp.json + assert json_resp['err'] == 0 + assert json_resp['data'] == '' + + def test_demandes_recues_reponses(app, connector): with responses.RequestsMock() as rsps: rsps.get('http://litteralis.invalid/demandes-recues/1234/reponses', status=200, json={'foo': 'bar'})