Projet

Général

Profil

0001-mdel-order-xml-elements-35145.patch

Emmanuel Cazenave, 31 juillet 2019 19:58

Télécharger (65,8 ko)

Voir les différences:

Subject: [PATCH] mdel: order xml elements (#35145)

And handle a possible attribute in the root element.
 passerelle/contrib/mdel/mdel.py           | 220 +++++++++--------
 tests/data/mdel/ActeEtatCivil-V1.A.xsd    | 274 ++++++++++++++++++++++
 tests/data/mdel/ILE_v1.1.xsd              | 218 +++++++++++++++++
 tests/data/mdel/formdata.json             |   7 +-
 tests/data/mdel/formdata_aec_deces.json   |   1 -
 tests/data/mdel/formdata_aec_mariage.json |  13 +-
 tests/test_mdel.py                        |  30 ++-
 7 files changed, 658 insertions(+), 105 deletions(-)
 create mode 100644 tests/data/mdel/ActeEtatCivil-V1.A.xsd
 create mode 100644 tests/data/mdel/ILE_v1.1.xsd
passerelle/contrib/mdel/mdel.py
14 14
# You should have received a copy of the GNU Affero General Public License
15 15
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
16 16

  
17
import collections
17 18
import os
18 19
import base64
19 20
import datetime
......
256 257
            if self.mapping.get(key, None):
257 258
                elements[self.mapping[key]] = value
258 259

  
259
        root = ElementFactory(self.root_element)
260
        root = ElementFactory(self.root_element, **self.root_attributes)
260 261

  
261
        for key, value in elements.items():
262
            path = key.split('_')
263
            root.append(json_to_xml(path, value, root), allow_new=False)
262
        for key in self.mapping.values():
263
            if key in elements:
264
                value = elements[key]
265
                path = key.split('_')
266
                root.append(json_to_xml(path, value, root), allow_new=False)
264 267

  
265 268
        return root
266 269

  
267 270

  
268 271
class ILEData(Data):
269 272

  
270
    mapping = {
271
        'nom_famille': 'Inscription_Electeur_Noms_NomFamille',
272
        'nom_usage': 'Inscription_Electeur_Noms_NomUsage',
273
        'prenoms': 'Inscription_Electeur_Prenoms_Prenom',
274
        'date_naissance': 'Inscription_Electeur_DateDeNaissance',
275
        'lieunaiss_localite': 'Inscription_Electeur_LieuDeNaissance_Localite',
276
        'lieunaiss_division_territoriale': 'Inscription_Electeur_LieuDeNaissance_DivisionTerritoriale',
277
        'lieunaiss_code_postal': 'Inscription_Electeur_LieuDeNaissance_CodePostal',
278
        'lieunaiss_pays_raw': 'Inscription_Electeur_LieuDeNaissance_Pays',
279
        'sexe_raw': 'Inscription_Electeur_Sexe',
280
        'nationalite_raw': 'Inscription_Electeur_Nationalite',
281
        'adresse_num_voie': 'Inscription_Electeur_AdresseDeLElecteur_NumeroVoie',
282
        'adresse_type_voie': 'Inscription_Electeur_AdresseDeLElecteur_TypeVoie',
283
        'adresse_nom_voie': 'Inscription_Electeur_AdresseDeLElecteur_NomVoie',
284
        'adresse_complement': 'Inscription_Electeur_AdresseDeLElecteur_Complement',
285
        'adresse_code_postal': 'Inscription_Electeur_AdresseDeLElecteur_CodePostal',
286
        'adresse_localite': 'Inscription_Electeur_AdresseDeLElecteur_Localite',
287
        'adresse_division_territoriale': 'Inscription_Electeur_AdresseDeLElecteur_DivisionTerritoriale',
288
        'contact_uri': 'Inscription_Electeur_MethodeDeContact_URI',
289
        'contact_code': 'Inscription_Electeur_MethodeDeContact_CanalCode',
290
        'inscription_liste_type_raw': 'Inscription_TypeDeListe',
291
        'inscription_localite': 'CommuneDInscription_Localite',
292
        'inscription_division_territoriale': 'CommuneDInscription_DivisionTeritoriale',
293
        'insription_code_insee': 'CommuneDInscription_CodeInsee',
294
        'inscription_date': 'DateDInscription',
295
        'inscription_type': 'TypeDInscription',
296
        'anterieur_situation_raw': 'SituationElectoraleAnterieure_SituationDeLElecteur',
297
        'anterieur_consulat': 'SituationElectoraleAnterieure_ConsulatDePrecedenteInscription_AmbassadeOuPosteConsulaire',
298
        'anterieur_consulat_pays_raw': 'SituationElectoraleAnterieure_ConsulatDePrecedenteInscription_Pays',
299
        'anterieur_localite': 'SituationElectoraleAnterieure_CommuneDePrecedenteInscription_Localite',
300
        'anterieur_division_territoriale': 'SituationElectoraleAnterieure_CommuneDePrecedenteInscription_DivisionTerritoriale',
301
        'anterieur_ue_localite': 'SituationElectoraleAnterieure_PaysUeDerniereInscription_Localite',
302
        'anterieur_ue_division_territoriale': 'SituationElectoraleAnterieure_PaysUeDerniereInscription_DivisionTerritoriale',
303
        'anterieur_ue_localite_pays_raw': 'SituationElectoraleAnterieure_PaysUeDerniereInscription_Pays'
304
    }
273
    mapping = collections.OrderedDict([
274
        ('nom_famille', 'Inscription_Electeur_Noms_NomFamille'),
275
        ('nom_usage', 'Inscription_Electeur_Noms_NomUsage'),
276
        ('prenoms', 'Inscription_Electeur_Prenoms_Prenom'),
277
        ('date_naissance', 'Inscription_Electeur_DateDeNaissance'),
278
        ('lieunaiss_localite', 'Inscription_Electeur_LieuDeNaissance_Localite'),
279
        (
280
            'lieunaiss_division_territoriale',
281
            'Inscription_Electeur_LieuDeNaissance_DivisionTerritoriale'
282
        ),
283
        ('lieunaiss_code_postal', 'Inscription_Electeur_LieuDeNaissance_CodePostal'),
284
        ('lieunaiss_pays_raw', 'Inscription_Electeur_LieuDeNaissance_Pays'),
285
        ('sexe_raw', 'Inscription_Electeur_Sexe'),
286
        ('nationalite_raw', 'Inscription_Electeur_Nationalite'),
287
        ('adresse_complement', 'Inscription_Electeur_AdresseDeLElecteur_Complement'),
288
        ('adresse_num_voie', 'Inscription_Electeur_AdresseDeLElecteur_NumeroVoie'),
289
        ('adresse_type_voie', 'Inscription_Electeur_AdresseDeLElecteur_TypeVoie'),
290
        ('adresse_nom_voie', 'Inscription_Electeur_AdresseDeLElecteur_NomVoie'),
291
        ('adresse_code_postal', 'Inscription_Electeur_AdresseDeLElecteur_CodePostal'),
292
        ('adresse_localite', 'Inscription_Electeur_AdresseDeLElecteur_Localite'),
293
        (
294
            'adresse_division_territoriale',
295
            'Inscription_Electeur_AdresseDeLElecteur_DivisionTerritoriale'
296
        ),
297
        ('contact_code', 'Inscription_Electeur_MethodeDeContact_CanalCode'),
298
        ('contact_uri', 'Inscription_Electeur_MethodeDeContact_URI'),
299
        ('inscription_liste_type_raw', 'Inscription_TypeDeListe'),
300
        ('inscription_localite', 'Inscription_CommuneDInscription_Localite'),
301
        (
302
            'inscription_division_territoriale',
303
            'Inscription_CommuneDInscription_DivisionTerritoriale'),
304
        ('inscription_code_insee', 'Inscription_CommuneDInscription_CodeInsee'),
305
        ('inscription_date', 'DateDInscription'),
306
        ('inscription_type', 'TypeDInscription'),
307
        ('anterieur_situation_raw', 'SituationElectoraleAnterieure_SituationDeLElecteur'),
308
        (
309
            'anterieur_consulat',
310
            'SituationElectoraleAnterieure_ConsulatDePrecedenteInscription'
311
            '_AmbassadeOuPosteConsulaire'
312
        ),
313
        (
314
            'anterieur_consulat_pays_raw',
315
            'SituationElectoraleAnterieure_ConsulatDePrecedenteInscription_Pays'
316
        ),
317
        (
318
            'anterieur_localite',
319
            'SituationElectoraleAnterieure_CommuneDePrecedenteInscription_Localite'
320
        ),
321
        (
322
            'anterieur_ue_localite',
323
            'SituationElectoraleAnterieure_PaysUeDerniereInscription_Localite'
324
        ),
325
        (
326
            'anterieur_division_territoriale',
327
            'SituationElectoraleAnterieure_CommuneDePrecedenteInscription_DivisionTerritoriale'
328
        ),
329
        (
330
            'anterieur_ue_division_territoriale',
331
            'SituationElectoraleAnterieure_PaysUeDerniereInscription_DivisionTerritoriale'
332
        ),
333
        (
334
            'anterieur_ue_localite_pays_raw',
335
            'SituationElectoraleAnterieure_PaysUeDerniereInscription_Pays'
336
        )
337
    ])
305 338

  
306 339
    required = [
307 340
        'nom_famille',
......
323 356

  
324 357
    def __init__(self, demand_id, data):
325 358
        self.root_element = 'AvisDInscription'
326

  
359
        self.root_attributes = {}
327 360
        # only possible value : vol as 'Inscription Volontaire'
328 361
        data['inscription_type'] = 'vol'
329 362

  
......
332 365

  
333 366
class AECData(Data):
334 367

  
335
    mapping = {
336
        'aec_nature': 'DemandeActe_NatureActe_Libelle',
337
        'aec_nature_raw': 'DemandeActe_NatureActe_Code',
338
        'aec_type': 'DemandeActe_TypeActe_Libelle',
339
        'aec_type_raw': 'DemandeActe_TypeActe_Code',
340
        'code_insee': 'DemandeActe_LieuActe_CodeINSEE',
341
        'code_postal': 'DemandeActe_LieuActe_CodePostal',
342
        'demandeur_adresse_adresse': 'DemandeActe_Demandeur_AdresseEtrangere_Adresse',
343
        'demandeur_adresse_batiment': 'DemandeActe_Demandeur_AdresseFrancaise_Batiment',
344
        'demandeur_adresse_boite_postal': 'DemandeActe_Demandeur_AdresseFrancaise_BoitePostale',
345
        'demandeur_adresse_code_postal': 'DemandeActe_Demandeur_AdresseFrancaise_CodePostal',
346
        'demandeur_adresse_etage': 'DemandeActe_Demandeur_AdresseFrancaise_Etage',
347
        'demandeur_adresse_ville': 'DemandeActe_Demandeur_AdresseFrancaise_Ville',
348
        'demandeur_adresse_etrangere': 'DemandeActe_Demandeur_AdresseEtrangere_Adresse',
349
        'demandeur_adresse_etrangere_pays_raw': 'DemandeActe_Demandeur_AdresseEtrangere_Pays',
350
        'demandeur_adresse_voie': 'DemandeActe_Demandeur_AdresseFrancaise_Voie',
351
        'demandeur_civilite': 'DemandeActe_Demandeur_Civilite',
352
        'demandeur_email': 'DemandeActe_Demandeur_Courriel',
353
        'demandeur_nom': 'DemandeActe_Demandeur_Nom',
354
        'demandeur_prenom': 'DemandeActe_Demandeur_Prenom',
355
        'demandeur_telephone': 'DemandeActe_Demandeur_Telephone',
356
        'nombre_exemplaires': 'DemandeActe_NombreExemplaires',
357
        'motif_demande': 'DemandeActe_MotifDemande_Libelle',
358
        'motif_demande_raw': 'DemandeActe_MotifDemande_Commentaire',
359
        'qualite_demandeur': 'DemandeActe_Demandeur_QualiteDemandeur_Libelle',
360
        'qualite_demandeur_raw': 'DemandeActe_Demandeur_QualiteDemandeur_Code',
361
        'date_acte': 'DemandeActe_DateActe',
362
        'titulaire_civilite': 'DemandeActe_Titulaire_Civilite',
363
        'titulaire_mere_nom': 'DemandeActe_Titulaire_Filiation_Mere_Nom',
364
        'titulaire_mere_prenoms': 'DemandeActe_Titulaire_Filiation_Mere_Prenoms',
365
        'titulaire_naiss_date': 'DemandeActe_Titulaire_DateDeNaissance',
366
        'titulaire_naiss_departement_raw': 'DemandeActe_Titulaire_DepartementDeNaissance',
367
        'titulaire_nationalite_raw': 'DemandeActe_Titulaire_Nationalite',
368
        'titulaire_naiss_pays_raw': 'DemandeActe_Titulaire_PaysDeNaissance',
369
        'titulaire_naiss_ville': 'DemandeActe_Titulaire_LieuDeNaissance',
370
        'titulaire_nom': 'DemandeActe_Titulaire_NomNaissance',
371
        'titulaire_pere_nom': 'DemandeActe_Titulaire_Filiation_Pere_Nom',
372
        'titulaire_pere_prenoms': 'DemandeActe_Titulaire_Filiation_Pere_Prenoms',
373
        'titulaire_prenoms': 'DemandeActe_Titulaire_Prenoms',
374
        'titulaire2_civilite': 'DemandeActe_Titulaire2_Civilite',
375
        'titulaire2_mere_nom': 'DemandeActe_Titulaire2_Filiation_Mere_Nom',
376
        'titulaire2_mere_prenoms': 'DemandeActe_Titulaire2_Filiation_Mere_Prenoms',
377
        'titulaire2_naiss_date': 'DemandeActe_Titulaire2_DateDeNaissance',
378
        'titulaire2_naiss_departement_raw': 'DemandeActe_Titulaire2_DepartementDeNaissance',
379
        'titulaire2_nationalite_raw': 'DemandeActe_Titulaire2_Nationalite',
380
        'titulaire2_naiss_pays_raw': 'DemandeActe_Titulaire2_PaysDeNaissance',
381
        'titulaire2_naiss_ville': 'DemandeActe_Titulaire2_LieuDeNaissance',
382
        'titulaire2_nom': 'DemandeActe_Titulaire2_NomNaissance',
383
        'titulaire2_pere_nom': 'DemandeActe_Titulaire2_Filiation_Pere_Nom',
384
        'titulaire2_pere_prenoms': 'DemandeActe_Titulaire2_Filiation_Pere_Prenoms',
385
        'titulaire2_prenoms': 'DemandeActe_Titulaire2_Prenoms',
386
        'ville': 'DemandeActe_LieuActe_Ville'
387
    }
368
    mapping = collections.OrderedDict([
369
        ('aec_type_raw', 'DemandeActe_TypeActe_Code'),
370
        ('aec_type', 'DemandeActe_TypeActe_Libelle'),
371
        ('aec_nature_raw', 'DemandeActe_NatureActe_Code'),
372
        ('aec_nature', 'DemandeActe_NatureActe_Libelle'),
373
        ('date_acte', 'DemandeActe_DateActe'),
374
        ('code_postal', 'DemandeActe_LieuActe_CodePostal'),
375
        ('ville', 'DemandeActe_LieuActe_Ville'),
376
        ('code_insee', 'DemandeActe_LieuActe_CodeINSEE'),
377
        ('nombre_exemplaires', 'DemandeActe_NombreExemplaires'),
378
        ('motif_demande', 'DemandeActe_MotifDemande_Libelle'),
379
        ('motif_demande_raw', 'DemandeActe_MotifDemande_Commentaire'),
380
        ('qualite_demandeur_raw', 'DemandeActe_Demandeur_QualiteDemandeur_Code'),
381
        ('qualite_demandeur', 'DemandeActe_Demandeur_QualiteDemandeur_Libelle'),
382
        ('demandeur_civilite', 'DemandeActe_Demandeur_Civilite'),
383
        ('demandeur_nom', 'DemandeActe_Demandeur_Nom'),
384
        ('demandeur_prenom', 'DemandeActe_Demandeur_Prenom'),
385
        ('demandeur_adresse_etage', 'DemandeActe_Demandeur_AdresseFrancaise_Etage'),
386
        ('demandeur_adresse_batiment', 'DemandeActe_Demandeur_AdresseFrancaise_Batiment'),
387
        ('demandeur_adresse_voie', 'DemandeActe_Demandeur_AdresseFrancaise_Voie'),
388
        ('demandeur_adresse_boite_postal', 'DemandeActe_Demandeur_AdresseFrancaise_BoitePostale'),
389
        ('demandeur_adresse_code_postal', 'DemandeActe_Demandeur_AdresseFrancaise_CodePostal'),
390
        ('demandeur_adresse_ville', 'DemandeActe_Demandeur_AdresseFrancaise_Ville'),
391
        ('demandeur_adresse_adresse', 'DemandeActe_Demandeur_AdresseEtrangere_Adresse'),
392
        ('demandeur_adresse_etrangere', 'DemandeActe_Demandeur_AdresseEtrangere_Adresse'),
393
        ('demandeur_adresse_etrangere_pays_raw', 'DemandeActe_Demandeur_AdresseEtrangere_Pays'),
394
        ('demandeur_email', 'DemandeActe_Demandeur_Courriel'),
395
        ('demandeur_telephone', 'DemandeActe_Demandeur_Telephone'),
396
        ('titulaire_civilite', 'DemandeActe_Titulaire_Civilite'),
397
        ('titulaire_nom', 'DemandeActe_Titulaire_NomNaissance'),
398
        ('titulaire_prenoms', 'DemandeActe_Titulaire_Prenoms'),
399
        ('titulaire_pere_nom', 'DemandeActe_Titulaire_Filiation_Pere_Nom'),
400
        ('titulaire_pere_prenoms', 'DemandeActe_Titulaire_Filiation_Pere_Prenoms'),
401
        ('titulaire_mere_nom', 'DemandeActe_Titulaire_Filiation_Mere_Nom'),
402
        ('titulaire_mere_prenoms', 'DemandeActe_Titulaire_Filiation_Mere_Prenoms'),
403
        ('titulaire_naiss_date', 'DemandeActe_Titulaire_DateDeNaissance'),
404
        ('titulaire_naiss_ville', 'DemandeActe_Titulaire_LieuDeNaissance'),
405
        ('titulaire_naiss_departement_raw', 'DemandeActe_Titulaire_DepartementDeNaissance'),
406
        ('titulaire_naiss_pays_raw', 'DemandeActe_Titulaire_PaysDeNaissance'),
407
        ('titulaire_nationalite_raw', 'DemandeActe_Titulaire_Nationalite'),
408
        ('titulaire2_civilite', 'DemandeActe_Titulaire2_Civilite'),
409
        ('titulaire2_nom', 'DemandeActe_Titulaire2_NomNaissance'),
410
        ('titulaire2_prenoms', 'DemandeActe_Titulaire2_Prenoms'),
411
        ('titulaire2_pere_nom', 'DemandeActe_Titulaire2_Filiation_Pere_Nom'),
412
        ('titulaire2_pere_prenoms', 'DemandeActe_Titulaire2_Filiation_Pere_Prenoms'),
413
        ('titulaire2_mere_nom', 'DemandeActe_Titulaire2_Filiation_Mere_Nom'),
414
        ('titulaire2_mere_prenoms', 'DemandeActe_Titulaire2_Filiation_Mere_Prenoms'),
415
        ('titulaire2_naiss_date', 'DemandeActe_Titulaire2_DateDeNaissance'),
416
        ('titulaire2_naiss_ville', 'DemandeActe_Titulaire2_LieuDeNaissance'),
417
        ('titulaire2_naiss_departement_raw', 'DemandeActe_Titulaire2_DepartementDeNaissance'),
418
        ('titulaire2_naiss_pays_raw', 'DemandeActe_Titulaire2_PaysDeNaissance'),
419
        ('titulaire2_nationalite_raw', 'DemandeActe_Titulaire2_Nationalite'),
420
    ])
388 421

  
389 422
    required = [
390 423
        'aec_nature',
......
413 446

  
414 447
    def __init__(self, demand_id, data):
415 448
        self.root_element = 'EnveloppeMetierType'
449
        self.root_attributes = {'canal_utilise': '0'}
416 450

  
417 451
        super(AECData, self).__init__(demand_id, data)
418 452

  
tests/data/mdel/ActeEtatCivil-V1.A.xsd
1
<?xml version="1.0" encoding="UTF-8"?>
2
<!-- Date de création : 18/03/13 
3
	Nom de l'organisme : Bull Echirolles 
4
	Nom	de l'auteur : Reynaud Angélique 
5
	Numéro de version : 0.1 
6
	Historique des modifications (pour chaque modification :) 
7
		- Date de mise à jour :26/03/2013	
8
		- Nom de l'organisme : Bull Echirolles
9
		- Nom de l'auteur : Angélique Reynaud
10
		- Numéro de version : 1.0
11
		- Description : Mis à jour du document suite à l'atelier et aux échanges de mails
12
			Ajout des balises : LieuActe , DateActe , AdresseEtrangere dans DemandeurType, Civilite dans DemandeurType et IndividuType , Titulaire2
13
			Suppression de LieuActe et DateActe dans IndividuType
14
			Declaration des type complexe : LieuActeType, CiviliteType, AdresseEtrangereType
15
			
16
		- Date de mise à jour :15/04/2013	
17
		- Nom de l'organisme : Bull Echirolles
18
		- Nom de l'auteur : Maxime PASQUIER
19
		- Numéro de version : 1.A
20
		- Description : Mise en conformité du schema avec la norme XSD pour SmartGuide Designer
21
		
22
		- Date de mise à jour :16/04/2013	
23
		- Nom de l'organisme : Bull Echirolles
24
		- Nom de l'auteur : Maxime PASQUIER
25
		- Numéro de version : 1.B
26
		- Description : Suite au mail du 15/04/13,
27
			Ajout des champs ; Date de naissance ; Lieu de naissance ; Département de naissance ; Pays de naissance ; Nationalité
28
			pour une demande d'acte de mariage ou de décès pour les personnes concernées.
29
			Pas d'éclatement de l'adresse française.
30
			
31
		- Date de mise à jour :28/05/2013	
32
		- Nom de l'organisme : Bull Echirolles
33
		- Nom de l'auteur : Maxime PASQUIER
34
		- Numéro de version : 1.C
35
		- Description : Suite aux mantis 7560 et 7635
36
			Correction du nom de la balise <Nationnalite> en <Nationalite>
37
			Ajout des listes de valeur pour les balises <NatureActe>, <MotifDemande> et <QualiteDemandeur>
38
			Ajout de l'information minOccurs=0 sur les balises <Telephone>, <Pere>, <Mere>, <LieuDeNaissance>, <DepartementDeNaissance>, <PaysDeNaissance> et <Nationalite>
39
-->
40

  
41
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
42
	<xsd:element name="EnveloppeMetierType">
43
		<xsd:annotation>
44
			<xsd:documentation>
45
				Le type des enveloppes metier possible
46
			</xsd:documentation>
47
		</xsd:annotation>
48
		<xsd:complexType>
49
			<xsd:sequence>
50
				<xsd:choice>
51
					<xsd:element name="DemandeActe" type="DemandeActeType">
52
						<xsd:annotation>
53
							<xsd:documentation>
54
								Ceci concerne la demande d'acte d'etat civil global (naissance,
55
								mariage, deces)
56
							</xsd:documentation>
57
						</xsd:annotation>
58
					</xsd:element>
59
				</xsd:choice>
60
			</xsd:sequence>
61
			<xsd:attribute name="canal_utilise" type="xsd:string" use="required" />
62
		</xsd:complexType>
63
	</xsd:element>
64
	
65
	<xsd:complexType name="DemandeActeType">
66
		<xsd:annotation>
67
			<xsd:documentation>
68
				Informations decrivant une demande d'acte
69
			</xsd:documentation>
70
		</xsd:annotation>
71
		<xsd:sequence>
72
			<xsd:element name="TypeActe" type="TypeActeType">
73
				<xsd:annotation>
74
					<xsd:documentation>
75
						Type d'acte: NAISSANCE, MARIAGE, DECES
76
					</xsd:documentation>
77
				</xsd:annotation>
78
			</xsd:element>
79
			<xsd:element name="NatureActe" type="NatureActeType">
80
				<xsd:annotation>
81
					<xsd:documentation>
82
						Nautre de l'acte: COPIE-INTEGRALE, EXTRAIT-AVEC-FILIATION, EXTRAIT-SANS-FILIATION, EXTRAIT-PLURILINGUE
83
					</xsd:documentation>
84
				</xsd:annotation>
85
			</xsd:element>
86
			<xsd:element name="DateActe" type="xsd:date" >
87
				<xsd:annotation>
88
					<xsd:documentation>
89
						Date de l'acte : date de naissance ou date du mariage ou date du décès
90
					</xsd:documentation>
91
				</xsd:annotation>
92
			</xsd:element>
93
			<xsd:element name="LieuActe" type="LieuActeType">
94
				<xsd:annotation>
95
					<xsd:documentation>
96
						Lieu de l'acte : lieu de naissance ou lieu de la cérémonie du mariage ou lieu du décès
97
					</xsd:documentation>
98
				</xsd:annotation>
99
			</xsd:element>			
100
			<xsd:element name="NombreExemplaires">
101
				<xsd:simpleType>
102
					<xsd:restriction base="xsd:integer">
103
						<xsd:minInclusive value="1" />
104
					</xsd:restriction>
105
				</xsd:simpleType>
106
			</xsd:element>
107
			<xsd:element name="MotifDemande" type="MotifDemandeType">
108
				<xsd:annotation>
109
					<xsd:documentation>
110
						Motif de la demande : CarteNationaleIdentite, Passeport, CertificatDeNationaliteFrancaise, Mariage, Pension, ProcedureJudiciaire, PacteCivilDeSolidarite, ActeDeNotaire, Autre
111
					</xsd:documentation>
112
				</xsd:annotation>
113
			</xsd:element>
114
			<xsd:element name="Demandeur" type="DemandeurType" />
115
			<xsd:element name="Titulaire" type="IndividuType"/>
116
			<xsd:element name="Titulaire2" type="IndividuType" minOccurs="0" />
117
		</xsd:sequence>
118
	</xsd:complexType>
119
	
120
	
121
	<xsd:simpleType name="NomType">
122
		<xsd:annotation>
123
			<xsd:documentation>
124
				Type des elements de nom Etat Civil
125
			</xsd:documentation>
126
		</xsd:annotation>
127
		<xsd:restriction base="xsd:string" />
128
	</xsd:simpleType>
129
	
130
	<xsd:complexType name="ParentType">
131
		<xsd:annotation>
132
			<xsd:documentation>
133
				Information concernant un parent d'un individu
134
			</xsd:documentation>
135
		</xsd:annotation>
136
		<xsd:sequence>
137
			<xsd:element name="Nom" type="NomType" minOccurs="0" />
138
			<xsd:element name="Prenoms" type="NomType" minOccurs="0" />
139
		</xsd:sequence>
140
	</xsd:complexType>
141
	<xsd:complexType name="FiliationType">
142
		<xsd:sequence>
143
			<xsd:element name="Pere" type="ParentType" minOccurs="0" />
144
			<xsd:element name="Mere" type="ParentType" minOccurs="0" />
145
		</xsd:sequence>
146
	</xsd:complexType>
147
	
148
	<xsd:complexType name="AdressePostaleFrancaiseType" mixed="true">
149
		<xsd:annotation>
150
			<xsd:documentation>L'adresse</xsd:documentation>
151
		</xsd:annotation>
152
		<xsd:sequence>			
153
			<xsd:element name="Etage" type="xsd:string" minOccurs="0"/>
154
			<xsd:element name="Batiment" type="xsd:string" minOccurs="0"/>
155
			<xsd:element name="Voie" type="xsd:string" />
156
			<xsd:element name="BoitePostale" type="xsd:string" minOccurs="0"/>
157
			<xsd:element name="CodePostal" type="xsd:string" />
158
			<xsd:element name="Ville" type="xsd:string" />	
159
		</xsd:sequence>
160
	</xsd:complexType>
161
	
162
	<xsd:complexType name="QualiteDemandeurType">
163
		<xsd:sequence>
164
			<xsd:element name="Code" type="xsd:string" />
165
			<xsd:element name="Libelle" type="xsd:string" />
166
		</xsd:sequence>
167
	</xsd:complexType>
168
	<xsd:complexType name="MotifDemandeType">
169
		<xsd:sequence>
170
			<xsd:element name="Libelle" type="xsd:string" />
171
			<xsd:element name="Commentaire" type="xsd:string" />
172
		</xsd:sequence>
173
	</xsd:complexType>
174
	<xsd:complexType name="TypeActeType">
175
		<xsd:sequence>
176
			<xsd:element name="Code">
177
				<xsd:simpleType>
178
					<xsd:restriction base="xsd:string">
179
						<xsd:enumeration value="NAISSANCE" />
180
						<xsd:enumeration value="MARIAGE" />
181
						<xsd:enumeration value="DECES" />
182
					</xsd:restriction>
183
				</xsd:simpleType>
184
			</xsd:element>
185
			<xsd:element name="Libelle" type="xsd:string" />
186
		</xsd:sequence>
187
	</xsd:complexType>
188
	<xsd:complexType name="NatureActeType">
189
		<xsd:sequence>
190
			<xsd:element name="Code">
191
				<xsd:simpleType>
192
					<xsd:restriction base="xsd:string">
193
						<xsd:enumeration value="COPIE-INTEGRALE" />
194
						<xsd:enumeration value="EXTRAIT-AVEC-FILIATION" />
195
						<xsd:enumeration value="EXTRAIT-SANS-FILIATION" />
196
						<xsd:enumeration value="EXTRAIT-PLURILINGUE" />
197
					</xsd:restriction>
198
				</xsd:simpleType>
199
			</xsd:element>
200
			<xsd:element name="Libelle" type="xsd:string" />
201
		</xsd:sequence>
202
	</xsd:complexType>
203
	
204
	<xsd:complexType name="IndividuType">
205
		<xsd:annotation>
206
			<xsd:documentation>
207
				Informations caracterisant un individu
208
			</xsd:documentation>
209
		</xsd:annotation>
210
		<xsd:sequence>
211
			<xsd:element name="Civilite" type="CiviliteType" />
212
			<xsd:element name="NomNaissance" type="NomType" />
213
			<xsd:element name="Prenoms" type="NomType" />
214
			<xsd:element name="Filiation" type="FiliationType" minOccurs="0" />
215
			<xsd:element name="DateDeNaissance" type="xsd:date" />
216
			<xsd:element name="LieuDeNaissance" type="xsd:string" minOccurs="0" />
217
			<xsd:element name="DepartementDeNaissance" type="xsd:string" minOccurs="0" />
218
			<xsd:element name="PaysDeNaissance" type="xsd:string" minOccurs="0" />
219
			<xsd:element name="Nationalite" type="xsd:string" minOccurs="0" />
220
		</xsd:sequence>
221
	</xsd:complexType>
222
	
223
	<xsd:complexType name="DemandeurType">
224
		<xsd:annotation>
225
			<xsd:documentation>
226
				Informations caracterisant le demandeur de l'acte
227
			</xsd:documentation>
228
		</xsd:annotation>
229
		<xsd:sequence>
230
			<xsd:element name="QualiteDemandeur" type="QualiteDemandeurType" minOccurs="0">
231
				<xsd:annotation>
232
					<xsd:documentation>
233
						Motif de la demande : PersonneConcernee, PereMere, Conjoint, Fils, GrandPere, PetitFils, Representant, Heriter, Autre
234
					</xsd:documentation>
235
				</xsd:annotation>
236
			</xsd:element>
237
			<xsd:element name="Civilite" type="CiviliteType" />
238
			<xsd:element name="Nom" type="NomType" />
239
			<xsd:element name="Prenom" type="NomType" />
240
			<xsd:choice>
241
				<xsd:element name="AdresseFrancaise" type="AdressePostaleFrancaiseType" />
242
				<xsd:element name="AdresseEtrangere" type="AdresseEtrangereType" />
243
			</xsd:choice>
244
			<xsd:element name="Courriel" type="xsd:string" />
245
			<xsd:element name="Telephone" type="xsd:string" minOccurs="0" />
246
		</xsd:sequence>
247
	</xsd:complexType>
248
	<xsd:complexType name="LieuActeType">
249
		<xsd:annotation>
250
			<xsd:documentation>
251
				Informations sur le lieu de l'acte
252
			</xsd:documentation>
253
		</xsd:annotation>
254
		<xsd:sequence>
255
			<xsd:element name="BoitePostale-LieuDit" type="xsd:string" minOccurs="0"/>
256
			<xsd:element name="CodePostal" type="xsd:string" />
257
			<xsd:element name="Ville" type="xsd:string" />
258
			<xsd:element name="CodeINSEE" type="xsd:string" />
259
		</xsd:sequence>
260
	</xsd:complexType>
261
	<xsd:simpleType name="CiviliteType">
262
		<xsd:restriction base="xsd:string">
263
			<xsd:enumeration value="MONSIEUR"/>
264
			<xsd:enumeration value="MADAME"/>
265
		</xsd:restriction>
266
	</xsd:simpleType>	
267
	<xsd:complexType name="AdresseEtrangereType">
268
		<xsd:sequence>
269
			<xsd:element name="Adresse" type="xsd:string" />
270
			<xsd:element name="Pays" type="xsd:string" />
271
		</xsd:sequence>
272
	</xsd:complexType>	
273
	
274
</xsd:schema>
tests/data/mdel/ILE_v1.1.xsd
1
<?xml version="1.0" encoding="UTF-8"?>
2
<!-- edited with XMLSpy v2009 sp1 (http://www.altova.com) by Jean.dupont (EMBRACE) -->
3
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
4
  <xs:element name="AvisDInscription">
5
    <xs:complexType>
6
      <xs:sequence>
7
        <xs:element name="Inscription" minOccurs="1">
8
          <xs:complexType>
9
            <xs:sequence>
10
              <xs:element name="Electeur" minOccurs="1">
11
                <xs:complexType>
12
                  <xs:sequence>
13
                    <xs:element name="Noms" minOccurs="1">
14
                      <xs:complexType>
15
                        <xs:sequence>
16
                          <xs:element name="NomFamille">
17
                            <xs:simpleType>
18
                              <xs:restriction base="xs:string">
19
                                <xs:minLength value="1"/>
20
                              </xs:restriction>
21
                            </xs:simpleType>
22
                          </xs:element>
23
                          <xs:element name="NomUsage" type="xs:string" minOccurs="0"/>
24
                        </xs:sequence>
25
                      </xs:complexType>
26
                    </xs:element>
27
                    <xs:element name="Prenoms" minOccurs="0">
28
                      <xs:complexType>
29
                        <xs:sequence>
30
                          <xs:element name="Prenom" type="xs:string" maxOccurs="unbounded"/>
31
                        </xs:sequence>
32
                      </xs:complexType>
33
                    </xs:element>
34
                    <xs:element name="DateDeNaissance">
35
                      <xs:simpleType>
36
                        <xs:restriction base="xs:string">
37
                          <xs:minLength value="1"/>
38
                        </xs:restriction>
39
                      </xs:simpleType>
40
                    </xs:element>
41
                    <xs:element name="LieuDeNaissance" minOccurs="1">
42
                      <xs:complexType>
43
                        <xs:sequence>
44
                          <xs:element name="Localite">
45
                            <xs:simpleType>
46
                              <xs:restriction base="xs:string">
47
                                <xs:minLength value="1"/>
48
                              </xs:restriction>
49
                            </xs:simpleType>
50
                          </xs:element>
51
                          <xs:element name="DivisionTerritoriale" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
52
                          <xs:element name="CodePostal" type="xs:string" minOccurs="0"/>
53
                          <xs:element name="Subdivision" type="xs:string" minOccurs="0"/>
54
                          <xs:element name="Pays">
55
                            <xs:simpleType>
56
                              <xs:restriction base="xs:string">
57
                                <xs:minLength value="1"/>
58
                              </xs:restriction>
59
                            </xs:simpleType>
60
                          </xs:element>
61
                        </xs:sequence>
62
                      </xs:complexType>
63
                    </xs:element>
64
                    <xs:element name="Sexe">
65
                      <xs:simpleType>
66
                        <xs:restriction base="xs:string">
67
                          <xs:minLength value="1"/>
68
                        </xs:restriction>
69
                      </xs:simpleType>
70
                    </xs:element>
71
                    <xs:element name="Nationalite">
72
                      <xs:simpleType>
73
                        <xs:restriction base="xs:string">
74
                          <xs:minLength value="1"/>
75
                        </xs:restriction>
76
                      </xs:simpleType>
77
                    </xs:element>
78
                    <xs:element name="AdresseDeLElecteur" minOccurs="0">
79
                      <xs:complexType>
80
                        <xs:sequence>
81
                          <xs:element name="PointDeRemise" type="xs:string" minOccurs="0"/>
82
                          <xs:element name="Complement" type="xs:string" minOccurs="0"/>
83
                          <xs:element name="NumeroVoie" type="xs:string" minOccurs="0"/>
84
                          <xs:element name="Extension" type="xs:string" minOccurs="0"/>
85
                          <xs:element name="TypeVoie">
86
                            <xs:simpleType>
87
                              <xs:restriction base="xs:string">
88
                                <xs:minLength value="1"/>
89
                              </xs:restriction>
90
                            </xs:simpleType>
91
                          </xs:element>
92
                          <xs:element name="NomVoie">
93
                            <xs:simpleType>
94
                              <xs:restriction base="xs:string">
95
                                <xs:minLength value="1"/>
96
                              </xs:restriction>
97
                            </xs:simpleType>
98
                          </xs:element>
99
                          <xs:element name="LieuDit" type="xs:string" minOccurs="0"/>
100
                          <xs:element name="CodePostal">
101
                            <xs:simpleType>
102
                              <xs:restriction base="xs:string">
103
                                <xs:length value="5"/>
104
                              </xs:restriction>
105
                            </xs:simpleType>
106
                          </xs:element>
107
                          <xs:element name="Localite">
108
                            <xs:simpleType>
109
                              <xs:restriction base="xs:string">
110
                                <xs:minLength value="1"/>
111
                              </xs:restriction>
112
                            </xs:simpleType>
113
                          </xs:element>
114
                          <xs:element name="DivisionTerritoriale" type="xs:string" minOccurs="0"/>
115
                        </xs:sequence>
116
                      </xs:complexType>
117
                    </xs:element>
118
                    <xs:element name="MethodeDeContact" minOccurs="0" maxOccurs="unbounded">
119
                      <xs:complexType>
120
                        <xs:sequence>
121
                          <xs:element name="CanalCode" type="xs:string" minOccurs="0"/>
122
                          <xs:element name="URI" type="xs:string" minOccurs="0"/>
123
                        </xs:sequence>
124
                      </xs:complexType>
125
                    </xs:element>
126
                  </xs:sequence>
127
                </xs:complexType>
128
              </xs:element>
129
              <xs:element name="TypeDeListe" type="xs:string" minOccurs="0"/>
130
              <xs:element name="CommuneDInscription" minOccurs="1">
131
                <xs:complexType>
132
                  <xs:sequence>
133
                    <xs:element name="Localite">
134
                      <xs:simpleType>
135
                        <xs:restriction base="xs:string">
136
                          <xs:minLength value="1"/>
137
                        </xs:restriction>
138
                      </xs:simpleType>
139
                    </xs:element>
140
                    <xs:element name="DivisionTerritoriale">
141
                      <xs:simpleType>
142
                        <xs:restriction base="xs:string">
143
                          <xs:minLength value="1"/>
144
                        </xs:restriction>
145
                      </xs:simpleType>
146
                    </xs:element>
147
                    <xs:element name="CodeInsee">
148
                      <xs:simpleType>
149
                        <xs:restriction base="xs:string">
150
                          <xs:length value="5"/>
151
                        </xs:restriction>
152
                      </xs:simpleType>
153
                    </xs:element>
154
                  </xs:sequence>
155
                </xs:complexType>
156
              </xs:element>
157
            </xs:sequence>
158
          </xs:complexType>
159
        </xs:element>
160
        <xs:element name="DateDInscription" type="xs:string" minOccurs="0">
161
          <xs:annotation>
162
            <xs:documentation>Date de réception de la demande en mairie</xs:documentation>
163
          </xs:annotation>
164
        </xs:element>
165
        <xs:element name="TypeDInscription" type="xs:string" minOccurs="0">
166
          <xs:annotation>
167
            <xs:documentation>Décrit le type d'inscription de l'électeur. Ex: vol pour volontaire …</xs:documentation>
168
          </xs:annotation>
169
        </xs:element>
170
        <xs:element name="SituationElectoraleAnterieure" minOccurs="0">
171
          <xs:annotation>
172
            <xs:documentation>Décrit la situation antérieure de l'électeur (prem: première inscription, cci: réinscription ...)</xs:documentation>
173
          </xs:annotation>
174
          <xs:complexType>
175
            <xs:sequence>
176
              <xs:element name="SituationDeLElecteur">
177
                <xs:annotation>
178
                  <xs:documentation>1ère inscription dans une commune française=prem, changement de commune d'inscription=cci. 
179
Les déménagements à l'intérieur d'une même commune ou d'un même arrondissement pour Paris, Lyon et Marseille ne doivent pas être transmis à l'Insee</xs:documentation>
180
                </xs:annotation>
181
                <xs:simpleType>
182
                  <xs:restriction base="xs:string">
183
                    <xs:minLength value="1"/>
184
                  </xs:restriction>
185
                </xs:simpleType>
186
              </xs:element>
187
              <xs:element name="ConsulatDePrecedenteInscription" minOccurs="0">
188
                <xs:complexType>
189
                  <xs:sequence>
190
                    <xs:element name="AmbassadeOuPosteConsulaire" type="xs:string" minOccurs="0"/>
191
                    <xs:element name="Pays" type="xs:string" minOccurs="0"/>
192
                  </xs:sequence>
193
                </xs:complexType>
194
              </xs:element>
195
              <xs:element name="CommuneDePrecedenteInscription" minOccurs="0">
196
                <xs:complexType>
197
                  <xs:sequence>
198
                    <xs:element name="Localite" type="xs:string" minOccurs="0"/>
199
                    <xs:element name="DivisionTerritoriale" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
200
                  </xs:sequence>
201
                </xs:complexType>
202
              </xs:element>
203
              <xs:element name="PaysUeDerniereInscription" minOccurs="0">
204
                <xs:complexType>
205
                  <xs:sequence>
206
                    <xs:element name="Localite" type="xs:string" minOccurs="0"/>
207
                    <xs:element name="DivisionTerritoriale" type="xs:string" minOccurs="0"/>
208
                    <xs:element name="Pays" type="xs:string" minOccurs="0"/>
209
                  </xs:sequence>
210
                </xs:complexType>
211
              </xs:element>
212
            </xs:sequence>
213
          </xs:complexType>
214
        </xs:element>
215
      </xs:sequence>
216
    </xs:complexType>
217
  </xs:element>
218
</xs:schema>
tests/data/mdel/formdata.json
109 109
        "Habitation_raw": "Oui",
110 110
        "Inscription": "Oui",
111 111
        "Inscription_raw": "Oui",
112
        "adresse_code_postal": "54 000",
113
        "adresse_code_postal_raw": "54 000",
112
        "adresse_code_postal": "54000",
113
        "adresse_code_postal_raw": "54000",
114 114
        "adresse_complement1": "Apt 4112",
115 115
        "adresse_complement2": "Batiment B",
116 116
        "adresse_localite": "Nancy",
......
138 138
        "etranger_raw": "Non",
139 139
        "inscription_liste_type": "Liste Principale., Inscription pour les \u00e9lections municipales.",
140 140
        "inscription_liste_type_raw": "cm",
141
        "inscription_localite": "Paris",
142
        "inscription_code_insee": "75111",
143
        "inscription_division_territoriale": "ile de france",
141 144
        "justificatif_domicile_hebergeur": {
142 145
            "content": "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L0FzY2VudCA4MzIKICAgL0Rlc2NlbnQgLTMwMAogICAvQ2FwSGVpZ2h0IDgzMgogICAvU3RlbVYgODAKICAgL1N0ZW1IIDgwCiAgIC9Gb250RmlsZTIgMTMgMCBSCj4+CmVuZG9iago2IDAgb2JqCjw8IC9UeXBlIC9Gb250CiAgIC9TdWJ0eXBlIC9UcnVlVHlwZQogICAvQmFzZUZvbnQgL1VTU1FYTCtMaWJlcmF0aW9uTW9ubwogICAvRmlyc3RDaGFyIDMyCiAgIC9MYXN0Q2hhciAxMTYKICAgL0ZvbnREZXNjcmlwdG9yIDE3IDAgUgogICAvRW5jb2RpbmcgL1dpbkFuc2lFbmNvZGluZwogICAvV2lkdGhzIFsgNjAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCA2MDAgMCAwIDYwMCA2MDAgMCAwIDYwMCA2MDAgMCAwIDYwMCAwIDAgNjAwIDYwMCBdCiAgICAvVG9Vbmljb2RlIDE1IDAgUgo+PgplbmRvYmoKMSAwIG9iago8PCAvVHlwZSAvUGFnZXMKICAgL0tpZHMgWyA3IDAgUiBdCiAgIC9Db3VudCAxCj4+CmVuZG9iagoxOCAwIG9iago8PCAvQ3JlYXRvciAoY2Fpcm8gMS4xNC42IChodHRwOi8vY2Fpcm9ncmFwaGljcy5vcmcpKQogICAvUHJvZHVjZXIgKGNhaXJvIDEuMTQuNiAoaHR0cDovL2NhaXJvZ3JhcGhpY3Mub3JnKSkKPj4KZW5kb2JqCjE5IDAgb2JqCjw8IC9UeXBlIC9DYXRhbG9nCiAgIC9QYWdlcyAxIDAgUgo+PgplbmRvYmoKeHJlZgowIDIwCjAwMDAwMDAwMDAgNjU1MzUgZiAKMDAwMDAxNTgxMCAwMDAwMCBuIAowMDAwMDAwMzQ4IDAwMDAwIG4gCjAwMDAwMDAwMTUgMDAwMDAgbiAKMDAwMDAwMDMyNiAwMDAwMCBuIAowMDAwMDA5OTkxIDAwMDAwIG4gCjAwMDAwMTU0MDQgMDAwMDAgbiAKMDAwMDAwMDQ3NiAwMDAwMCBuIAowMDAwMDAwNzA0IDAwMDAwIG4gCjAwMDAwMDkyMzYgMDAwMDAgbiAKMDAwMDAwOTI1OSAwMDAwMCBuIAowMDAwMDA5NjkyIDAwMDAwIG4gCjAwMDAwMDk3MTUgMDAwMDAgbiAKMDAwMDAxMDQ0MyAwMDAwMCBuIAowMDAwMDE0NzM2IDAwMDAwIG4gCjAwMDAwMTQ3NjAgMDAwMDAgbiAKMDAwMDAxNTEwNiAwMDAwMCBuIAowMDAwMDE1MTI5IDAwMDAwIG4gCjAwMDAwMTU4NzUgMDAwMDAgbiAKMDAwMDAxNjAwMyAwMDAwMCBuIAp0cmFpbGVyCjw8IC9TaXplIDIwCiAgIC9Sb290IDE5IDAgUgogICAvSW5mbyAxOCAwIFIKPj4Kc3RhcnR4cmVmCjE2MDU2CiUlRU9GCg==",
143 146
            "content_type": "application/pdf",
tests/data/mdel/formdata_aec_deces.json
29 29
        "demandeur_adresse_pays_raw": "FRA",
30 30
        "demandeur_adresse_ville": "Nancy",
31 31
        "demandeur_adresse_voie": "Rue de l'Aigle Blanc",
32
        "demandeur_adresse_etrangere": "37, Rue de l'Aigle Blanc, 54000 Nancy",
33 32
        "demandeur_civilite": "Madame",
34 33
        "demandeur_civilite_raw": "Madame",
35 34
        "demandeur_email": "chelsea@whatever.com",
tests/data/mdel/formdata_aec_mariage.json
25 25
        "aec_nature": "Extrait avec filiation",
26 26
        "aec_nature_raw": "EXTRAIT-AVEC-FILIATION",
27 27
        "date_acte": "2008-08-18",
28
        "demandeur_adresse_code_postal": "BC V5Y 1V4",
29
        "demandeur_adresse_num": "274",
30
        "demandeur_adresse_pays": "CANADA",
31
        "demandeur_adresse_pays_raw": "CAN",
32
        "demandeur_adresse_ville": "Vancouver",
33
        "demandeur_adresse_voie": "West 12th Avenue",
28
        "demandeur_adresse_code_postal": "94270",
29
        "demandeur_adresse_num": "22",
30
        "demandeur_adresse_pays": "FRANCE",
31
        "demandeur_adresse_pays_raw": "FRA",
32
        "demandeur_adresse_ville": "Kremlin Bicetre",
33
        "demandeur_adresse_code_postal": "94270",
34
        "demandeur_adresse_voie": "rue Danton",
34 35
        "demandeur_civilite": "Madame",
35 36
        "demandeur_civilite_raw": "Madame",
36 37
        "demandeur_email": "chelsea@whatever.com",
tests/test_mdel.py
21 21
import json
22 22
import base64
23 23
import copy
24

  
24 25
from xml.etree import ElementTree as etree
26
from lxml import etree as letree
25 27

  
26 28
import pytest
27 29

  
......
31 33

  
32 34
import utils
33 35

  
36
AEC_XSD = 'ActeEtatCivil-V1.A.xsd'
37
ILE_XSD = 'ILE_v1.1.xsd'
38

  
34 39

  
35 40
def get_mdel_base_dir():
36 41
    return os.path.join(os.path.dirname(__file__), 'data', 'mdel')
......
42 47
        return fd.read()
43 48

  
44 49

  
50
def validate_schema(doc, xsd):
51
    xsd_path = os.path.join(get_mdel_base_dir(), xsd)
52
    xsd = letree.parse(xsd_path).getroot()
53
    schema = letree.XMLSchema(xsd)
54
    parser = letree.XMLParser(schema=schema)
55
    letree.parse(doc, parser=parser)  # Will raise an exception if schema not respected
56

  
57

  
58

  
45 59
@pytest.fixture
46 60
def setup(db):
47 61
    return utils.setup_access_rights(MDEL.objects.create(slug='test'))
......
123 137
        assert resp.json['data']['demand_id'] == '15-4-AEC-LA'
124 138

  
125 139
        doc = os.path.join(get_resource_base_dir(), 'test', 'inputs', '15-4-AEC-LA--0', '15-4-AEC-LA-doc-.xml')
140
        validate_schema(doc, AEC_XSD)
141

  
126 142
        root = etree.parse(doc).getroot()
127 143

  
128 144
        assert root.tag == 'EnveloppeMetierType'
......
169 185
        assert resp.json['data']['demand_id'] == '16-1-AEC-LA'
170 186

  
171 187
        doc = os.path.join(get_resource_base_dir(), 'test', 'inputs', '16-1-AEC-LA--0', '16-1-AEC-LA-doc-.xml')
188
        validate_schema(doc, AEC_XSD)
189

  
172 190
        root = etree.parse(doc).getroot()
173 191

  
174 192
        assert root.tag == 'EnveloppeMetierType'
......
191 209
        assert root.find('DemandeActe/Demandeur/Telephone').text == '0122334455'
192 210
        assert root.find('DemandeActe/Demandeur/QualiteDemandeur/Code').text == 'Autre'
193 211
        assert root.find('DemandeActe/Demandeur/QualiteDemandeur/Libelle').text == 'Sa soeur'
194
        assert root.find('DemandeActe/Demandeur/AdresseEtrangere/Adresse').text == '274 West 12th Avenue, Vancouver, BC V5Y 1V4'
195
        assert root.find('DemandeActe/Demandeur/AdresseEtrangere/Pays').text == 'CAN'
212
        assert root.find('DemandeActe/Demandeur/AdresseFrancaise/Voie').text == '22 rue Danton'
213
        assert root.find('DemandeActe/Demandeur/AdresseFrancaise/CodePostal').text == '94270'
214
        assert root.find('DemandeActe/Demandeur/AdresseFrancaise/Ville').text == 'Kremlin Bicetre'
196 215

  
197 216
        # Concerned
198 217
        assert root.find('DemandeActe/Titulaire/Civilite').text == 'MONSIEUR'
......
220 239
        assert resp.json['data']['demand_id'] == '17-1-AEC-LA'
221 240

  
222 241
        doc = os.path.join(get_resource_base_dir(), 'test', 'inputs', '17-1-AEC-LA--0', '17-1-AEC-LA-doc-.xml')
242
        validate_schema(doc, AEC_XSD)
243

  
223 244
        root = etree.parse(doc).getroot()
224 245

  
225 246
        assert root.tag == 'EnveloppeMetierType'
......
273 294

  
274 295
    base_doc = os.path.join(get_resource_base_dir(), 'test', 'inputs', '1-14-ILE-LA--0')
275 296
    doc = os.path.join(base_doc, '1-14-ILE-LA-doc-.xml')
297

  
298
    validate_schema(doc, ILE_XSD)
299

  
276 300
    root = etree.parse(doc).getroot()
277 301

  
278 302
    assert root.tag == 'AvisDInscription'
279 303

  
280 304
    assert root.find('Inscription/Electeur/AdresseDeLElecteur/Localite').text == 'Nancy'
281
    assert root.find('Inscription/Electeur/AdresseDeLElecteur/CodePostal').text == '54 000'
305
    assert root.find('Inscription/Electeur/AdresseDeLElecteur/CodePostal').text == '54000'
282 306
    assert root.find('Inscription/Electeur/AdresseDeLElecteur/TypeVoie').text == 'RUE'
283 307
    assert root.find('Inscription/Electeur/AdresseDeLElecteur/NomVoie').text == 'RUE DU CHEVAL BLANC'
284 308
    assert root.find('Inscription/Electeur/AdresseDeLElecteur/NumeroVoie').text == '37'
285
-