solis_afi_mss: add an add-document endpoint (#58896)
This commit is contained in:
parent
7ebcbcf78e
commit
0513de51da
|
@ -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 |
|
@ -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']
|
||||
|
|
Loading…
Reference in New Issue