solis_afi_mss: add an add-document endpoint (#58896)

This commit is contained in:
Nicolas Roche 2021-11-23 15:55:54 +01:00 committed by Thomas NOËL
parent 7ebcbcf78e
commit 0513de51da
3 changed files with 171 additions and 1 deletions

View File

@ -14,6 +14,7 @@
# 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/>.
import base64
from urllib.parse import urljoin
from django.db import models
@ -102,6 +103,36 @@ DEMAND_SCHEMA = {
}
DOCUMENT_SCHEMA = {
'$schema': 'http://json-schema.org/draft-04/schema#',
'type': 'object',
'properties': {
'codeGedDocument': {
'description': "Code du document dans le paramétrage GED",
},
'document': {
'type': 'object',
'properties': {
'filename': {
'description': "Nom du ficher",
'type': 'string',
},
'content_type': {
'description': "Type MIME",
'type': 'string',
},
'content': {
'description': "Contenu",
'type': 'string',
},
},
'required': ['filename', 'content_type', 'content'],
},
},
'required': ['codeGedDocument', 'document'],
}
class SolisAfiMss(BaseResource, HTTPResource):
base_url = models.CharField(
max_length=256,
@ -115,11 +146,13 @@ class SolisAfiMss(BaseResource, HTTPResource):
class Meta:
verbose_name = _('Solis (mss-afi)')
def request(self, uri, params=None, json=None):
def request(self, uri, params=None, json=None, files=None):
url = urljoin(self.base_url, uri)
headers = {'Accept': 'application/json'}
if json:
response = self.requests.post(url, json=json, headers=headers)
elif files:
response = self.requests.post(url, files=files, params=params, headers=headers)
else:
response = self.requests.get(url, params=params, headers=headers)
@ -357,3 +390,33 @@ class SolisAfiMss(BaseResource, HTTPResource):
post_data['individusConcernes'] = related_persons
response = self.request('afi/aide/deposer/', json=post_data)
return {'data': response}
@endpoint(
display_category=_('Allowance'),
display_order=3,
name='add-document',
perm='can_access',
methods=['post'],
description=_('Submit a document to the GED'),
parameters={
'email': {'description': _("Agent's email address"), 'optional': True},
'indexAideFinanciere': {'description': _("Allowance index"), 'optional': True},
},
post={'request_body': {'schema': {'application/json': DOCUMENT_SCHEMA}}},
)
def add_document(self, request, post_data, email=None, indexAideFinanciere=None):
params = {'codeGedDocument': post_data['codeGedDocument']}
if indexAideFinanciere:
params['typeIdMetierClassement'] = 'AIDEFINANCIERE'
params['idMetierClassement'] = indexAideFinanciere
elif email:
params['typeIdMetierClassement'] = 'INDIVIDU'
params['idMetierClassement'] = str(self.search_from_email(email)['index'])
else:
raise APIError("'email' or 'indexAideFinanciere' is a required property", http_status=400)
document = post_data['document']
content = base64.b64decode(document['content'])
files = {'document': (document['filename'], content, document['content_type'])}
response = self.request('ged/web/document/deposer', params=params, files=files)
return {'data': response}

Binary file not shown.

After

Width:  |  Height:  |  Size: 795 B

View File

@ -14,12 +14,14 @@
# 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/>.
import base64
import json
import os
import mock
import pytest
import utils
from django.utils.encoding import force_text
from passerelle.contrib.solis_afi_mss.models import SolisAfiMss
from passerelle.utils.jsonresponse import APIError
@ -40,6 +42,11 @@ def json_get_data(filename):
return json.dumps(json.load(fd))
def get_media_file(filename):
with open(os.path.join(TEST_BASE_DIR, "%s" % filename), 'rb') as desc:
return desc.read()
def response(status_code, content):
return utils.FakedResponse(content=content, status_code=status_code)
@ -681,3 +688,103 @@ def test_demand_help_error(mocked_post, mocked_get, app, connector, response1, r
resp = app.post_json(endpoint, params={}, status=400)
assert resp.json['err']
assert resp.json['err_desc'] == "missing parameters: 'email'."
@mock.patch('passerelle.utils.Request.get')
@mock.patch('passerelle.utils.Request.post')
def test_add_document(mocked_post, mocked_get, app, connector):
mocked_get.return_value = RECHERCHE_PAR_EMAIL_1
mocked_post.return_value = response(200, json.dumps({'toto': 'polp le poulpe'}))
endpoint = get_endpoint('add-document')
payload = {
'codeGedDocument': 9,
'document': {
'filename': '201x201.jpg',
'content_type': 'image/jpeg',
'content': force_text(base64.b64encode(get_media_file('201x201.jpg'))),
},
}
resp = app.post_json(endpoint + '?email=foo@dummy.org', params=payload)
assert mocked_post.mock_calls[0][2]['files']['document'][1] == get_media_file('201x201.jpg')
assert mocked_post.mock_calls[0][2]['params'] == {
'codeGedDocument': 9,
'typeIdMetierClassement': 'INDIVIDU',
'idMetierClassement': '389227',
}
assert not resp.json['err']
payload['codeGedDocument'] = 16
resp = app.post_json(endpoint + '?indexAideFinanciere=37191', params=payload)
assert mocked_post.mock_calls[1][2]['files']['document'][1] == get_media_file('201x201.jpg')
assert mocked_post.mock_calls[1][2]['params'] == {
'codeGedDocument': 16,
'typeIdMetierClassement': 'AIDEFINANCIERE',
'idMetierClassement': '37191',
}
assert not resp.json['err']
@mock.patch('passerelle.utils.Request.get')
def test_add_document_error(mocked_get, app, connector):
mocked_get.side_effect = [RECHERCHE_PAR_EMAIL_NONE]
endpoint = get_endpoint('add-document')
resp = app.post_json(endpoint + '?email=foo@dummy.org', params={}, status=400)
assert resp.json['err']
assert resp.json['err_desc'] == "'codeGedDocument' is a required property"
payload = {'codeGedDocument': 9}
resp = app.post_json(endpoint + '?email=foo@dummy.org', params=payload, status=400)
assert resp.json['err']
assert resp.json['err_desc'] == "'document' is a required property"
payload['document'] = 'plop'
resp = app.post_json(endpoint + '?email=foo@dummy.org', params=payload, status=400)
assert resp.json['err']
assert resp.json['err_desc'] == "document: 'plop' is not of type 'object'"
payload['document'] = {}
resp = app.post_json(endpoint + '?email=foo@dummy.org', params=payload, status=400)
assert resp.json['err']
assert resp.json['err_desc'] == "document: 'filename' is a required property"
payload['document'] = {'filename': 'foo.jpg', 'content_type': 'foo/bar', 'content': '42'}
resp = app.post_json(endpoint, params=payload, status=400)
assert resp.json['err']
assert resp.json['err_desc'] == "'email' or 'indexAideFinanciere' is a required property"
resp = app.post_json(endpoint + '?email=foo@dummy.org', params=payload)
assert resp.json['err']
assert resp.json['err_desc'] == "L'adresse mail n'appartient à aucun agent"
@mock.patch('passerelle.utils.Request.get')
@mock.patch('passerelle.utils.Request.post')
def test_add_document_wrong_code_ged(mocked_post, mocked_get, app, connector):
mocked_get.side_effect = [RECHERCHE_PAR_EMAIL_1]
mocked_post.side_effect = [
response(
500,
json.dumps(
{
"logref": "2ee75216-7bec-4040-9d91-c67565bc6f88",
"message": "Erreur non g\u00e9r\u00e9e par une application cliente: Le document n'existe pas",
}
),
)
]
endpoint = get_endpoint('add-document')
payload = {
'codeGedDocument': 42,
'document': {
'filename': '201x201.jpg',
'content_type': 'image/jpeg',
'content': force_text(base64.b64encode(get_media_file('201x201.jpg'))),
},
}
resp = app.post_json(endpoint + '?email=foo@dummy.org', params=payload)
assert resp.json['err']
assert "Le document n'existe pas" in resp.json['data']['json_content']['message']