Projet

Général

Profil

0003-toulouse_axel-handle-allergie-fields-38543.patch

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

Télécharger (14,4 ko)

Voir les différences:

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

 functests/toulouse_axel/test_toulouse_axel.py | 28 +++++++-
 passerelle/contrib/toulouse_axel/models.py    | 71 ++++++++++++++-----
 .../flat_update_family_info.json              | 26 +++----
 .../toulouse_axel/update_family_info.json     | 46 ++++--------
 tests/test_toulouse_axel.py                   | 33 ++++++++-
 5 files changed, 128 insertions(+), 76 deletions(-)
functests/toulouse_axel/test_toulouse_axel.py
29 29
    pprint.pprint(data)
30 30
    print('\n')
31 31

  
32
    # take family info and transform them into updatable data
32 33
    payload = data['data']
33
    for key in ['SITUATIONFAMILIALE', 'NBENFANTACTIF', 'NBRLACTIF', 'IDDUI', 'CODEMISEAJOUR']:
34
        payload.pop(key)
34
    # complete required fields
35 35
    payload['N0TELEDOSSIER'] = '42'
36 36
    payload['DROITALIMAGE'] = 'NON'
37
    payload['REVENUS']['CHOIXREVENU'] = ''
38
    # remove non editable fields
39
    for key in ['SITUATIONFAMILIALE', 'NBENFANTACTIF', 'NBRLACTIF', 'IDDUI', 'CODEMISEAJOUR']:
40
        payload.pop(key)
37 41
    for key in ['MONTANTTOTAL', 'DATEVALIDITE', 'SFI', 'IREVENUS', 'RNF']:
38 42
        payload['REVENUS'].pop(key, None)
39
    payload['REVENUS']['CHOIXREVENU'] = ''
40 43
    for enfant in payload['ENFANT']:
41 44
        for key in ['NOM', 'DATENAISSANCE', 'SEXE', 'PRENOMPERE', 'PRENOMMERE', 'NOMPERE', 'NOMMERE', 'RATTACHEAUTREDUI', 'PRENOM']:
42 45
            enfant.pop(key)
43 46
        enfant['AUTORISATIONURGENCEMEDICALE'] = 'OUI'
47
        # manage allergie data (not the same schema)
48
        if 'SANITAIRE' not in enfant:
49
            continue
50
        if 'ALLERGIE' not in enfant['SANITAIRE']:
51
            continue
52
        new_allergie = {
53
            'ASTHME': False,
54
            'MEDICAMENTEUSES': False,
55
            'ALIMENTAIRES': False,
56
            'AUTRES': None,
57
        }
58
        for allergie in enfant['SANITAIRE']['ALLERGIE']:
59
            if allergie['TYPE'] == 'AUTRES':
60
                if allergie['ALLERGIQUE'] == 'OUI':
61
                    new_allergie['AUTRES'] = allergie['NOMALLERGIE']
62
                continue
63
            new_allergie[allergie['TYPE']] = allergie['ALLERGIQUE']
64
        enfant['SANITAIRE']['ALLERGIE'] = new_allergie
65
    # add partial update flags
44 66
    flags = [
45 67
        'maj:adresse',
46 68
        'maj:rl1', 'maj:rl1_adresse_employeur',
passerelle/contrib/toulouse_axel/models.py
41 41
BASE_XSD_PATH = os.path.join(os.path.dirname(__file__), 'xsd')
42 42

  
43 43

  
44
boolean_type = {
45
    'oneOf': [
46
        {'type': 'boolean'},
47
        {
48
            'type': 'string',
49
            'pattern': '[Oo][Uu][Ii]|[Nn][Oo][Nn]|[Tt][Rr][Uu][Ee]|[Ff][Aa][Ll][Ss][Ee]|1|0',
50
        }
51
    ]
52
}
53

  
54

  
44 55
def indent(tree, space="  ", level=0):
45 56
    # backport from Lib/xml/etree/ElementTree.py python 3.9
46 57
    if isinstance(tree, ET.ElementTree):
......
123 134

  
124 135
    @classmethod
125 136
    def schema_bool(cls):
126
        return {
127
            'oneOf': [
128
                {'type': 'boolean'},
129
                {
130
                    'type': 'string',
131
                    'pattern': '[Oo][Uu][Ii]|[Nn][Oo][Nn]|[Tt][Rr][Uu][Ee]|[Ff][Aa][Ll][Ss][Ee]|1|0',
132
                }
133
            ]
134
        }
137
        return copy.deepcopy(boolean_type)
135 138

  
136 139
    def encode_bool(self, obj):
137 140
        return encode_bool(obj)
......
300 303
    UPDATE_FAMILY_SCHEMA['required'].remove('DATEDEMANDE')
301 304
    UPDATE_FAMILY_SCHEMA['required'].remove('QUIACTUALISEDUI')
302 305
    for flag in sorted(UPDATE_FAMILY_FLAGS.keys()):
303
        flag_type = {
304
            'oneOf': [
305
                {'type': 'boolean'},
306
                {
307
                    'type': 'string',
308
                    'pattern': '[Oo][Uu][Ii]|[Nn][Oo][Nn]|[Tt][Rr][Uu][Ee]|[Ff][Aa][Ll][Ss][Ee]|1|0',
309
                }
310
            ]
311
        }
306
        flag_type = copy.deepcopy(boolean_type)
312 307
        if flag not in UPDATE_FAMILY_REQUIRED_FLAGS:
313 308
            flag_type['oneOf'].append({'type': 'null'})
314 309
        UPDATE_FAMILY_SCHEMA['properties'][flag] = flag_type
315 310
        UPDATE_FAMILY_SCHEMA['required'].append(flag)
311
    sanitaire_properties = UPDATE_FAMILY_SCHEMA['properties']['ENFANT']['items']['properties']['SANITAIRE']['properties']
312
    sanitaire_properties.pop('ALLERGIE')
313
    sanitaire_properties['ALLERGIE'] = {
314
        'type': 'object',
315
        'properties': {},
316
        'required': ['ASTHME', 'MEDICAMENTEUSES', 'ALIMENTAIRES', 'AUTRES'],
317
    }
318
    for key in ['ASTHME', 'MEDICAMENTEUSES', 'ALIMENTAIRES']:
319
        sanitaire_properties['ALLERGIE']['properties'][key] = copy.deepcopy(boolean_type)
320
    sanitaire_properties['ALLERGIE']['properties']['AUTRES'] = {
321
        'oneOf': [
322
            {'type': 'null'},
323
            {
324
                'type': 'string',
325
                'minLength': 0,
326
                'maxLength': 50,
327
            }
328
        ]
329
    }
316 330
    UPDATE_FAMILY_SCHEMA['unflatten'] = True
317 331

  
318 332
    @endpoint(
......
557 571
                # remove block
558 572
                data.pop(element_to_remove)
559 573

  
574
        # transform ALLERGIE block
575
        for child in post_data['ENFANT'].values():
576
            if 'SANITAIRE' not in child:
577
                continue
578
            if 'ALLERGIE' not in child['SANITAIRE']:
579
                continue
580
            new_allergie = []
581
            for key in ['ASTHME', 'MEDICAMENTEUSES', 'ALIMENTAIRES']:
582
                new_allergie.append({
583
                    'TYPE': key,
584
                    'ALLERGIQUE': child['SANITAIRE']['ALLERGIE'][key],
585
                    'NOMALLERGIE': None,
586
                })
587
            if child['SANITAIRE']['ALLERGIE']['AUTRES']:
588
                new_allergie.append({
589
                    'TYPE': 'AUTRES',
590
                    'ALLERGIQUE': 'OUI',
591
                    'NOMALLERGIE': child['SANITAIRE']['ALLERGIE']['AUTRES'],
592
                })
593
            child['SANITAIRE']['ALLERGIE'] = new_allergie
594

  
560 595
        # transform ENFANT dict to a list back
561 596
        post_data['ENFANT'] = post_data['ENFANT'].values()
562 597

  
tests/data/toulouse_axel/flat_update_family_info.json
36 36
  "ENFANT/0/CONTACT/2/TELFIXE": "0505050505",
37 37
  "ENFANT/0/CONTACT/2/TELPORTABLE": "0606060606",
38 38
  "ENFANT/0/IDPERSONNE": "4242",
39
  "ENFANT/0/SANITAIRE/ALLERGIE/0/ALLERGIQUE": "OUI",
40
  "ENFANT/0/SANITAIRE/ALLERGIE/0/NOMALLERGIE": "",
41
  "ENFANT/0/SANITAIRE/ALLERGIE/0/TYPE": "ASTHME",
42
  "ENFANT/0/SANITAIRE/ALLERGIE/1/ALLERGIQUE": "OUI",
43
  "ENFANT/0/SANITAIRE/ALLERGIE/1/NOMALLERGIE": "",
44
  "ENFANT/0/SANITAIRE/ALLERGIE/1/TYPE": "MEDICAMENTEUSES",
45
  "ENFANT/0/SANITAIRE/ALLERGIE/2/ALLERGIQUE": "OUI",
46
  "ENFANT/0/SANITAIRE/ALLERGIE/2/NOMALLERGIE": "",
47
  "ENFANT/0/SANITAIRE/ALLERGIE/2/TYPE": "ALIMENTAIRES",
39
  "ENFANT/0/SANITAIRE/ALLERGIE/ASTHME": "OUI",
40
  "ENFANT/0/SANITAIRE/ALLERGIE/MEDICAMENTEUSES": "OUI",
41
  "ENFANT/0/SANITAIRE/ALLERGIE/ALIMENTAIRES": "OUI",
42
  "ENFANT/0/SANITAIRE/ALLERGIE/AUTRES": "",
48 43
  "ENFANT/0/SANITAIRE/AUTREDIFFICULTE": "",
49 44
  "ENFANT/0/SANITAIRE/DATEFINVALIDITE": "2020-12-31",
50 45
  "ENFANT/0/SANITAIRE/ECOLESPECIALISEE": "",
......
72 67
  "ENFANT/1/ASSURANCE/NUMERO": "1234",
73 68
  "ENFANT/1/AUTORISATIONURGENCEMEDICALE": "OUI",
74 69
  "ENFANT/1/IDPERSONNE": "3535",
75
  "ENFANT/1/SANITAIRE/ALLERGIE/0/ALLERGIQUE": "OUI",
76
  "ENFANT/1/SANITAIRE/ALLERGIE/0/NOMALLERGIE": "",
77
  "ENFANT/1/SANITAIRE/ALLERGIE/0/TYPE": "ASTHME",
78
  "ENFANT/1/SANITAIRE/ALLERGIE/1/ALLERGIQUE": "OUI",
79
  "ENFANT/1/SANITAIRE/ALLERGIE/1/NOMALLERGIE": "",
80
  "ENFANT/1/SANITAIRE/ALLERGIE/1/TYPE": "MEDICAMENTEUSES",
81
  "ENFANT/1/SANITAIRE/ALLERGIE/2/ALLERGIQUE": "OUI",
82
  "ENFANT/1/SANITAIRE/ALLERGIE/2/NOMALLERGIE": "",
83
  "ENFANT/1/SANITAIRE/ALLERGIE/2/TYPE": "ALIMENTAIRES",
70
  "ENFANT/1/SANITAIRE/ALLERGIE/ASTHME": "OUI",
71
  "ENFANT/1/SANITAIRE/ALLERGIE/MEDICAMENTEUSES": "OUI",
72
  "ENFANT/1/SANITAIRE/ALLERGIE/ALIMENTAIRES": "OUI",
73
  "ENFANT/1/SANITAIRE/ALLERGIE/AUTRES": "",
84 74
  "ENFANT/1/SANITAIRE/AUTREDIFFICULTE": "",
85 75
  "ENFANT/1/SANITAIRE/DATEFINVALIDITE": "2020-12-31",
86 76
  "ENFANT/1/SANITAIRE/ECOLESPECIALISEE": "",
tests/data/toulouse_axel/update_family_info.json
51 51
            ],
52 52
            "IDPERSONNE": "4242",
53 53
            "SANITAIRE": {
54
                "ALLERGIE": [
55
                    {
56
                        "ALLERGIQUE": "OUI",
57
                        "NOMALLERGIE": null,
58
                        "TYPE": "ASTHME"
59
                    },
60
                    {
61
                        "ALLERGIQUE": "OUI",
62
                        "NOMALLERGIE": null,
63
                        "TYPE": "MEDICAMENTEUSES"
64
                    },
65
                    {
66
                        "ALLERGIQUE": "OUI",
67
                        "NOMALLERGIE": null,
68
                        "TYPE": "ALIMENTAIRES"
69
                    }
70
                ],
54
                "ALLERGIE": {
55
                    "ASTHME": "OUI",
56
                    "MEDICAMENTEUSES": "OUI",
57
                    "ALIMENTAIRES": "OUI",
58
                    "AUTRES": null
59
                },
71 60
                "AUTREDIFFICULTE": null,
72 61
                "DATEFINVALIDITE": "2020-12-31",
73 62
                "ECOLESPECIALISEE": null,
......
105 94
            "AUTORISATIONURGENCEMEDICALE": "OUI",
106 95
            "IDPERSONNE": "3535",
107 96
            "SANITAIRE": {
108
                "ALLERGIE": [
109
                    {
110
                        "ALLERGIQUE": "OUI",
111
                        "NOMALLERGIE": null,
112
                        "TYPE": "ASTHME"
113
                    },
114
                    {
115
                        "ALLERGIQUE": "OUI",
116
                        "NOMALLERGIE": null,
117
                        "TYPE": "MEDICAMENTEUSES"
118
                    },
119
                    {
120
                        "ALLERGIQUE": "OUI",
121
                        "NOMALLERGIE": null,
122
                        "TYPE": "ALIMENTAIRES"
123
                    }
124
                ],
97
                "ALLERGIE": {
98
                    "ASTHME": "OUI",
99
                    "MEDICAMENTEUSES": "OUI",
100
                    "ALIMENTAIRES": "OUI",
101
                    "AUTRES": null
102
                },
125 103
                "AUTREDIFFICULTE": null,
126 104
                "DATEFINVALIDITE": "2020-12-31",
127 105
                "ECOLESPECIALISEE": null,
tests/test_toulouse_axel.py
857 857
    # test maj:enfant_n_sanitaire_allergie
858 858
    partial_update_params = copy.deepcopy(update_params)
859 859
    partial_update_params['maj:enfant_1_sanitaire_allergie'] = False
860
    for i, allergie in enumerate(partial_update_params['ENFANT'][0]['SANITAIRE']['ALLERGIE']):
861
        for key in allergie.keys():
862
            partial_update_params['ENFANT'][0]['SANITAIRE']['ALLERGIE'][i][key] = None  # reset fields
860
    for key in partial_update_params['ENFANT'][0]['SANITAIRE']['ALLERGIE'].keys():
861
        partial_update_params['ENFANT'][0]['SANITAIRE']['ALLERGIE'][key] = None  # reset fields
863 862
    partial_update_params['maj:enfant_0'] = False
864 863
    resource.sanitize_update_family_data(name_id='yyy', post_data=partial_update_params)
865 864
    assert len(partial_update_params['ENFANT']) == 1
......
890 889
    assert 'ALLERGIE' in partial_update_params['ENFANT'][0]['SANITAIRE']
891 890
    assert 'ALLERGIE' in partial_update_params['ENFANT'][1]['SANITAIRE']
892 891

  
892
    # check values
893
    partial_update_params = copy.deepcopy(update_params)
894
    partial_update_params['maj:enfant_1'] = False
895
    partial_update_params['ENFANT'][0]['SANITAIRE']['ALLERGIE']['ASTHME'] = 'NON'
896
    partial_update_params['ENFANT'][0]['SANITAIRE']['ALLERGIE']['MEDICAMENTEUSES'] = 'NON'
897
    partial_update_params['ENFANT'][0]['SANITAIRE']['ALLERGIE']['ALIMENTAIRES'] = 'NON'
898
    partial_update_params['ENFANT'][0]['SANITAIRE']['ALLERGIE']['AUTRES'] = ''
899
    resource.sanitize_update_family_data(name_id='yyy', post_data=partial_update_params)
900
    assert partial_update_params['ENFANT'][0]['SANITAIRE']['ALLERGIE'] == [
901
        {'TYPE': 'ASTHME', 'ALLERGIQUE': 'NON', 'NOMALLERGIE': None},
902
        {'TYPE': 'MEDICAMENTEUSES', 'ALLERGIQUE': 'NON', 'NOMALLERGIE': None},
903
        {'TYPE': 'ALIMENTAIRES', 'ALLERGIQUE': 'NON', 'NOMALLERGIE': None},
904
    ]
905

  
906
    partial_update_params = copy.deepcopy(update_params)
907
    partial_update_params['maj:enfant_1'] = False
908
    partial_update_params['ENFANT'][0]['SANITAIRE']['ALLERGIE']['ASTHME'] = 'OUI'
909
    partial_update_params['ENFANT'][0]['SANITAIRE']['ALLERGIE']['MEDICAMENTEUSES'] = 'OUI'
910
    partial_update_params['ENFANT'][0]['SANITAIRE']['ALLERGIE']['ALIMENTAIRES'] = 'OUI'
911
    partial_update_params['ENFANT'][0]['SANITAIRE']['ALLERGIE']['AUTRES'] = 'accariens'
912
    resource.sanitize_update_family_data(name_id='yyy', post_data=partial_update_params)
913
    assert partial_update_params['ENFANT'][0]['SANITAIRE']['ALLERGIE'] == [
914
        {'TYPE': 'ASTHME', 'ALLERGIQUE': 'OUI', 'NOMALLERGIE': None},
915
        {'TYPE': 'MEDICAMENTEUSES', 'ALLERGIQUE': 'OUI', 'NOMALLERGIE': None},
916
        {'TYPE': 'ALIMENTAIRES', 'ALLERGIQUE': 'OUI', 'NOMALLERGIE': None},
917
        {'TYPE': 'AUTRES', 'ALLERGIQUE': 'OUI', 'NOMALLERGIE': 'accariens'},
918
    ]
919

  
893 920

  
894 921
def test_sanitize_update_family_data_enfant_n_sanitaire_medecin(app, resource, update_params):
895 922
    Link.objects.create(resource=resource, name_id='yyy', dui='XXX', person_id='42')
896
-