Projet

Général

Profil

0002-toulouse_axel-handle-handicap-fields-38543.patch

Lauréline Guérin, 13 janvier 2020 16:40

Télécharger (19,2 ko)

Voir les différences:

Subject: [PATCH 2/5] toulouse_axel: handle handicap fields (#38543)

 functests/toulouse_axel/test_toulouse_axel.py | 16 +++++
 passerelle/contrib/toulouse_axel/models.py    | 68 ++++++++++++++++--
 .../flat_update_family_info.json              | 30 ++++----
 .../toulouse_axel/update_family_info.json     | 34 +++++----
 tests/test_toulouse_axel.py                   | 71 +++++++++++++++++++
 5 files changed, 189 insertions(+), 30 deletions(-)
functests/toulouse_axel/test_toulouse_axel.py
41 41
        for key in ['NOM', 'DATENAISSANCE', 'SEXE', 'PRENOMPERE', 'PRENOMMERE', 'NOMPERE', 'NOMMERE', 'RATTACHEAUTREDUI', 'PRENOM']:
42 42
            enfant.pop(key)
43 43
        enfant['AUTORISATIONURGENCEMEDICALE'] = 'OUI'
44
        if 'SANITAIRE' not in enfant:
45
            continue
46
        # manage handicap data (not the same schema)
47
        handicap_fields = [
48
            'AUTREDIFFICULTE',
49
            'ECOLESPECIALISEE',
50
            'INDICATEURAUXILIAIREVS',
51
            'INDICATEURECOLE',
52
            'INDICATEURHANDICAP',
53
            'INDICATEURNOTIFMDPH',
54
        ]
55
        enfant['SANITAIRE']['HANDICAP'] = {}
56
        for key in handicap_fields:
57
            enfant['SANITAIRE']['HANDICAP'][key] = enfant['SANITAIRE'].pop(key)
58
    # add partial update flags
44 59
    flags = [
45 60
        'maj:adresse',
46 61
        'maj:rl1', 'maj:rl1_adresse_employeur',
......
54 69
            'maj:enfant_%s_sanitaire_medecin' % i,
55 70
            'maj:enfant_%s_sanitaire_vaccin' % i,
56 71
            'maj:enfant_%s_sanitaire_allergie' % i,
72
            'maj:enfant_%s_sanitaire_handicap' % i,
57 73
            'maj:enfant_%s_assurance' % i,
58 74
            'maj:enfant_%s_contact' % i,
59 75
        ]
passerelle/contrib/toulouse_axel/models.py
286 286
            'maj:enfant_%s_sanitaire_medecin' % i: 'ENFANT/%s/SANITAIRE/MEDECIN' % i,
287 287
            'maj:enfant_%s_sanitaire_vaccin' % i: 'ENFANT/%s/SANITAIRE/VACCIN' % i,
288 288
            'maj:enfant_%s_sanitaire_allergie' % i: 'ENFANT/%s/SANITAIRE/ALLERGIE' % i,
289
            'maj:enfant_%s_sanitaire_handicap' % i: 'ENFANT/%s/SANITAIRE/HANDICAP' % i,
289 290
            'maj:enfant_%s_assurance' % i: 'ENFANT/%s/ASSURANCE' % i,
290 291
            'maj:enfant_%s_contact' % i: 'ENFANT/%s/CONTACT' % i,
291 292
        })
292 293
        UPDATE_FAMILY_REQUIRED_FLAGS.append('maj:enfant_%s' % i)
294

  
293 295
    UPDATE_FAMILY_SCHEMA = copy.deepcopy(
294 296
        form_maj_famille_dui.request_schema['properties']['PORTAIL']['properties']['DUI'])
295
    UPDATE_FAMILY_SCHEMA['properties'].pop('IDDUI')
296
    UPDATE_FAMILY_SCHEMA['properties'].pop('DATEDEMANDE')
297
    UPDATE_FAMILY_SCHEMA['properties'].pop('QUIACTUALISEDUI')
298
    UPDATE_FAMILY_SCHEMA['required'].remove('IDDUI')
299
    UPDATE_FAMILY_SCHEMA['required'].remove('DATEDEMANDE')
300
    UPDATE_FAMILY_SCHEMA['required'].remove('QUIACTUALISEDUI')
297

  
301 298
    for flag in sorted(UPDATE_FAMILY_FLAGS.keys()):
302 299
        flag_type = {
303 300
            'oneOf': [
......
313 310
            flag_type['oneOf'].append({'type': 'string', 'enum': ['']})
314 311
        UPDATE_FAMILY_SCHEMA['properties'][flag] = flag_type
315 312
        UPDATE_FAMILY_SCHEMA['required'].append(flag)
313

  
314
    UPDATE_FAMILY_SCHEMA['properties'].pop('IDDUI')
315
    UPDATE_FAMILY_SCHEMA['properties'].pop('DATEDEMANDE')
316
    UPDATE_FAMILY_SCHEMA['properties'].pop('QUIACTUALISEDUI')
317
    UPDATE_FAMILY_SCHEMA['required'].remove('IDDUI')
318
    UPDATE_FAMILY_SCHEMA['required'].remove('DATEDEMANDE')
319
    UPDATE_FAMILY_SCHEMA['required'].remove('QUIACTUALISEDUI')
320
    handicap_fields = [
321
        'AUTREDIFFICULTE',
322
        'ECOLESPECIALISEE',
323
        'INDICATEURAUXILIAIREVS',
324
        'INDICATEURECOLE',
325
        'INDICATEURHANDICAP',
326
        'INDICATEURNOTIFMDPH',
327
    ]
328
    sanitaire_properties = UPDATE_FAMILY_SCHEMA['properties']['ENFANT']['items']['properties']['SANITAIRE']['properties']
329
    sanitaire_required = UPDATE_FAMILY_SCHEMA['properties']['ENFANT']['items']['properties']['SANITAIRE']['required']
330
    sanitaire_properties['HANDICAP'] = {
331
        'type': 'object',
332
        'properties': {},
333
        'required': handicap_fields,
334
    }
335
    sanitaire_required.append('HANDICAP')
336
    for key in handicap_fields:
337
        field = sanitaire_properties.pop(key)
338
        sanitaire_properties['HANDICAP']['properties'][key] = field
339
        sanitaire_required.remove(key)
340

  
316 341
    UPDATE_FAMILY_SCHEMA['unflatten'] = True
317 342

  
318 343
    @endpoint(
......
462 487
        raise APIError('Child not found', err_code='not-found')
463 488

  
464 489
    def sanitize_update_family_data(self, name_id, post_data):
490
        family_data = None
491

  
465 492
        # transform ENFANT list to dict, where the key is the field IDPERSONNE
466 493
        # because children in post_date are maybe not in the same order than on Axel side
467 494
        children = {}
......
517 544
                # empty all subelements
518 545
                for k in data[element_to_remove].keys():
519 546
                    data[element_to_remove][k] = None
547
            elif element_to_remove == 'HANDICAP':
548
                # get the correct child
549
                child_data = post_data['ENFANT'][elements[1]]
550
                child_id = child_data['IDPERSONNE']
551
                # get family info
552
                if family_data is None:
553
                    family_data = self.get_family_data(name_id)
554
                for child in family_data['ENFANT']:
555
                    # find the correct child in family info
556
                    if child['IDPERSONNE'] != child_id:
557
                        continue
558
                    # reset handicap related fields
559
                    handicap_fields = [
560
                        'AUTREDIFFICULTE',
561
                        'ECOLESPECIALISEE',
562
                        'INDICATEURAUXILIAIREVS',
563
                        'INDICATEURECOLE',
564
                        'INDICATEURHANDICAP',
565
                        'INDICATEURNOTIFMDPH',
566
                    ]
567
                    for key in handicap_fields:
568
                        child_data['SANITAIRE']['HANDICAP'][key] = child['SANITAIRE'][key]
569
                    break
520 570
            elif element_to_remove in data:
521 571
                # remove block
522 572
                data.pop(element_to_remove)
523 573

  
574
        # transform HANDICAP block
575
        for child in post_data['ENFANT'].values():
576
            if 'SANITAIRE' not in child:
577
                continue
578
            child['SANITAIRE'].update(child['SANITAIRE'].pop('HANDICAP'))
579

  
524 580
        # transform ENFANT dict to a list back
525 581
        post_data['ENFANT'] = post_data['ENFANT'].values()
526 582

  
tests/data/toulouse_axel/flat_update_family_info.json
45 45
  "ENFANT/0/SANITAIRE/ALLERGIE/2/ALLERGIQUE": "OUI",
46 46
  "ENFANT/0/SANITAIRE/ALLERGIE/2/NOMALLERGIE": "",
47 47
  "ENFANT/0/SANITAIRE/ALLERGIE/2/TYPE": "ALIMENTAIRES",
48
  "ENFANT/0/SANITAIRE/AUTREDIFFICULTE": "",
49 48
  "ENFANT/0/SANITAIRE/DATEFINVALIDITE": "2020-12-31",
50
  "ENFANT/0/SANITAIRE/ECOLESPECIALISEE": "",
51
  "ENFANT/0/SANITAIRE/INDICATEURAUXILIAIREVS": "NON",
52
  "ENFANT/0/SANITAIRE/INDICATEURECOLE": "NON",
53
  "ENFANT/0/SANITAIRE/INDICATEURHANDICAP": "NON",
54
  "ENFANT/0/SANITAIRE/INDICATEURNOTIFMDPH": "NON",
49
  "ENFANT/0/SANITAIRE/HANDICAP/AUTREDIFFICULTE": "",
50
  "ENFANT/0/SANITAIRE/HANDICAP/ECOLESPECIALISEE": "",
51
  "ENFANT/0/SANITAIRE/HANDICAP/INDICATEURAUXILIAIREVS": "NON",
52
  "ENFANT/0/SANITAIRE/HANDICAP/INDICATEURECOLE": "NON",
53
  "ENFANT/0/SANITAIRE/HANDICAP/INDICATEURHANDICAP": "NON",
54
  "ENFANT/0/SANITAIRE/HANDICAP/INDICATEURNOTIFMDPH": "NON",
55 55
  "ENFANT/0/SANITAIRE/INDICATEURPAI": "NON",
56 56
  "ENFANT/0/SANITAIRE/INFOUTILES": "",
57 57
  "ENFANT/0/SANITAIRE/MEDECIN/NOM": "foo",
......
81 81
  "ENFANT/1/SANITAIRE/ALLERGIE/2/ALLERGIQUE": "OUI",
82 82
  "ENFANT/1/SANITAIRE/ALLERGIE/2/NOMALLERGIE": "",
83 83
  "ENFANT/1/SANITAIRE/ALLERGIE/2/TYPE": "ALIMENTAIRES",
84
  "ENFANT/1/SANITAIRE/AUTREDIFFICULTE": "",
85 84
  "ENFANT/1/SANITAIRE/DATEFINVALIDITE": "2020-12-31",
86
  "ENFANT/1/SANITAIRE/ECOLESPECIALISEE": "",
87
  "ENFANT/1/SANITAIRE/INDICATEURAUXILIAIREVS": "NON",
88
  "ENFANT/1/SANITAIRE/INDICATEURECOLE": "NON",
89
  "ENFANT/1/SANITAIRE/INDICATEURHANDICAP": "NON",
90
  "ENFANT/1/SANITAIRE/INDICATEURNOTIFMDPH": "NON",
85
  "ENFANT/1/SANITAIRE/HANDICAP/AUTREDIFFICULTE": "",
86
  "ENFANT/1/SANITAIRE/HANDICAP/ECOLESPECIALISEE": "",
87
  "ENFANT/1/SANITAIRE/HANDICAP/INDICATEURAUXILIAIREVS": "NON",
88
  "ENFANT/1/SANITAIRE/HANDICAP/INDICATEURECOLE": "NON",
89
  "ENFANT/1/SANITAIRE/HANDICAP/INDICATEURHANDICAP": "NON",
90
  "ENFANT/1/SANITAIRE/HANDICAP/INDICATEURNOTIFMDPH": "NON",
91 91
  "ENFANT/1/SANITAIRE/INDICATEURPAI": "NON",
92 92
  "ENFANT/1/SANITAIRE/INFOUTILES": "",
93 93
  "ENFANT/1/SANITAIRE/MEDECIN/NOM": "foo",
......
161 161
  "maj:enfant_0_sanitaire_allergie": "OUI",
162 162
  "maj:enfant_0_sanitaire_medecin": "OUI",
163 163
  "maj:enfant_0_sanitaire_vaccin": "OUI",
164
  "maj:enfant_0_sanitaire_handicap": "OUI",
164 165
  "maj:enfant_1": "OUI",
165 166
  "maj:enfant_1_assurance": "OUI",
166 167
  "maj:enfant_1_contact": "OUI",
......
168 169
  "maj:enfant_1_sanitaire_allergie": "OUI",
169 170
  "maj:enfant_1_sanitaire_medecin": "OUI",
170 171
  "maj:enfant_1_sanitaire_vaccin": "OUI",
172
  "maj:enfant_1_sanitaire_handicap": "OUI",
171 173
  "maj:enfant_2": "OUI",
172 174
  "maj:enfant_2_assurance": "OUI",
173 175
  "maj:enfant_2_contact": "OUI",
......
175 177
  "maj:enfant_2_sanitaire_allergie": "OUI",
176 178
  "maj:enfant_2_sanitaire_medecin": "OUI",
177 179
  "maj:enfant_2_sanitaire_vaccin": "OUI",
180
  "maj:enfant_2_sanitaire_handicap": "OUI",
178 181
  "maj:enfant_3": "OUI",
179 182
  "maj:enfant_3_assurance": "OUI",
180 183
  "maj:enfant_3_contact": "OUI",
......
182 185
  "maj:enfant_3_sanitaire_allergie": "OUI",
183 186
  "maj:enfant_3_sanitaire_medecin": "OUI",
184 187
  "maj:enfant_3_sanitaire_vaccin": "OUI",
188
  "maj:enfant_3_sanitaire_handicap": "OUI",
185 189
  "maj:enfant_4": "OUI",
186 190
  "maj:enfant_4_assurance": "OUI",
187 191
  "maj:enfant_4_contact": "OUI",
......
189 193
  "maj:enfant_4_sanitaire_allergie": "OUI",
190 194
  "maj:enfant_4_sanitaire_medecin": "OUI",
191 195
  "maj:enfant_4_sanitaire_vaccin": "OUI",
196
  "maj:enfant_4_sanitaire_handicap": "OUI",
192 197
  "maj:enfant_5": "OUI",
193 198
  "maj:enfant_5_assurance": "OUI",
194 199
  "maj:enfant_5_contact": "OUI",
......
196 201
  "maj:enfant_5_sanitaire_allergie": "OUI",
197 202
  "maj:enfant_5_sanitaire_medecin": "OUI",
198 203
  "maj:enfant_5_sanitaire_vaccin": "OUI",
204
  "maj:enfant_5_sanitaire_handicap": "OUI",
199 205
  "maj:revenus": "OUI",
200 206
  "maj:rl1": "OUI",
201 207
  "maj:rl1_adresse_employeur": "OUI",
tests/data/toulouse_axel/update_family_info.json
68 68
                        "TYPE": "ALIMENTAIRES"
69 69
                    }
70 70
                ],
71
                "AUTREDIFFICULTE": null,
72 71
                "DATEFINVALIDITE": "2020-12-31",
73
                "ECOLESPECIALISEE": null,
74
                "INDICATEURAUXILIAIREVS": "NON",
75
                "INDICATEURECOLE": "NON",
76
                "INDICATEURHANDICAP": "NON",
77
                "INDICATEURNOTIFMDPH": "NON",
72
                "HANDICAP": {
73
                    "AUTREDIFFICULTE": null,
74
                    "ECOLESPECIALISEE": null,
75
                    "INDICATEURAUXILIAIREVS": "NON",
76
                    "INDICATEURECOLE": "NON",
77
                    "INDICATEURHANDICAP": "NON",
78
                    "INDICATEURNOTIFMDPH": "NON"
79
                },
78 80
                "INDICATEURPAI": "NON",
79 81
                "INFOUTILES": null,
80 82
                "MEDECIN": {
......
122 124
                        "TYPE": "ALIMENTAIRES"
123 125
                    }
124 126
                ],
125
                "AUTREDIFFICULTE": null,
126 127
                "DATEFINVALIDITE": "2020-12-31",
127
                "ECOLESPECIALISEE": null,
128
                "INDICATEURAUXILIAIREVS": "NON",
129
                "INDICATEURECOLE": "NON",
130
                "INDICATEURHANDICAP": "NON",
131
                "INDICATEURNOTIFMDPH": "NON",
128
                "HANDICAP": {
129
                    "AUTREDIFFICULTE": null,
130
                    "ECOLESPECIALISEE": null,
131
                    "INDICATEURAUXILIAIREVS": "NON",
132
                    "INDICATEURECOLE": "NON",
133
                    "INDICATEURHANDICAP": "NON",
134
                    "INDICATEURNOTIFMDPH": "NON"
135
                },
132 136
                "INDICATEURPAI": "NON",
133 137
                "INFOUTILES": null,
134 138
                "MEDECIN": {
......
219 223
    "maj:enfant_0_sanitaire_allergie": "OUI",
220 224
    "maj:enfant_0_sanitaire_medecin": "OUI",
221 225
    "maj:enfant_0_sanitaire_vaccin": "OUI",
226
    "maj:enfant_0_sanitaire_handicap": "OUI",
222 227
    "maj:enfant_1": "OUI",
223 228
    "maj:enfant_1_assurance": "OUI",
224 229
    "maj:enfant_1_contact": "OUI",
......
226 231
    "maj:enfant_1_sanitaire_allergie": "OUI",
227 232
    "maj:enfant_1_sanitaire_medecin": "OUI",
228 233
    "maj:enfant_1_sanitaire_vaccin": "OUI",
234
    "maj:enfant_1_sanitaire_handicap": "OUI",
229 235
    "maj:enfant_2": "OUI",
230 236
    "maj:enfant_2_assurance": "OUI",
231 237
    "maj:enfant_2_contact": "OUI",
......
233 239
    "maj:enfant_2_sanitaire_allergie": "OUI",
234 240
    "maj:enfant_2_sanitaire_medecin": "OUI",
235 241
    "maj:enfant_2_sanitaire_vaccin": "OUI",
242
    "maj:enfant_2_sanitaire_handicap": "OUI",
236 243
    "maj:enfant_3": "OUI",
237 244
    "maj:enfant_3_assurance": "OUI",
238 245
    "maj:enfant_3_contact": "OUI",
......
240 247
    "maj:enfant_3_sanitaire_allergie": "OUI",
241 248
    "maj:enfant_3_sanitaire_medecin": "OUI",
242 249
    "maj:enfant_3_sanitaire_vaccin": "OUI",
250
    "maj:enfant_3_sanitaire_handicap": "OUI",
243 251
    "maj:enfant_4": "OUI",
244 252
    "maj:enfant_4_assurance": "OUI",
245 253
    "maj:enfant_4_contact": "OUI",
......
247 255
    "maj:enfant_4_sanitaire_allergie": "OUI",
248 256
    "maj:enfant_4_sanitaire_medecin": "OUI",
249 257
    "maj:enfant_4_sanitaire_vaccin": "OUI",
258
    "maj:enfant_4_sanitaire_handicap": "OUI",
250 259
    "maj:enfant_5": "OUI",
251 260
    "maj:enfant_5_assurance": "OUI",
252 261
    "maj:enfant_5_contact": "OUI",
......
254 263
    "maj:enfant_5_sanitaire_allergie": "OUI",
255 264
    "maj:enfant_5_sanitaire_medecin": "OUI",
256 265
    "maj:enfant_5_sanitaire_vaccin": "OUI",
266
    "maj:enfant_5_sanitaire_handicap": "OUI",
257 267
    "maj:revenus": "OUI",
258 268
    "maj:rl1": "OUI",
259 269
    "maj:rl1_adresse_employeur": "OUI",
tests/test_toulouse_axel.py
965 965
        assert 'VACCIN' not in partial_update_params['ENFANT'][1]['SANITAIRE']
966 966

  
967 967

  
968
def test_sanitize_update_family_data_enfant_n_sanitaire_handicap(app, resource, update_params):
969
    Link.objects.create(resource=resource, name_id='yyy', dui='XXX', person_id='42')
970

  
971
    # test maj:enfant_n_contact
972
    filepath = os.path.join(os.path.dirname(__file__), 'data/toulouse_axel/family_info.xml')
973
    with open(filepath) as xml:
974
        content = xml.read()
975
    partial_update_params = copy.deepcopy(update_params)
976
    partial_update_params['maj:enfant_0_sanitaire_handicap'] = False
977
    # reset fields
978
    handicap_fields = [
979
        'AUTREDIFFICULTE',
980
        'ECOLESPECIALISEE',
981
        'INDICATEURAUXILIAIREVS',
982
        'INDICATEURECOLE',
983
        'INDICATEURHANDICAP',
984
        'INDICATEURNOTIFMDPH',
985
    ]
986
    for key in handicap_fields:
987
        partial_update_params['ENFANT'][0]['SANITAIRE']['HANDICAP'][key] = None
988
    partial_update_params['maj:enfant_1'] = False
989
    with mock_getdata(content, 'RefFamilleDui'):
990
        resource.sanitize_update_family_data(name_id='yyy', post_data=partial_update_params)
991
        original_values = resource.get_family_data(name_id='yyy')['ENFANT'][0]['SANITAIRE']
992
    assert len(partial_update_params['ENFANT']) == 1
993
    assert partial_update_params['ENFANT'][0]['IDPERSONNE'] == "4242"
994
    # fields were set with origin values found in Axel
995
    new_values = partial_update_params['ENFANT'][0]['SANITAIRE']
996
    for key in handicap_fields:
997
        assert new_values[key] == original_values[key]
998
    # combine with maj:enfant_n_sanitaire
999
    partial_update_params = copy.deepcopy(update_params)
1000
    partial_update_params['maj:enfant_1_sanitaire'] = False
1001
    partial_update_params['maj:enfant_1_sanitaire_handicap'] = False
1002
    partial_update_params['maj:enfant_0'] = False
1003
    resource.sanitize_update_family_data(name_id='yyy', post_data=partial_update_params)
1004
    assert len(partial_update_params['ENFANT']) == 1
1005
    assert partial_update_params['ENFANT'][0]['IDPERSONNE'] == "3535"
1006
    assert 'SANITAIRE' not in partial_update_params['ENFANT'][0]
1007
    # combine with maj:enfant_n
1008
    partial_update_params = copy.deepcopy(update_params)
1009
    partial_update_params['maj:enfant_1'] = False
1010
    partial_update_params['maj:enfant_1_sanitaire_sanitaire'] = False
1011
    partial_update_params['maj:enfant_0'] = False
1012
    resource.sanitize_update_family_data(name_id='yyy', post_data=partial_update_params)
1013
    assert 'ENFANT' not in partial_update_params
1014

  
1015
    # test maj:enfant_n_sanitaire_handicap not set
1016
    for val in [None, '']:
1017
        partial_update_params = copy.deepcopy(update_params)
1018
        partial_update_params['maj:enfant_0_sanitaire_handicap'] = val
1019
        partial_update_params['maj:enfant_1'] = False
1020
        # reset fields
1021
        for key in handicap_fields:
1022
            partial_update_params['ENFANT'][0]['SANITAIRE']['HANDICAP'][key] = None
1023
        with mock.patch('passerelle.contrib.toulouse_axel.models.ref_famille_dui') as operation:
1024
            resource.sanitize_update_family_data(name_id='yyy', post_data=partial_update_params)
1025
        assert operation.call_args_list == [mock.call(resource, {'PORTAIL': {'DUI': {'IDDUI': u'XXX'}}})]
1026

  
1027

  
1028
def test_sanitize_update_family_data_axel_error(app, resource, update_params):
1029
    Link.objects.create(resource=resource, name_id='yyy', dui='XXX', person_id='42')
1030

  
1031
    partial_update_params = copy.deepcopy(update_params)
1032
    partial_update_params['maj:enfant_0_sanitaire_handicap'] = False
1033
    with mock.patch('passerelle.contrib.toulouse_axel.models.ref_famille_dui') as operation:
1034
        operation.side_effect = AxelError('FooBar')
1035
        with pytest.raises(APIError, match='Axel error: FooBar'):
1036
            resource.sanitize_update_family_data(name_id='yyy', post_data=partial_update_params)
1037

  
1038

  
968 1039
def test_update_family_info_endpoint_sanitize_axel_error(app, resource, update_params):
969 1040
    Link.objects.create(resource=resource, name_id='yyy', dui='XXX', person_id='42')
970 1041
    with mock.patch('passerelle.contrib.toulouse_axel.models.ToulouseAxel.sanitize_update_family_data') as sanitize:
971
-