Projet

Général

Profil

0001-cityweb-add-option-to-zip-demand-files-32091.patch

Serghei Mihai (congés, retour 15/05), 15 avril 2019 16:33

Télécharger (13,7 ko)

Voir les différences:

Subject: [PATCH] cityweb: add option to zip demand files (#32091)

 passerelle/apps/cityweb/cityweb.py            |  12 +-
 .../cityweb/migrations/0004_cityweb_do_zip.py |  20 ++
 passerelle/apps/cityweb/models.py             |   4 +-
 tests/test_cityweb.py                         | 181 ++++++++++--------
 4 files changed, 136 insertions(+), 81 deletions(-)
 create mode 100644 passerelle/apps/cityweb/migrations/0004_cityweb_do_zip.py
passerelle/apps/cityweb/cityweb.py
374 374
            self.origine = Origin(data['application_origin'])
375 375
        self.commentaire = data.get('application_comment', '')
376 376

  
377
    def save(self, path):
377
    def save(self, path, do_zip=True):
378 378
        basename = os.path.join(path, self.identifiant)
379 379
        archname = basename + '.zip'
380 380
        filepath = basename + '.xml'
381 381
        content = etree.tostring(self.xml, pretty_print=True)
382 382
        default_storage.save(filepath, ContentFile(content))
383
        with zipfile.ZipFile(archname, 'w', zipfile.ZIP_DEFLATED) as zipf:
384
            zipf.write(filepath, os.path.basename(filepath))
385
        os.remove(filepath)
386
        return archname
383
        if do_zip:
384
            with zipfile.ZipFile(archname, 'w', zipfile.ZIP_DEFLATED) as zipf:
385
                zipf.write(filepath, os.path.basename(filepath))
386
                os.remove(filepath)
387
            return archname
388
        return filepath
passerelle/apps/cityweb/migrations/0004_cityweb_do_zip.py
1
# -*- coding: utf-8 -*-
2
# Generated by Django 1.11.20 on 2019-04-15 13:35
3
from __future__ import unicode_literals
4

  
5
from django.db import migrations, models
6

  
7

  
8
class Migration(migrations.Migration):
9

  
10
    dependencies = [
11
        ('cityweb', '0003_remove_cityweb_log_level'),
12
    ]
13

  
14
    operations = [
15
        migrations.AddField(
16
            model_name='cityweb',
17
            name='do_zip',
18
            field=models.BooleanField(default=True, verbose_name='Zip generated file'),
19
        ),
20
    ]
passerelle/apps/cityweb/models.py
19 19

  
20 20
from django.utils.translation import ugettext_lazy as _
21 21
from django.core.files.storage import default_storage
22
from django.db import models
22 23

  
23 24
from passerelle.base.models import BaseResource
24 25
from passerelle.utils.api import endpoint
......
29 30

  
30 31

  
31 32
class CityWeb(BaseResource):
33
    do_zip = models.BooleanField(_('Zip generated file'), default=True)
32 34
    category = _('Civil Status Connectors')
33 35

  
34 36
    class Meta:
......
47 49
                raise APIError('<%s> is required' % key)
48 50

  
49 51
        application = CivilStatusApplication(payload)
50
        application.save(self.basepath)
52
        application.save(self.basepath, do_zip=self.do_zip)
51 53
        return {'data': {'demand_id': application.identifiant}}
52 54

  
53 55
    @property
tests/test_cityweb.py
59 59
    }
60 60
]
61 61

  
62
BIRTH_ASSERTIONS = {
63
    'identifiant': 'N201610154',
64
    'demandeur.qualiteDemandeur': 'concerne',
65
    'demandeur.individu.noms.nomDeFamille': 'Whatever',
66
    'demandeur.individu.prenoms': 'Kim Chelsea',
67
    'demandeur.individu.adresse.ligneAdr1': "37 Rue de l'Aigle Blanc",
68
    'demandeur.individu.adresse.codePostal': 54000,
69
    'demandeur.individu.adresse.lieu.ville': 'Nancy',
70
    'demandeur.individu.adresse.lieu.pays': 'France',
71
    'demandeur.individu.adresse.mail': 'chelsea@whatever.com',
72
    'natureDocument': 'CPI', 'nbExemplaire': 1,
73
    'dateDemande': '2016-10-20T14:41:20Z',
74
    'evenement.natureEvenement': 'NAI',
75
    'evenement.dateEvenement.dateDebut': '2012-07-14',
76
    'evenement.lieuEvenement.ville': 'Nancy',
77
    'evenement.interesse.pere.noms.nomDeFamille': 'Smith',
78
    'evenement.interesse.pere.prenoms': 'John Oliver',
79
    'evenement.interesse.mere.noms.nomDeFamille': 'Smith',
80
    'evenement.interesse.mere.prenoms': 'Kim',
81
}
82

  
83
MARRIAGE_ASSERTIONS = {
84
    'identifiant': 'M201610161',
85
    'demandeur.qualiteDemandeur': 'concerne',
86
    'demandeur.individu.noms.nomDeFamille': 'Whatever',
87
    'demandeur.individu.prenoms': 'Kim Chelsea',
88
    'demandeur.individu.adresse.ligneAdr1': "37 Rue de l'Aigle Blanc",
89
    'demandeur.individu.adresse.codePostal': 54000,
90
    'demandeur.individu.adresse.lieu.ville': 'Nancy',
91
    'demandeur.individu.adresse.lieu.pays': 'France',
92
    'demandeur.individu.adresse.mail': 'chelsea@whatever.com',
93
    'natureDocument': 'CPI', 'nbExemplaire': 1,
94
    'dateDemande': '2016-10-20T14:41:20Z',
95
    'evenement.natureEvenement': 'MAR',
96
    'evenement.dateEvenement.dateDebut': '2012-07-14',
97
    'evenement.lieuEvenement.ville': 'Nancy',
98
    'evenement.interesse.pere.noms.nomDeFamille': 'Smith',
99
    'evenement.interesse.pere.prenoms': 'John Oliver',
100
    'evenement.interesse.mere.noms.nomDeFamille': 'Smith',
101
    'evenement.interesse.mere.prenoms': 'Kim',
102
    'evenement.conjoint.noms.nomDeFamille': 'Contrao',
103
    'evenement.conjoint.pere.noms.nomDeFamille': 'Scaramucci',
104
    'evenement.conjoint.pere.prenoms': 'Antonio',
105
    'evenement.conjoint.mere.noms.nomDeFamille': 'Scaramucci',
106
    'evenement.conjoint.mere.prenoms': 'Marguerite',
107
}
108

  
109
DEATH_ASSERTIONS = {
110
    'identifiant': 'D201610171',
111
    'demandeur.qualiteDemandeur': 'concerne',
112
    'demandeur.individu.noms.nomDeFamille': 'Whatever',
113
    'demandeur.individu.prenoms': 'Kim Chelsea',
114
    'demandeur.individu.adresse.ligneAdr1': "37 Rue de l'Aigle Blanc",
115
    'demandeur.individu.adresse.codePostal': 54000,
116
    'demandeur.individu.adresse.lieu.ville': 'Nancy',
117
    'demandeur.individu.adresse.lieu.pays': 'France',
118
    'demandeur.individu.adresse.mail': 'chelsea@whatever.com',
119
    'natureDocument': 'EXTSF', 'nbExemplaire': 1,
120
    'dateDemande': '2016-10-20T14:41:20Z',
121
    'evenement.natureEvenement': 'DEC',
122
    'evenement.dateEvenement.dateDebut': '2012-07-14',
123
    'evenement.lieuEvenement.ville': 'Nancy',
124
}
125

  
62 126

  
63 127
@pytest.fixture(params=PAYLOAD)
64 128
def payload(request):
65 129
    return request.param
66 130

  
67 131

  
68
def assert_xml_doc(archive, assertions):
132
def assert_xml_doc(filename, assertions, zipped=True):
69 133
    schema = etree.XMLSchema(
70 134
        etree.parse(open(os.path.join(get_test_base_dir('cityweb'), 'cityweb.xsd'))))
71
    with zipfile.ZipFile(archive) as zfd:
72
        content = zfd.read(zfd.filelist[0].filename)
73
        xml_content = etree.fromstring(content)
74
        assert len(xml_content.nsmap) == 1
75
        assert xml_content.nsmap['xs'] == "http://tempuri.org/XMLSchema.xsd"
76
        schema.assertValid(xml_content)
77
        root = xobject.fromstring(content)
78
        for epath, value in assertions.items():
79
            path = xobject.ObjectPath('demandeEtatCivil.%s' % epath)
80
            assert path.find(root) == value
135
    if zipped:
136
        with zipfile.ZipFile(filename) as zfd:
137
            content = zfd.read(zfd.filelist[0].filename)
138
    else:
139
        content = file(filename).read()
140

  
141
    xml_content = etree.fromstring(content)
142
    assert len(xml_content.nsmap) == 1
143
    assert xml_content.nsmap['xs'] == "http://tempuri.org/XMLSchema.xsd"
144
    schema.assertValid(xml_content)
145
    root = xobject.fromstring(content)
146
    for epath, value in assertions.items():
147
        path = xobject.ObjectPath('demandeEtatCivil.%s' % epath)
148
        assert path.find(root) == value
81 149

  
82 150

  
83 151
@mock.patch('passerelle.apps.cityweb.models.default_storage.path', get_test_base_dir)
......
87 155
        response = app.post_json(url, params=payload['birth'])
88 156
        assert response.json['data']['demand_id'] == 'N201610154'
89 157
        archive = os.path.join(get_test_base_dir('cityweb'), 'test', 'N201610154.zip')
90
        assertions = {
91
            'identifiant': 'N201610154',
92
            'demandeur.qualiteDemandeur': 'concerne',
93
            'demandeur.individu.noms.nomDeFamille': 'Whatever',
94
            'demandeur.individu.prenoms': 'Kim Chelsea',
95
            'demandeur.individu.adresse.ligneAdr1': "37 Rue de l'Aigle Blanc",
96
            'demandeur.individu.adresse.codePostal': 54000,
97
            'demandeur.individu.adresse.lieu.ville': 'Nancy',
98
            'demandeur.individu.adresse.lieu.pays': 'France',
99
            'demandeur.individu.adresse.mail': 'chelsea@whatever.com',
100
            'natureDocument': 'CPI', 'nbExemplaire': 1,
101
            'dateDemande': '2016-10-20T14:41:20Z',
102
            'evenement.natureEvenement': 'NAI',
103
            'evenement.dateEvenement.dateDebut': '2012-07-14',
104
            'evenement.lieuEvenement.ville': 'Nancy',
105
            'evenement.interesse.pere.noms.nomDeFamille': 'Smith',
106
            'evenement.interesse.pere.prenoms': 'John Oliver',
107
            'evenement.interesse.mere.noms.nomDeFamille': 'Smith',
108
            'evenement.interesse.mere.prenoms': 'Kim',
109
        }
110
        assert_xml_doc(archive, assertions)
158
        assert_xml_doc(archive, BIRTH_ASSERTIONS)
111 159

  
112 160
    elif 'mariage' in payload:
113 161
        response = app.post_json(url, params=payload['mariage'])
114 162
        assert response.json['data']['demand_id'] == 'M201610161'
115 163
        archive = os.path.join(get_test_base_dir('cityweb'), 'test', 'M201610161.zip')
116
        assertions = {
117
            'identifiant': 'M201610161',
118
            'demandeur.qualiteDemandeur': 'concerne',
119
            'demandeur.individu.noms.nomDeFamille': 'Whatever',
120
            'demandeur.individu.prenoms': 'Kim Chelsea',
121
            'demandeur.individu.adresse.ligneAdr1': "37 Rue de l'Aigle Blanc",
122
            'demandeur.individu.adresse.codePostal': 54000,
123
            'demandeur.individu.adresse.lieu.ville': 'Nancy',
124
            'demandeur.individu.adresse.lieu.pays': 'France',
125
            'demandeur.individu.adresse.mail': 'chelsea@whatever.com',
126
            'natureDocument': 'CPI', 'nbExemplaire': 1,
127
            'dateDemande': '2016-10-20T14:41:20Z',
128
            'evenement.natureEvenement': 'MAR',
129
            'evenement.dateEvenement.dateDebut': '2012-07-14',
130
            'evenement.lieuEvenement.ville': 'Nancy',
131
            'evenement.interesse.pere.noms.nomDeFamille': 'Smith',
132
            'evenement.interesse.pere.prenoms': 'John Oliver',
133
            'evenement.interesse.mere.noms.nomDeFamille': 'Smith',
134
            'evenement.interesse.mere.prenoms': 'Kim',
135
            'evenement.conjoint.noms.nomDeFamille': 'Contrao',
136
            'evenement.conjoint.pere.noms.nomDeFamille': 'Scaramucci',
137
            'evenement.conjoint.pere.prenoms': 'Antonio',
138
            'evenement.conjoint.mere.noms.nomDeFamille': 'Scaramucci',
139
            'evenement.conjoint.mere.prenoms': 'Marguerite',
140
        }
141
        assert_xml_doc(archive, assertions)
164
        assert_xml_doc(archive, MARRIAGE_ASSERTIONS)
142 165
    else:
143 166
        response = app.post_json(url, params=payload['death'])
144 167
        assert response.json['data']['demand_id'] == 'D201610171'
145 168
        archive = os.path.join(get_test_base_dir('cityweb'), 'test', 'D201610171.zip')
146
        assertions = {
147
            'identifiant': 'D201610171',
148
            'demandeur.qualiteDemandeur': 'concerne',
149
            'demandeur.individu.noms.nomDeFamille': 'Whatever',
150
            'demandeur.individu.prenoms': 'Kim Chelsea',
151
            'demandeur.individu.adresse.ligneAdr1': "37 Rue de l'Aigle Blanc",
152
            'demandeur.individu.adresse.codePostal': 54000,
153
            'demandeur.individu.adresse.lieu.ville': 'Nancy',
154
            'demandeur.individu.adresse.lieu.pays': 'France',
155
            'demandeur.individu.adresse.mail': 'chelsea@whatever.com',
156
            'natureDocument': 'EXTSF', 'nbExemplaire': 1,
157
            'dateDemande': '2016-10-20T14:41:20Z',
158
            'evenement.natureEvenement': 'DEC',
159
            'evenement.dateEvenement.dateDebut': '2012-07-14',
160
            'evenement.lieuEvenement.ville': 'Nancy',
161
        }
162
        assert_xml_doc(archive, assertions)
169
        assert_xml_doc(archive, DEATH_ASSERTIONS)
170

  
171

  
172
@mock.patch('passerelle.apps.cityweb.models.default_storage.path', get_test_base_dir)
173
def test_demand_creation_with_no_zipping(app, setup, payload):
174

  
175
    setup.do_zip = False
176
    setup.save()
177

  
178
    url = '/cityweb/test/create/'
179
    if 'birth' in payload:
180
        response = app.post_json(url, params=payload['birth'])
181
        assert response.json['data']['demand_id'] == 'N201610154'
182
        filename = os.path.join(get_test_base_dir('cityweb'), 'test', 'N201610154.xml')
183
        assert_xml_doc(filename, BIRTH_ASSERTIONS, zipped=False)
184
    elif 'mariage' in payload:
185
        response = app.post_json(url, params=payload['mariage'])
186
        assert response.json['data']['demand_id'] == 'M201610161'
187
        filename = os.path.join(get_test_base_dir('cityweb'), 'test', 'M201610161.xml')
188
        assert_xml_doc(filename, MARRIAGE_ASSERTIONS, zipped=False)
189
    else:
190
        response = app.post_json(url, params=payload['death'])
191
        assert response.json['data']['demand_id'] == 'D201610171'
192
        filename = os.path.join(get_test_base_dir('cityweb'), 'test', 'D201610171.xml')
193
        assert_xml_doc(filename, DEATH_ASSERTIONS, zipped=False)
163 194

  
164 195

  
165 196
def test_date_type_parsing():
166
-