Projet

Général

Profil

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

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

Télécharger (14,5 ko)

Voir les différences:

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

 functests/toulouse_axel/test_toulouse_axel.py | 25 ++++++-
 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, 125 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)
......
55 58
        enfant['SANITAIRE']['HANDICAP'] = {}
56 59
        for key in handicap_fields:
57 60
            enfant['SANITAIRE']['HANDICAP'][key] = enfant['SANITAIRE'].pop(key)
61
        # manage allergie data (not the same schema)
62
        if 'ALLERGIE' not in enfant['SANITAIRE']:
63
            continue
64
        new_allergie = {
65
            'ASTHME': False,
66
            'MEDICAMENTEUSES': False,
67
            'ALIMENTAIRES': False,
68
            'AUTRES': None,
69
        }
70
        for allergie in enfant['SANITAIRE']['ALLERGIE']:
71
            if allergie['TYPE'] == 'AUTRES':
72
                if allergie['ALLERGIQUE'] == 'OUI':
73
                    new_allergie['AUTRES'] = allergie['NOMALLERGIE']
74
                continue
75
            new_allergie[allergie['TYPE']] = allergie['ALLERGIQUE']
76
        enfant['SANITAIRE']['ALLERGIE'] = new_allergie
58 77
    # add partial update flags
59 78
    flags = [
60 79
        'maj:adresse',
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)
......
296 299
        form_maj_famille_dui.request_schema['properties']['PORTAIL']['properties']['DUI'])
297 300

  
298 301
    for flag in sorted(UPDATE_FAMILY_FLAGS.keys()):
299
        flag_type = {
300
            'oneOf': [
301
                {'type': 'boolean'},
302
                {
303
                    'type': 'string',
304
                    'pattern': '[Oo][Uu][Ii]|[Nn][Oo][Nn]|[Tt][Rr][Uu][Ee]|[Ff][Aa][Ll][Ss][Ee]|1|0',
305
                }
306
            ]
307
        }
302
        flag_type = copy.deepcopy(boolean_type)
308 303
        if flag not in UPDATE_FAMILY_REQUIRED_FLAGS:
309 304
            flag_type['oneOf'].append({'type': 'null'})
310 305
            flag_type['oneOf'].append({'type': 'string', 'enum': ['']})
......
338 333
        sanitaire_properties['HANDICAP']['properties'][key] = field
339 334
        sanitaire_required.remove(key)
340 335

  
336
    sanitaire_properties.pop('ALLERGIE')
337
    sanitaire_properties['ALLERGIE'] = {
338
        'type': 'object',
339
        'properties': {},
340
        'required': ['ASTHME', 'MEDICAMENTEUSES', 'ALIMENTAIRES', 'AUTRES'],
341
    }
342
    for key in ['ASTHME', 'MEDICAMENTEUSES', 'ALIMENTAIRES']:
343
        sanitaire_properties['ALLERGIE']['properties'][key] = copy.deepcopy(boolean_type)
344
    sanitaire_properties['ALLERGIE']['properties']['AUTRES'] = {
345
        'oneOf': [
346
            {'type': 'null'},
347
            {
348
                'type': 'string',
349
                'minLength': 0,
350
                'maxLength': 50,
351
            }
352
        ]
353
    }
354

  
341 355
    UPDATE_FAMILY_SCHEMA['unflatten'] = True
342 356

  
343 357
    @endpoint(
......
577 591
                continue
578 592
            child['SANITAIRE'].update(child['SANITAIRE'].pop('HANDICAP'))
579 593

  
594
        # transform ALLERGIE block
595
        for child in post_data['ENFANT'].values():
596
            if 'SANITAIRE' not in child:
597
                continue
598
            if 'ALLERGIE' not in child['SANITAIRE']:
599
                continue
600
            new_allergie = []
601
            for key in ['ASTHME', 'MEDICAMENTEUSES', 'ALIMENTAIRES']:
602
                new_allergie.append({
603
                    'TYPE': key,
604
                    'ALLERGIQUE': child['SANITAIRE']['ALLERGIE'][key],
605
                    'NOMALLERGIE': None,
606
                })
607
            if child['SANITAIRE']['ALLERGIE']['AUTRES']:
608
                new_allergie.append({
609
                    'TYPE': 'AUTRES',
610
                    'ALLERGIQUE': 'OUI',
611
                    'NOMALLERGIE': child['SANITAIRE']['ALLERGIE']['AUTRES'],
612
                })
613
            child['SANITAIRE']['ALLERGIE'] = new_allergie
614

  
580 615
        # transform ENFANT dict to a list back
581 616
        post_data['ENFANT'] = post_data['ENFANT'].values()
582 617

  
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/DATEFINVALIDITE": "2020-12-31",
49 44
  "ENFANT/0/SANITAIRE/HANDICAP/AUTREDIFFICULTE": "",
50 45
  "ENFANT/0/SANITAIRE/HANDICAP/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/DATEFINVALIDITE": "2020-12-31",
85 75
  "ENFANT/1/SANITAIRE/HANDICAP/AUTREDIFFICULTE": "",
86 76
  "ENFANT/1/SANITAIRE/HANDICAP/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
                "DATEFINVALIDITE": "2020-12-31",
72 61
                "HANDICAP": {
73 62
                    "AUTREDIFFICULTE": null,
......
107 96
            "AUTORISATIONURGENCEMEDICALE": "OUI",
108 97
            "IDPERSONNE": "3535",
109 98
            "SANITAIRE": {
110
                "ALLERGIE": [
111
                    {
112
                        "ALLERGIQUE": "OUI",
113
                        "NOMALLERGIE": null,
114
                        "TYPE": "ASTHME"
115
                    },
116
                    {
117
                        "ALLERGIQUE": "OUI",
118
                        "NOMALLERGIE": null,
119
                        "TYPE": "MEDICAMENTEUSES"
120
                    },
121
                    {
122
                        "ALLERGIQUE": "OUI",
123
                        "NOMALLERGIE": null,
124
                        "TYPE": "ALIMENTAIRES"
125
                    }
126
                ],
99
                "ALLERGIE": {
100
                    "ASTHME": "OUI",
101
                    "MEDICAMENTEUSES": "OUI",
102
                    "ALIMENTAIRES": "OUI",
103
                    "AUTRES": null
104
                },
127 105
                "DATEFINVALIDITE": "2020-12-31",
128 106
                "HANDICAP": {
129 107
                    "AUTREDIFFICULTE": null,
tests/test_toulouse_axel.py
850 850
    # test maj:enfant_n_sanitaire_allergie
851 851
    partial_update_params = copy.deepcopy(update_params)
852 852
    partial_update_params['maj:enfant_1_sanitaire_allergie'] = False
853
    for i, allergie in enumerate(partial_update_params['ENFANT'][0]['SANITAIRE']['ALLERGIE']):
854
        for key in allergie.keys():
855
            partial_update_params['ENFANT'][0]['SANITAIRE']['ALLERGIE'][i][key] = None  # reset fields
853
    for key in partial_update_params['ENFANT'][0]['SANITAIRE']['ALLERGIE'].keys():
854
        partial_update_params['ENFANT'][0]['SANITAIRE']['ALLERGIE'][key] = None  # reset fields
856 855
    partial_update_params['maj:enfant_0'] = False
857 856
    resource.sanitize_update_family_data(name_id='yyy', post_data=partial_update_params)
858 857
    assert len(partial_update_params['ENFANT']) == 1
......
884 883
        assert 'ALLERGIE' not in partial_update_params['ENFANT'][0]['SANITAIRE']
885 884
        assert 'ALLERGIE' not in partial_update_params['ENFANT'][1]['SANITAIRE']
886 885

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

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

  
887 914

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