Projet

Général

Profil

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

Lauréline Guérin, 09 janvier 2020 16:27

Télécharger (11,9 ko)

Voir les différences:

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

 functests/toulouse_axel/test_toulouse_axel.py |  1 +
 passerelle/contrib/toulouse_axel/models.py    | 26 +++++++
 .../flat_update_family_info.json              |  6 ++
 .../toulouse_axel/update_family_info.json     |  6 ++
 tests/test_toulouse_axel.py                   | 67 +++++++++++++++++++
 5 files changed, 106 insertions(+)
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
        ]
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
        })
......
462 463
        raise APIError('Child not found', err_code='not-found')
463 464

  
464 465
    def sanitize_update_family_data(self, name_id, post_data):
466
        family_data = None
467

  
465 468
        # transform ENFANT list to dict, where the key is the field IDPERSONNE
466 469
        # because children in post_date are maybe not in the same order than on Axel side
467 470
        children = {}
......
517 520
                # empty all subelements
518 521
                for k in data[element_to_remove].keys():
519 522
                    data[element_to_remove][k] = None
523
            elif element_to_remove == 'HANDICAP':
524
                # get the correct child
525
                child_data = post_data['ENFANT'][elements[1]]
526
                child_id = child_data['IDPERSONNE']
527
                # get family info
528
                if family_data is None:
529
                    family_data = self.get_family_data(name_id)
530
                for child in family_data['ENFANT']:
531
                    # find the correct child in family info
532
                    if child['IDPERSONNE'] != child_id:
533
                        continue
534
                    # reset handicap related fields
535
                    handicap_fields = [
536
                        'AUTREDIFFICULTE',
537
                        'ECOLESPECIALISEE',
538
                        'INDICATEURAUXILIAIREVS',
539
                        'INDICATEURECOLE',
540
                        'INDICATEURHANDICAP',
541
                        'INDICATEURNOTIFMDPH',
542
                    ]
543
                    for key in handicap_fields:
544
                        child_data['SANITAIRE'][key] = child['SANITAIRE'][key]
545
                    break
520 546
            elif element_to_remove in data:
521 547
                # remove block
522 548
                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
964 964
        assert 'VACCIN' not in partial_update_params['ENFANT'][1]['SANITAIRE']
965 965

  
966 966

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

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

  
1014
    # test maj:enfant_n_sanitaire_handicap not set
1015
    for val in [None, '']:
1016
        partial_update_params = copy.deepcopy(update_params)
1017
        partial_update_params['maj:enfant_0_sanitaire_handicap'] = val
1018
        with mock.patch('passerelle.contrib.toulouse_axel.models.ref_famille_dui') as operation:
1019
            resource.sanitize_update_family_data(name_id='yyy', post_data=partial_update_params)
1020
        assert operation.call_args_list == [mock.call(resource, {'PORTAIL': {'DUI': {'IDDUI': u'XXX'}}})]
1021

  
1022

  
1023
def test_sanitize_update_family_data_axel_error(app, resource, update_params):
1024
    Link.objects.create(resource=resource, name_id='yyy', dui='XXX', person_id='42')
1025

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

  
1033

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