Projet

Général

Profil

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

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

Télécharger (14,5 ko)

Voir les différences:

Subject: [PATCH 3/4] 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
            flag_type['oneOf'].append({'type': 'string', 'enum': ['']})
315 310
        UPDATE_FAMILY_SCHEMA['properties'][flag] = flag_type
316 311
        UPDATE_FAMILY_SCHEMA['required'].append(flag)
312
    sanitaire_properties = UPDATE_FAMILY_SCHEMA['properties']['ENFANT']['items']['properties']['SANITAIRE']['properties']
313
    sanitaire_properties.pop('ALLERGIE')
314
    sanitaire_properties['ALLERGIE'] = {
315
        'type': 'object',
316
        'properties': {},
317
        'required': ['ASTHME', 'MEDICAMENTEUSES', 'ALIMENTAIRES', 'AUTRES'],
318
    }
319
    for key in ['ASTHME', 'MEDICAMENTEUSES', 'ALIMENTAIRES']:
320
        sanitaire_properties['ALLERGIE']['properties'][key] = copy.deepcopy(boolean_type)
321
    sanitaire_properties['ALLERGIE']['properties']['AUTRES'] = {
322
        'oneOf': [
323
            {'type': 'null'},
324
            {
325
                'type': 'string',
326
                'minLength': 0,
327
                'maxLength': 50,
328
            }
329
        ]
330
    }
317 331
    UPDATE_FAMILY_SCHEMA['unflatten'] = True
318 332

  
319 333
    @endpoint(
......
547 561
                # remove block
548 562
                data.pop(element_to_remove)
549 563

  
564
        # transform ALLERGIE block
565
        for child in post_data['ENFANT'].values():
566
            if 'SANITAIRE' not in child:
567
                continue
568
            if 'ALLERGIE' not in child['SANITAIRE']:
569
                continue
570
            new_allergie = []
571
            for key in ['ASTHME', 'MEDICAMENTEUSES', 'ALIMENTAIRES']:
572
                new_allergie.append({
573
                    'TYPE': key,
574
                    'ALLERGIQUE': child['SANITAIRE']['ALLERGIE'][key],
575
                    'NOMALLERGIE': None,
576
                })
577
            if child['SANITAIRE']['ALLERGIE']['AUTRES']:
578
                new_allergie.append({
579
                    'TYPE': 'AUTRES',
580
                    'ALLERGIQUE': 'OUI',
581
                    'NOMALLERGIE': child['SANITAIRE']['ALLERGIE']['AUTRES'],
582
                })
583
            child['SANITAIRE']['ALLERGIE'] = new_allergie
584

  
550 585
        # transform ENFANT dict to a list back
551 586
        post_data['ENFANT'] = post_data['ENFANT'].values()
552 587

  
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
849 849
    # test maj:enfant_n_sanitaire_allergie
850 850
    partial_update_params = copy.deepcopy(update_params)
851 851
    partial_update_params['maj:enfant_1_sanitaire_allergie'] = False
852
    for i, allergie in enumerate(partial_update_params['ENFANT'][0]['SANITAIRE']['ALLERGIE']):
853
        for key in allergie.keys():
854
            partial_update_params['ENFANT'][0]['SANITAIRE']['ALLERGIE'][i][key] = None  # reset fields
852
    for key in partial_update_params['ENFANT'][0]['SANITAIRE']['ALLERGIE'].keys():
853
        partial_update_params['ENFANT'][0]['SANITAIRE']['ALLERGIE'][key] = None  # reset fields
855 854
    partial_update_params['maj:enfant_0'] = False
856 855
    resource.sanitize_update_family_data(name_id='yyy', post_data=partial_update_params)
857 856
    assert len(partial_update_params['ENFANT']) == 1
......
883 882
        assert 'ALLERGIE' not in partial_update_params['ENFANT'][0]['SANITAIRE']
884 883
        assert 'ALLERGIE' not in partial_update_params['ENFANT'][1]['SANITAIRE']
885 884

  
885
    # check values
886
    partial_update_params = copy.deepcopy(update_params)
887
    partial_update_params['maj:enfant_1'] = False
888
    partial_update_params['ENFANT'][0]['SANITAIRE']['ALLERGIE']['ASTHME'] = 'NON'
889
    partial_update_params['ENFANT'][0]['SANITAIRE']['ALLERGIE']['MEDICAMENTEUSES'] = 'NON'
890
    partial_update_params['ENFANT'][0]['SANITAIRE']['ALLERGIE']['ALIMENTAIRES'] = 'NON'
891
    partial_update_params['ENFANT'][0]['SANITAIRE']['ALLERGIE']['AUTRES'] = ''
892
    resource.sanitize_update_family_data(name_id='yyy', post_data=partial_update_params)
893
    assert partial_update_params['ENFANT'][0]['SANITAIRE']['ALLERGIE'] == [
894
        {'TYPE': 'ASTHME', 'ALLERGIQUE': 'NON', 'NOMALLERGIE': None},
895
        {'TYPE': 'MEDICAMENTEUSES', 'ALLERGIQUE': 'NON', 'NOMALLERGIE': None},
896
        {'TYPE': 'ALIMENTAIRES', 'ALLERGIQUE': 'NON', 'NOMALLERGIE': None},
897
    ]
898

  
899
    partial_update_params = copy.deepcopy(update_params)
900
    partial_update_params['maj:enfant_1'] = False
901
    partial_update_params['ENFANT'][0]['SANITAIRE']['ALLERGIE']['ASTHME'] = 'OUI'
902
    partial_update_params['ENFANT'][0]['SANITAIRE']['ALLERGIE']['MEDICAMENTEUSES'] = 'OUI'
903
    partial_update_params['ENFANT'][0]['SANITAIRE']['ALLERGIE']['ALIMENTAIRES'] = 'OUI'
904
    partial_update_params['ENFANT'][0]['SANITAIRE']['ALLERGIE']['AUTRES'] = 'accariens'
905
    resource.sanitize_update_family_data(name_id='yyy', post_data=partial_update_params)
906
    assert partial_update_params['ENFANT'][0]['SANITAIRE']['ALLERGIE'] == [
907
        {'TYPE': 'ASTHME', 'ALLERGIQUE': 'OUI', 'NOMALLERGIE': None},
908
        {'TYPE': 'MEDICAMENTEUSES', 'ALLERGIQUE': 'OUI', 'NOMALLERGIE': None},
909
        {'TYPE': 'ALIMENTAIRES', 'ALLERGIQUE': 'OUI', 'NOMALLERGIE': None},
910
        {'TYPE': 'AUTRES', 'ALLERGIQUE': 'OUI', 'NOMALLERGIE': 'accariens'},
911
    ]
912

  
886 913

  
887 914
def test_sanitize_update_family_data_enfant_n_sanitaire_medecin(app, resource, update_params):
888 915
    Link.objects.create(resource=resource, name_id='yyy', dui='XXX', person_id='42')
889
-