From e6af2f325e6beb090996aa7fd91ebb99d0c85a75 Mon Sep 17 00:00:00 2001 From: Josue Kouka Date: Mon, 7 Aug 2017 18:11:47 +0200 Subject: [PATCH 2/2] make MDEL CivilStatusMixin compliant (#16768) --- passerelle/contrib/mdel/models.py | 37 ++++++++++++++++---- passerelle/contrib/mdel/utils.py | 67 ++++++++++++++++++++++++++++++++++++ tests/data/mdel/payload_mariage.json | 51 +++++++++++++++++++++++++++ tests/test_mdel.py | 18 ++++++++-- 4 files changed, 164 insertions(+), 9 deletions(-) create mode 100644 tests/data/mdel/payload_mariage.json diff --git a/passerelle/contrib/mdel/models.py b/passerelle/contrib/mdel/models.py index ae095ee..ae85d48 100644 --- a/passerelle/contrib/mdel/models.py +++ b/passerelle/contrib/mdel/models.py @@ -17,6 +17,8 @@ import os import json +import logging +import warnings from dateutil.parser import parse as dateutil_parse @@ -30,7 +32,8 @@ from passerelle.utils.jsonresponse import APIError from . import mdel -from .utils import zipdir, get_file_content_from_zip +from .utils import (zipdir, get_file_content_from_zip, + format_to_leagcy) DEMAND_TYPES = ['ILE-LA', 'RCO-LA', 'AEC-LA'] @@ -90,6 +93,14 @@ class MDEL(CivilStatusMixin, BaseResource): """Create a demand """ formdata = json.loads(request.body) + + # check if payload is CivilStatusMixin compliant + if 'application_id' in formdata: + return super(MDEL, self).create(request, formdata) + + logging.captureWarnings(True) + warnings.warn("MDEL payload's format deprecated.") + extra = formdata.pop('extra', {}) fields = formdata.pop('fields', {}) @@ -124,12 +135,11 @@ class MDEL(CivilStatusMixin, BaseResource): return {'data': {'demand_id': demand.demand_id}} - @endpoint(perm='can_access') - def status(self, request, *args, **kwargs): - """Return demand's statutes + @endpoint(perm='can_access', pattern='(?P[\w-]*)') + def status(self, request, demand_id=None, *args, **kwargs): + """Return demand's status """ - demand_id = request.GET.get('demand_id', None) - if not demand_id: + if not demand_id and 'demand_id' not in request.GET: raise APIError('demand_id is required') demand = Demand.objects.get(demand_id=demand_id, resource=self) @@ -139,6 +149,21 @@ class MDEL(CivilStatusMixin, BaseResource): demand.save() return {'data': status} + def create_demand(self, request, payload, *args, **kwargs): + if payload['certificate_type'] in ('birth', 'mariage', 'death'): + demand_type = 'AEC-LA' + if 'application_city_inseecode' not in payload: + raise APIError('code_insee is required') + + demand, created = Demand.objects.get_or_create( + num=payload['application_id'], flow_type=demand_type, resource=self) + if not created: + demand.step += 1 + + payload = format_to_leagcy(payload) + demand.create_zip(payload) + return {'data': {'demand_id': demand.demand_id}} + @endpoint(perm='can_access') def applicants(self, request, without=''): return {'data': [item for item in APPLICANTS diff --git a/passerelle/contrib/mdel/utils.py b/passerelle/contrib/mdel/utils.py index 140def7..f3384ec 100644 --- a/passerelle/contrib/mdel/utils.py +++ b/passerelle/contrib/mdel/utils.py @@ -68,3 +68,70 @@ def get_file_content_from_zip(path, filename): """ with zipfile.ZipFile(path, 'r') as zipf: return zipf.read(filename) + + +# key mapping of civil status api keys and legacy keys + +LEGACY_KEYS_MAP = { + 'application_id': 'display_id', + 'application_date': 'receipt_time', + 'certificate_type': 'aec_nature_raw', + 'certificate_type_label': 'aec_nature', + 'document_type': 'aec_type_raw', + 'document_type_label': 'aec_type', + 'document_copies': 'nombre_exemplaires', + 'application_reason': 'motif_demande_raw', + 'application_reason_label': 'motif_demande', + 'application_city': 'ville', + 'application_city_inseecode': 'code_insee', + 'application_city_zipcode': 'code_postal', + 'event_date': 'date_acte', + 'applicant_title': 'demandeur_civilite', + 'applicant_lastname': 'demandeur_nom', + 'applicant_firstnames': 'demandeur_prenom', + 'applicant_status': 'qualite_demandeur_raw', + 'applicant_status_label': 'qualite_demandeur', + 'applicant_status': 'qualite_demandeur_raw', + 'applicant_address_complement': 'demandeur_adresse_batiment', + 'applicant_address_city': 'demandeur_adresse_ville', + 'applicant_address_street': 'demandeur_adresse_voie', + 'applicant_address_country': 'demandeur_adresse_pays_raw', + 'applicant_phone': 'demandeur_telephone', + 'applicant_email': 'demandeur_email', + 'concerned_title': 'titulaire_civilite', + 'concerned_lastname': 'titulaire_nom', + 'concerned_firstnames': 'titulaire_prenoms', + 'concerned_birthdate': 'titulaire_naiss_date', + 'concerned_birthcity': 'titulaire_naiss_ville', + 'concerned_birthcounty': 'titulaire_naiss_departement_raw', + 'concerned_birthcountry': 'titulaire_naiss_pays_raw', + 'concerned_citizenship': 'titulaire_nationalite_raw', + 'concerned_parent1_lastname': 'titulaire_pere_nom', + 'concerned_parent1_firstnames': 'titulaire_pere_prenoms', + 'concerned_parent2_lastname': 'titulaire_mere_nom', + 'concerned_parent2_firstnames': 'titulaire_mere_prenoms', + 'partner_title': 'titulaire2_civilite', + 'partner_lastname': 'titulaire2_nom', + 'partner_firstnames': 'titulaire2_prenoms', + 'partner_birthdate': 'titulaire2_naiss_date', + 'partner_birthcity': 'titulaire2_naiss_ville', + 'partner_birthcounty': 'titulaire2_naiss_departement_raw', + 'partner_birthcountry': 'titulaire2_naiss_pays_raw', + 'partner_citizenship': 'titulaire2_nationalite_raw', + 'partner_parent1_lastname': 'titulaire2_pere_nom', + 'partner_parent1_firstnames': 'titulaire2_pere_prenoms', + 'partner_parent2_lastname': 'titulaire2_mere_nom', + 'partner_parent2_firstnames': 'titulaire2_mere_prenoms', +} + + +def format_to_leagcy(data): + """ + """ + legacy_data = {} + + for key, legacy_key in LEGACY_KEYS_MAP.iteritems(): + if key in data: + legacy_data[legacy_key] = data[key] + + return legacy_data diff --git a/tests/data/mdel/payload_mariage.json b/tests/data/mdel/payload_mariage.json new file mode 100644 index 0000000..2be3633 --- /dev/null +++ b/tests/data/mdel/payload_mariage.json @@ -0,0 +1,51 @@ +{ + "applicant_address_city": "Vancouver", + "applicant_address_country": "CAN", + "applicant_address_street": "West 12th Avenue", + "applicant_address_street_number": "274", + "applicant_address_zipcode": "BC V5Y 1V4", + "applicant_firstnames": "Chelsea", + "applicant_lastname": "Whatever", + "applicant_email": "chelsea@whatever.com", + "applicant_phone": "0122334455", + "applicant_status": "Autre", + "applicant_status_label": "Sa soeur", + "applicant_title": "Madame", + "applicant_title_raw": "Madame", + "application_city": "Nancy", + "application_city_inseecode": "54395", + "application_city_zipcode": "54000", + "application_id": "16-1", + "application_time": "2016-10-20T15:17:05Z", + "application_zipcode": "54000", + "certificate_type": "mariage", + "certificate_type_label": "Acte de mariage", + "concerned_firstnames": "Josh", + "concerned_lastname": "Whatever", + "concerned_naiss_date": "1978-05-19", + "concerned_naiss_pays": "Coree", + "concerned_naiss_pays_raw": "PRK", + "concerned_nationalite_raw": "FRA", + "concerned_parent1_firstnames": "Fritz", + "concerned_parent1_lastname": "Whatever", + "concerned_parent2_firstnames": "Eloise", + "concerned_parent2_lastname": "Song", + "concerned_title": "Monsieur", + "concerned_title_raw": "Monsieur", + "document_copies": "3", + "document_type": "with-filiation", + "document_type_label": "Extrait avec filiation", + "event_date": "18/08/2008", + "partner_firstnames": "Sarah", + "partner_lastname": "Kokey", + "partner_naiss_date": "1980-03-12", + "partner_naiss_pays": "Senegal", + "partner_naiss_pays_raw": "SEN", + "partner_nationalite_raw": "FRA", + "partner_parent1_firstnames": "Pascal", + "partner_parent1_lastname": "Kokey", + "partner_parent2_firstnames": "Coudy", + "partner_parent2_lastname": "De", + "partner_title": "Madame", + "partner_title_raw": "MADAME" +} diff --git a/tests/test_mdel.py b/tests/test_mdel.py index b0c219a..ac1c1dc 100644 --- a/tests/test_mdel.py +++ b/tests/test_mdel.py @@ -51,7 +51,8 @@ def setup(db): json.loads(get_file_from_test_base_dir('formdata_aec_naiss.json')), json.loads(get_file_from_test_base_dir('formdata_aec_mariage.json')), json.loads(get_file_from_test_base_dir('formdata_aec_deces.json')), - ], ids=['naissance', 'mariage', 'deces']) + json.loads(get_file_from_test_base_dir('payload_mariage.json')), + ], ids=['naissance', 'mariage', 'deces', 'mariage_cvm']) def aec_payload(request): return request.param @@ -120,7 +121,9 @@ def test_create_rco_demand_type(app, setup): def test_create_aec_demand_type(app, setup, aec_payload): resp = app.post_json('/mdel/test/create', params=aec_payload, status=200) - if aec_payload['display_id'] == '15-4': + display_id = aec_payload['display_id'] if 'display_id' in aec_payload else aec_payload['application_id'] + + if display_id == '15-4': assert resp.json['data']['demand_id'] == '15-4-AEC-LA' doc = os.path.join(get_mdel_base_dir(), 'test', 'inputs', '15-4-AEC-LA--0', '15-4-AEC-LA-doc-.xml') @@ -162,7 +165,7 @@ def test_create_aec_demand_type(app, setup, aec_payload): assert root.find('DemandeActe/Titulaire/Filiation/Pere/Nom').text == 'Whatever' assert root.find('DemandeActe/Titulaire/Filiation/Pere/Prenoms').text == 'Fritz' - elif aec_payload['display_id'] == '16-1': + elif display_id == '16-1': assert resp.json['data']['demand_id'] == '16-1-AEC-LA' @@ -387,6 +390,15 @@ def test_get_status(app, setup): assert data['comment'] == 'Dossier accepté' assert Demand.objects.get(demand_id='102-2-AEC-LA').status == 'accepted' + # test status endpoint compliance with CivilStatusMixin + resp = app.get('/mdel/test/status/102-2-AEC-LA/', status=200) + data = resp.json['data'] + + assert data['closed'] is True + assert data['status'] == 'accepted' + assert data['comment'] == 'Dossier accepté' + assert Demand.objects.get(demand_id='102-2-AEC-LA').status == 'accepted' + def test_get_status_unknown_demand(app, setup): resp = app.get('/mdel/test/status', params={'demand_id': '1-14-ILE-LA'}, status=404) -- 2.11.0