From 56651b4e79f4ead10a5138de9cbc4415a0f6ca98 Mon Sep 17 00:00:00 2001 From: Benjamin Dauvergne Date: Thu, 5 Nov 2020 11:59:15 +0100 Subject: [PATCH] misc: add parameter to declare schema of response body (#21774) --- passerelle/apps/api_particulier/models.py | 46 +++++++++++++++++++ .../templates/passerelle/manage/endpoint.html | 7 +++ passerelle/utils/api.py | 6 ++- tests/test_generic_endpoint.py | 7 +++ 4 files changed, 65 insertions(+), 1 deletion(-) diff --git a/passerelle/apps/api_particulier/models.py b/passerelle/apps/api_particulier/models.py index 2100a891..2b94c9fe 100644 --- a/passerelle/apps/api_particulier/models.py +++ b/passerelle/apps/api_particulier/models.py @@ -174,6 +174,52 @@ class APIParticulier(BaseResource): 'description': _('requesting user'), 'example_value': 'John Doe (agent)', }, + }, + json_schema_response={ + 'type': 'object', + 'required': ['err'], + 'properties': { + 'err': {'enum': [0, 1]}, + 'declarant1': { + 'type': 'object', + 'properties': { + 'nom': {'type': 'string'}, + 'nomNaissance': {'type': 'string'}, + 'prenoms': {'type': 'string'}, + 'dateNaissance': {'type': 'string'} + }, + }, + 'declarant2': { + 'type': 'object', + 'properties': { + 'nom': {'type': 'string'}, + 'nomNaissance': {'type': 'string'}, + 'prenoms': {'type': 'string'}, + 'dateNaissance': {'type': 'string'} + } + }, + 'foyerFiscal': { + 'type': 'object', + 'properties': { + 'annee': {'type': 'integer'}, + 'adresse': {'type': 'string'}, + } + }, + 'dateRecouvrement': {'type': 'string', 'pattern': r'^\d{1,2}/\d{1,2}/\d{4}$'}, + 'dateEtablissement': {'type': 'string', 'pattern': r'^\d{1,2}/\d{1,2}/\d{4}$'}, + 'nombreParts': {'type': 'integer'}, + 'situationFamille': {'type': 'string'}, + 'nombrePersonnesCharge': {'type': 'integer'}, + 'revenuBrutGlobal': {'type': 'integer'}, + 'revenuImposable': {'type': 'integer'}, + 'impotRevenuNetAvantCorrections': {'type': 'integer'}, + 'montantImpot': {'type': 'integer'}, + 'revenuFiscalReference': {'type': 'integer'}, + 'anneeImpots': {'type': 'string', 'pattern': r'^[0-9]{4}$'}, + 'anneeRevenus': {'type': 'string', 'pattern': r'^[0-9]{4}$'}, + 'erreurCorrectif': {'type': 'string'}, + 'situationPartielle': {'type': 'string'} + } }) def v2_avis_imposition(self, request, numero_fiscal, reference_avis, user=None): numero_fiscal = numero_fiscal.strip()[:13] diff --git a/passerelle/templates/passerelle/manage/endpoint.html b/passerelle/templates/passerelle/manage/endpoint.html index f9f9710a..7c897da3 100644 --- a/passerelle/templates/passerelle/manage/endpoint.html +++ b/passerelle/templates/passerelle/manage/endpoint.html @@ -24,6 +24,13 @@ {% endif %} + {% if endpoint.response_schemas %} +
  • {% trans "Response body" %} +
    + {% render_body_schemas body_schemas=endpoint.response_schemas %} +
    +
  • + {% endif %} {% if endpoint.long_description %}
    diff --git a/passerelle/utils/api.py b/passerelle/utils/api.py index 6e75a176..034bf4d7 100644 --- a/passerelle/utils/api.py +++ b/passerelle/utils/api.py @@ -46,7 +46,8 @@ class endpoint(object): show=True, show_undocumented_params=True, display_order=0, - display_category=''): + display_category='', + json_schema_response=None): self.perm = perm self.methods = methods self.serializer_type = serializer_type @@ -77,6 +78,9 @@ class endpoint(object): self.show_undocumented_params = show_undocumented_params self.display_order = display_order self.display_category = display_category + self.response_schemas = {} + if json_schema_response: + self.response_schemas['application/json'] = json_schema_response def __call__(self, func): func.endpoint_info = self diff --git a/tests/test_generic_endpoint.py b/tests/test_generic_endpoint.py index 58a102f7..63065965 100644 --- a/tests/test_generic_endpoint.py +++ b/tests/test_generic_endpoint.py @@ -32,6 +32,7 @@ from django.contrib.contenttypes.models import ContentType from django.core.urlresolvers import reverse from passerelle.apps.arcgis.models import ArcGIS +from passerelle.apps.api_particulier.models import APIParticulier from passerelle.base.models import ResourceLog, ProxyLogger, BaseResource, HTTPResource, LoggingParameters from passerelle.base.models import ResourceStatus from passerelle.apps.mdel.models import MDEL @@ -786,3 +787,9 @@ def test_generic_up_in_endpoints_ordering(db, app, connector_class, expected_ord connector.id = 42 assert ['%s%s' % (ep.name, ep.pattern or '') for ep in connector.get_endpoints_infos()] == expected_ordering + + +def test_response_schema(db, app): + utils.make_resource(APIParticulier, slug='test', platform='test', api_key='xxx') + response = app.get('/api-particulier/test/') + assert 'nombrePersonnesCharge' in response -- 2.29.1