Projet

Général

Profil

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

Lauréline Guérin, 06 janvier 2020 12:06

Télécharger (12,7 ko)

Voir les différences:

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

 functests/toulouse_axel/test_toulouse_axel.py |  2 +
 passerelle/contrib/toulouse_axel/models.py    | 25 ++++++--
 .../flat_update_family_info.json              |  6 ++
 .../toulouse_axel/update_family_info.json     |  6 ++
 tests/test_toulouse_axel.py                   | 63 +++++++++++++++++++
 5 files changed, 98 insertions(+), 4 deletions(-)
functests/toulouse_axel/test_toulouse_axel.py
54 54
            'maj:enfant_%s_sanitaire_medecin' % i,
55 55
            'maj:enfant_%s_sanitaire_vaccin' % i,
56 56
            'maj:enfant_%s_sanitaire_allergie' % i,
57
            'maj:enfant_%s_sanitaire_handicap' % i,
57 58
            'maj:enfant_%s_assurance' % i,
58 59
            'maj:enfant_%s_contact' % i,
59 60
        ]
60 61
    for key in flags:
61 62
        payload[key] = True
63
    payload['maj:enfant_0_sanitaire_handicap'] = False
62 64

  
63 65
    print("Update family info with the following payload:")
64 66
    pprint.pprint(payload)
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
        })
......
518 519
                # empty all subelements
519 520
                for k in data[element_to_remove].keys():
520 521
                    data[element_to_remove][k] = None
521
            elif element_to_remove == 'CONTACT':
522
            elif element_to_remove in ['CONTACT', 'HANDICAP']:
522 523
                # get the correct child
523 524
                child_data = post_data['ENFANT'][elements[1]]
524 525
                child_id = child_data['IDPERSONNE']
525
                # and reset the contacts
526
                # get family info
526 527
                if family_data is None:
527 528
                    family_data = self.get_family_data(name_id)
528 529
                for child in family_data['ENFANT']:
529
                    if child['IDPERSONNE'] == child_id:
530
                    # find the correct child in family info
531
                    if child['IDPERSONNE'] != child_id:
532
                        continue
533
                    if element_to_remove == 'CONTACT':
534
                        # reset the contacts
530 535
                        if child.get('CONTACT'):
531 536
                            child_data['CONTACT'] = child['CONTACT']
532 537
                            # XXX set LIENPARENTE because if empty the contact is deleted
......
535 540
                                    contact['LIENPARENTE'] = 'BABY'
536 541
                        elif 'CONTACT' in child_data:
537 542
                            child_data.pop('CONTACT')
538
                        break
543
                    else:
544
                        # reset handicap related fields
545
                        handicap_fields = [
546
                            'AUTREDIFFICULTE',
547
                            'ECOLESPECIALISEE',
548
                            'INDICATEURAUXILIAIREVS',
549
                            'INDICATEURECOLE',
550
                            'INDICATEURHANDICAP',
551
                            'INDICATEURNOTIFMDPH',
552
                        ]
553
                        for key in handicap_fields:
554
                            child_data['SANITAIRE'][key] = child['SANITAIRE'][key]
555
                    break
539 556
            elif element_to_remove in data:
540 557
                # remove block
541 558
                data.pop(element_to_remove)
tests/data/toulouse_axel/flat_update_family_info.json
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
219 219
    "maj:enfant_0_sanitaire_allergie": "OUI",
220 220
    "maj:enfant_0_sanitaire_medecin": "OUI",
221 221
    "maj:enfant_0_sanitaire_vaccin": "OUI",
222
    "maj:enfant_0_sanitaire_handicap": "OUI",
222 223
    "maj:enfant_1": "OUI",
223 224
    "maj:enfant_1_assurance": "OUI",
224 225
    "maj:enfant_1_contact": "OUI",
......
226 227
    "maj:enfant_1_sanitaire_allergie": "OUI",
227 228
    "maj:enfant_1_sanitaire_medecin": "OUI",
228 229
    "maj:enfant_1_sanitaire_vaccin": "OUI",
230
    "maj:enfant_1_sanitaire_handicap": "OUI",
229 231
    "maj:enfant_2": "OUI",
230 232
    "maj:enfant_2_assurance": "OUI",
231 233
    "maj:enfant_2_contact": "OUI",
......
233 235
    "maj:enfant_2_sanitaire_allergie": "OUI",
234 236
    "maj:enfant_2_sanitaire_medecin": "OUI",
235 237
    "maj:enfant_2_sanitaire_vaccin": "OUI",
238
    "maj:enfant_2_sanitaire_handicap": "OUI",
236 239
    "maj:enfant_3": "OUI",
237 240
    "maj:enfant_3_assurance": "OUI",
238 241
    "maj:enfant_3_contact": "OUI",
......
240 243
    "maj:enfant_3_sanitaire_allergie": "OUI",
241 244
    "maj:enfant_3_sanitaire_medecin": "OUI",
242 245
    "maj:enfant_3_sanitaire_vaccin": "OUI",
246
    "maj:enfant_3_sanitaire_handicap": "OUI",
243 247
    "maj:enfant_4": "OUI",
244 248
    "maj:enfant_4_assurance": "OUI",
245 249
    "maj:enfant_4_contact": "OUI",
......
247 251
    "maj:enfant_4_sanitaire_allergie": "OUI",
248 252
    "maj:enfant_4_sanitaire_medecin": "OUI",
249 253
    "maj:enfant_4_sanitaire_vaccin": "OUI",
254
    "maj:enfant_4_sanitaire_handicap": "OUI",
250 255
    "maj:enfant_5": "OUI",
251 256
    "maj:enfant_5_assurance": "OUI",
252 257
    "maj:enfant_5_contact": "OUI",
......
254 259
    "maj:enfant_5_sanitaire_allergie": "OUI",
255 260
    "maj:enfant_5_sanitaire_medecin": "OUI",
256 261
    "maj:enfant_5_sanitaire_vaccin": "OUI",
262
    "maj:enfant_5_sanitaire_handicap": "OUI",
257 263
    "maj:revenus": "OUI",
258 264
    "maj:rl1": "OUI",
259 265
    "maj:rl1_adresse_employeur": "OUI",
tests/test_toulouse_axel.py
969 969
    assert 'VACCIN' in partial_update_params['ENFANT'][1]['SANITAIRE']
970 970

  
971 971

  
972
def test_sanitize_update_family_data_enfant_n_sanitaire_handicap(app, resource, update_params):
973
    Link.objects.create(resource=resource, name_id='yyy', dui='XXX', person_id='42')
974

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

  
1019
    # test maj:enfant_n_sanitaire_handicap not set
1020
    partial_update_params = copy.deepcopy(update_params)
1021
    partial_update_params['maj:enfant_0_sanitaire_handicap'] = None
1022
    with mock.patch('passerelle.contrib.toulouse_axel.models.ref_famille_dui') as operation:
1023
        resource.sanitize_update_family_data(name_id='yyy', post_data=partial_update_params)
1024
    assert operation.call_args_list == []
1025

  
1026

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

  
974 1030
    partial_update_params = copy.deepcopy(update_params)
975 1031
    partial_update_params['maj:enfant_0_contact'] = False
976 1032
    with mock.patch('passerelle.contrib.toulouse_axel.models.ref_famille_dui') as operation:
......
978 1034
        with pytest.raises(APIError, match='Axel error: FooBar'):
979 1035
            resource.sanitize_update_family_data(name_id='yyy', post_data=partial_update_params)
980 1036

  
1037
    partial_update_params = copy.deepcopy(update_params)
1038
    partial_update_params['maj:enfant_0_sanitaire_handicap'] = False
1039
    with mock.patch('passerelle.contrib.toulouse_axel.models.ref_famille_dui') as operation:
1040
        operation.side_effect = AxelError('FooBar')
1041
        with pytest.raises(APIError, match='Axel error: FooBar'):
1042
            resource.sanitize_update_family_data(name_id='yyy', post_data=partial_update_params)
1043

  
981 1044

  
982 1045
def test_update_family_info_endpoint_sanitize_axel_error(app, resource, update_params):
983 1046
    Link.objects.create(resource=resource, name_id='yyy', dui='XXX', person_id='42')
984
-