Projet

Général

Profil

0001-toulouse_axel-add-registration-info-to-family-info-e.patch

Lauréline Guérin, 30 janvier 2020 15:53

Télécharger (21 ko)

Voir les différences:

Subject: [PATCH] toulouse_axel: add registration info to family info endpoints
 (#39242)

 functests/toulouse_axel/test_toulouse_axel.py |   3 +-
 passerelle/contrib/toulouse_axel/models.py    |  81 ++++++++++----
 tests/test_toulouse_axel.py                   | 101 ++++++++++++++++--
 3 files changed, 155 insertions(+), 30 deletions(-)
functests/toulouse_axel/test_toulouse_axel.py
55 55
    for key in ['MONTANTTOTAL', 'DATEVALIDITE', 'SFI', 'IREVENUS', 'RNF', 'NBENFANTSACHARGE']:
56 56
        payload['REVENUS'].pop(key, None)
57 57
    for enfant in payload['ENFANT']:
58
        for key in ['NOM', 'DATENAISSANCE', 'SEXE', 'PRENOMPERE', 'PRENOMMERE', 'NOMPERE', 'NOMMERE', 'RATTACHEAUTREDUI', 'PRENOM']:
58
        for key in ['NOM', 'DATENAISSANCE', 'SEXE', 'PRENOMPERE', 'PRENOMMERE', 'NOMPERE', 'NOMMERE', 'RATTACHEAUTREDUI', 'PRENOM',
59
                    'clae_cantine_current', 'clae_cantine_next']:
59 60
            enfant.pop(key)
60 61
        enfant['AUTORISATIONURGENCEMEDICALE'] = 'OUI'
61 62
        if 'SANITAIRE' not in enfant:
passerelle/contrib/toulouse_axel/models.py
452 452
        link.delete()
453 453
        return {'link': link_id, 'deleted': True, 'dui': link.dui}
454 454

  
455
    def get_family_data(self, name_id):
456
        link = self.get_link(name_id)
455
    def get_family_data(self, dui, check_registrations=False):
457 456
        try:
458
            result = ref_famille_dui(self, {'PORTAIL': {'DUI': {'IDDUI': link.dui}}})
457
            result = ref_famille_dui(self, {'PORTAIL': {'DUI': {'IDDUI': dui}}})
459 458
        except AxelError as e:
460 459
            raise APIError(
461 460
                'Axel error: %s' % e,
462 461
                err_code='error',
463 462
                data={'xml_request': e.xml_request,
464 463
                      'xml_response': e.xml_response})
465
        return result.json_response['DATA']['PORTAIL']['DUI']
464
        family_data = result.json_response['DATA']['PORTAIL']['DUI']
465

  
466
        if check_registrations:
467
            today = datetime.date.today()
468
            current_reference_year = utils.get_reference_year_from_date(today)
469
            next_reference_year = current_reference_year + 1
470

  
471
            children_registred_for_current_year = self.are_children_registered(
472
                dui=dui,
473
                reference_year=current_reference_year)
474
            children_registred_for_next_year = self.are_children_registered(
475
                dui=dui,
476
                reference_year=next_reference_year)
477

  
478
            for child in family_data.get('ENFANT', []):
479
                child['clae_cantine_current'] = children_registred_for_current_year.get(child['IDPERSONNE'])
480
                child['clae_cantine_next'] = children_registred_for_next_year.get(child['IDPERSONNE'])
481

  
482
        return family_data
466 483

  
467 484
    @endpoint(
468 485
        description=_("Get information about user's family"),
......
471 488
            'NameID': {'description': _('Publik ID')},
472 489
        })
473 490
    def family_info(self, request, NameID):
474
        family_data = self.get_family_data(NameID)
491
        link = self.get_link(NameID)
492
        family_data = self.get_family_data(link.dui, check_registrations=True)
475 493
        return {'data': family_data}
476 494

  
477 495
    @endpoint(
......
482 500
            'idpersonne': {'description': _('Child ID')},
483 501
        })
484 502
    def child_info(self, request, idpersonne, NameID):
485
        family_data = self.get_family_data(NameID)
503
        link = self.get_link(NameID)
504
        family_data = self.get_family_data(link.dui, check_registrations=True)
486 505

  
487
        for child in family_data['ENFANT']:
506
        for child in family_data.get('ENFANT', []):
488 507
            if child['IDPERSONNE'] == idpersonne:
489 508
                return {'data': child}
490 509

  
......
564 583

  
565 584
    UPDATE_FAMILY_SCHEMA['pre_process'] = pre_sanitize_update_family_data
566 585

  
567
    def sanitize_update_family_data(self, name_id, post_data):
586
    def sanitize_update_family_data(self, dui, post_data):
568 587
        family_data = None
569 588

  
570 589
        for i, child_data in enumerate(post_data.get('ENFANT', [])):
......
576 595
                continue
577 596
            # get family info
578 597
            if family_data is None:
579
                family_data = self.get_family_data(name_id)
580
            for orig_child in family_data['ENFANT']:
598
                family_data = self.get_family_data(dui)
599
            for orig_child in family_data.get('ENFANT', []):
581 600
                # find the correct child in family info
582 601
                if orig_child['IDPERSONNE'] != child_id:
583 602
                    continue
......
624 643
            if rl not in post_data:
625 644
                continue
626 645
            if family_data is None:
627
                family_data = self.get_family_data(name_id)
646
                family_data = self.get_family_data(dui)
628 647
            # fill missing fields
629 648
            for key in ['IDPERSONNE', 'NOM', 'PRENOM', 'NOMJEUNEFILLE', 'DATENAISSANCE', 'CIVILITE']:
630 649
                post_data[rl][key] = family_data[rl][key]
......
633 652
        # fill NBENFANTSACHARGE
634 653
        if 'REVENUS' in post_data:
635 654
            if family_data is None:
636
                family_data = self.get_family_data(name_id)
655
                family_data = self.get_family_data(dui)
637 656
            post_data['REVENUS']['NBENFANTSACHARGE'] = family_data.get('REVENUS', {}).get('NBENFANTSACHARGE')
638 657

  
639 658
        # remove flags
......
660 679
        post_data['IDDUI'] = link.dui
661 680
        post_data['DATEDEMANDE'] = datetime.date.today().strftime('%Y-%m-%d')
662 681

  
663
        self.sanitize_update_family_data(name_id=NameID, post_data=post_data)
682
        self.sanitize_update_family_data(dui=link.dui, post_data=post_data)
664 683

  
665 684
        if 'RL2' in post_data and post_data['RL2'].get('IDPERSONNE') == link.person_id:
666 685
            post_data['QUIACTUALISEDUI'] = '2'
......
884 903
                      'xml_response': e.xml_response})
885 904
        return {'data': True}
886 905

  
887
    def get_child_activities(self, dui, reference_year, child_id):
906
    def get_children_activities(self, dui, reference_year):
888 907
        try:
889 908
            result = enfants_activites(self, {
890 909
                'DUI': {
......
900 919
                data={'xml_request': e.xml_request,
901 920
                      'xml_response': e.xml_response})
902 921

  
903
        child_activities_data = result.json_response['DATA']['PORTAIL']['DUI'].get('ENFANT', [])
904
        for child in child_activities_data:
905
            if child['IDPERSONNE'] == child_id:
906
                return child
922
        children_activities = result.json_response['DATA']['PORTAIL']['DUI'].get('ENFANT', [])
923
        return {child['IDPERSONNE']: child for child in children_activities}
907 924

  
908
        raise APIError('Child not found', err_code='not-found')
925
    def get_child_activities(self, dui, reference_year, child_id):
926
        children_activities = self.get_children_activities(dui=dui, reference_year=reference_year)
927

  
928
        if child_id not in children_activities:
929
            raise APIError('Child not found', err_code='not-found')
930

  
931
        return children_activities[child_id]
932

  
933
    def are_children_registered(self, dui, reference_year):
934
        # check reference_year
935
        today = datetime.date.today()
936
        current_reference_year = utils.get_reference_year_from_date(today)
937
        # don't check registration for other years than current and next
938
        if reference_year not in [current_reference_year, current_reference_year + 1]:
939
            return {}
940
        # if next year, check dates.
941
        # check registration for next year only in june or july
942
        if reference_year == current_reference_year + 1 and today.month not in [6, 7]:
943
            return {}
944

  
945
        # ok, check registrations
946
        try:
947
            children_activities = self.get_children_activities(dui=dui, reference_year=reference_year)
948
        except APIError:
949
            # don't fail on the check
950
            return {}
951
        return {child_id: bool(child.get('ACTIVITE', [])) for child_id, child in children_activities.items()}
909 952

  
910 953
    @endpoint(
911 954
        description=_("Get information about CLAE booking"),
tests/test_toulouse_axel.py
24 24
import os
25 25
import xml.etree.ElementTree as ET
26 26

  
27
import freezegun
27 28
import pytest
28 29
import xmlschema
29 30

  
......
44 45
    ref_verif_dui,
45 46
    reservation_periode,
46 47
)
48
from passerelle.contrib.toulouse_axel.utils import get_reference_year_from_date
47 49
from passerelle.utils.jsonresponse import APIError
48 50
import utils
49 51

  
......
662 664
        'TELFIXE',
663 665
    ])
664 666

  
667
    with mock.patch('passerelle.contrib.toulouse_axel.models.ToulouseAxel.are_children_registered') as registered:
668
        registered.side_effect = [{'4242': True}, {}]
669
        with mock_getdata(content, 'RefFamilleDui'):
670
            resp = app.get('/toulouse-axel/test/family_info?NameID=yyy')
671
    assert resp.json['err'] == 0
672
    assert resp.json['data']['ENFANT'][0]['clae_cantine_current'] is True
673
    assert resp.json['data']['ENFANT'][0]['clae_cantine_next'] is None
674
    assert resp.json['data']['ENFANT'][1]['clae_cantine_current'] is None
675
    assert resp.json['data']['ENFANT'][1]['clae_cantine_next'] is None
676

  
677
    with mock.patch('passerelle.contrib.toulouse_axel.models.ToulouseAxel.are_children_registered') as registered:
678
        registered.side_effect = [{}, {'4242': False, '3535': True}]
679
        with mock_getdata(content, 'RefFamilleDui'):
680
            resp = app.get('/toulouse-axel/test/family_info?NameID=yyy')
681
    assert resp.json['err'] == 0
682
    assert resp.json['data']['ENFANT'][0]['clae_cantine_current'] is None
683
    assert resp.json['data']['ENFANT'][0]['clae_cantine_next'] is False
684
    assert resp.json['data']['ENFANT'][1]['clae_cantine_current'] is None
685
    assert resp.json['data']['ENFANT'][1]['clae_cantine_next'] is True
686

  
665 687

  
666 688
def test_child_info_endpoint_axel_error(app, resource):
667 689
    Link.objects.create(resource=resource, name_id='yyy', dui='XXX', person_id='42')
......
709 731
        'RATTACHEAUTREDUI',
710 732
        'SANITAIRE',
711 733
        'SEXE',
734
        'clae_cantine_current',
735
        'clae_cantine_next',
712 736
    ])
713 737

  
738
    with mock.patch('passerelle.contrib.toulouse_axel.models.ToulouseAxel.are_children_registered') as registered:
739
        registered.side_effect = [{'4242': True}, {}]
740
        with mock_getdata(content, 'RefFamilleDui'):
741
            resp = app.get('/toulouse-axel/test/child_info?NameID=yyy&idpersonne=4242')
742
    assert resp.json['err'] == 0
743
    assert resp.json['data']['clae_cantine_current'] is True
744
    assert resp.json['data']['clae_cantine_next'] is None
745

  
746
    with mock.patch('passerelle.contrib.toulouse_axel.models.ToulouseAxel.are_children_registered') as registered:
747
        registered.side_effect = [{}, {'4242': False}]
748
        with mock_getdata(content, 'RefFamilleDui'):
749
            resp = app.get('/toulouse-axel/test/child_info?NameID=yyy&idpersonne=4242')
750
    assert resp.json['err'] == 0
751
    assert resp.json['data']['clae_cantine_current'] is None
752
    assert resp.json['data']['clae_cantine_next'] is False
753

  
714 754

  
715 755
def test_update_family_info_endpoint_axel_error(app, resource, update_params, family_data):
716 756
    Link.objects.create(resource=resource, name_id='yyy', dui='XXX', person_id='42')
......
786 826
        assert key not in full_update_params['RL2']
787 827

  
788 828
    with mock.patch('passerelle.contrib.toulouse_axel.models.ToulouseAxel.get_family_data', return_value=family_data):
789
        resource.sanitize_update_family_data(name_id='yyy', post_data=full_update_params)
829
        resource.sanitize_update_family_data(dui='XXX', post_data=full_update_params)
790 830
    for key in ['IDPERSONNE', 'NOM', 'PRENOM', 'NOMJEUNEFILLE', 'DATENAISSANCE', 'CIVILITE']:
791 831
        assert full_update_params['RL1'][key] == family_data['RL1'][key]
792 832
        assert full_update_params['RL2'][key] == family_data['RL2'][key]
......
801 841
    assert 'NBENFANTSACHARGE' not in update_params['REVENUS']
802 842

  
803 843
    with mock.patch('passerelle.contrib.toulouse_axel.models.ToulouseAxel.get_family_data', return_value=family_data):
804
        resource.sanitize_update_family_data(name_id='yyy', post_data=full_update_params)
844
        resource.sanitize_update_family_data(dui='XXX', post_data=full_update_params)
805 845
    assert full_update_params['REVENUS']['NBENFANTSACHARGE'] == family_data['REVENUS']['NBENFANTSACHARGE']
806 846

  
807 847
    # if revenus are not set in Axel
808 848
    full_update_params = copy.deepcopy(update_params)
809 849
    family_data.pop('REVENUS')
810 850
    with mock.patch('passerelle.contrib.toulouse_axel.models.ToulouseAxel.get_family_data', return_value=family_data):
811
        resource.sanitize_update_family_data(name_id='yyy', post_data=full_update_params)
851
        resource.sanitize_update_family_data(dui='XXX', post_data=full_update_params)
812 852
    assert full_update_params['REVENUS']['NBENFANTSACHARGE'] is None
813 853

  
814 854

  
......
1089 1129
    partial_update_params['ENFANT'][0]['SANITAIRE']['ALLERGIE']['ALIMENTAIRES'] = 'NON'
1090 1130
    partial_update_params['ENFANT'][0]['SANITAIRE']['ALLERGIE']['AUTRES'] = ''
1091 1131
    with mock.patch('passerelle.contrib.toulouse_axel.models.ToulouseAxel.get_family_data', return_value=family_data):
1092
        resource.sanitize_update_family_data(name_id='yyy', post_data=partial_update_params)
1132
        resource.sanitize_update_family_data(dui='XXX', post_data=partial_update_params)
1093 1133
    assert partial_update_params['ENFANT'][0]['SANITAIRE']['ALLERGIE'] == [
1094 1134
        {'TYPE': 'ASTHME', 'ALLERGIQUE': 'NON', 'NOMALLERGIE': None},
1095 1135
        {'TYPE': 'MEDICAMENTEUSES', 'ALLERGIQUE': 'NON', 'NOMALLERGIE': None},
......
1103 1143
    partial_update_params['ENFANT'][0]['SANITAIRE']['ALLERGIE']['ALIMENTAIRES'] = 'OUI'
1104 1144
    partial_update_params['ENFANT'][0]['SANITAIRE']['ALLERGIE']['AUTRES'] = 'accariens'
1105 1145
    with mock.patch('passerelle.contrib.toulouse_axel.models.ToulouseAxel.get_family_data', return_value=family_data):
1106
        resource.sanitize_update_family_data(name_id='yyy', post_data=partial_update_params)
1146
        resource.sanitize_update_family_data(dui='XXX', post_data=partial_update_params)
1107 1147
    assert partial_update_params['ENFANT'][0]['SANITAIRE']['ALLERGIE'] == [
1108 1148
        {'TYPE': 'ASTHME', 'ALLERGIQUE': 'OUI', 'NOMALLERGIE': None},
1109 1149
        {'TYPE': 'MEDICAMENTEUSES', 'ALLERGIQUE': 'OUI', 'NOMALLERGIE': None},
......
1213 1253
    resource.pre_sanitize_update_family_data(post_data=partial_update_params)
1214 1254
    assert '_to_reset' in partial_update_params['ENFANT'][0]['SANITAIRE']['HANDICAP']
1215 1255
    with mock.patch('passerelle.contrib.toulouse_axel.models.ToulouseAxel.get_family_data', return_value=family_data):
1216
        resource.sanitize_update_family_data(name_id='yyy', post_data=partial_update_params)
1256
        resource.sanitize_update_family_data(dui='XXX', post_data=partial_update_params)
1217 1257
    assert len(partial_update_params['ENFANT']) == 1
1218 1258
    assert partial_update_params['ENFANT'][0]['IDPERSONNE'] == "4242"
1219 1259
    # fields were set with origin values found in Axel
......
1228 1268
    partial_update_params['maj:enfant_0'] = False
1229 1269
    resource.pre_sanitize_update_family_data(post_data=partial_update_params)
1230 1270
    with mock.patch('passerelle.contrib.toulouse_axel.models.ToulouseAxel.get_family_data', return_value=family_data):
1231
        resource.sanitize_update_family_data(name_id='yyy', post_data=partial_update_params)
1271
        resource.sanitize_update_family_data(dui='XXX', post_data=partial_update_params)
1232 1272
    assert len(partial_update_params['ENFANT']) == 1
1233 1273
    assert partial_update_params['ENFANT'][0]['IDPERSONNE'] == "3535"
1234 1274
    assert 'SANITAIRE' not in partial_update_params['ENFANT'][0]
......
1239 1279
    partial_update_params['maj:enfant_0'] = False
1240 1280
    resource.pre_sanitize_update_family_data(post_data=partial_update_params)
1241 1281
    with mock.patch('passerelle.contrib.toulouse_axel.models.ToulouseAxel.get_family_data', return_value=family_data):
1242
        resource.sanitize_update_family_data(name_id='yyy', post_data=partial_update_params)
1282
        resource.sanitize_update_family_data(dui='XXX', post_data=partial_update_params)
1243 1283
    assert 'ENFANT' not in partial_update_params
1244 1284

  
1245 1285
    # test maj:enfant_n_sanitaire_handicap not set
......
1252 1292
            partial_update_params['ENFANT'][0]['SANITAIRE']['HANDICAP'][key] = None
1253 1293
        resource.pre_sanitize_update_family_data(post_data=partial_update_params)
1254 1294
        with mock.patch('passerelle.contrib.toulouse_axel.models.ToulouseAxel.get_family_data', return_value=family_data):
1255
            resource.sanitize_update_family_data(name_id='yyy', post_data=partial_update_params)
1295
            resource.sanitize_update_family_data(dui='XXX', post_data=partial_update_params)
1256 1296
        new_values = partial_update_params['ENFANT'][0]['SANITAIRE']
1257 1297
        for key in handicap_fields:
1258 1298
            assert new_values[key] == family_data['ENFANT'][0]['SANITAIRE'][key]
......
1277 1317
    with mock.patch('passerelle.contrib.toulouse_axel.models.ref_famille_dui') as operation:
1278 1318
        operation.side_effect = AxelError('FooBar')
1279 1319
        with pytest.raises(APIError, match='Axel error: FooBar'):
1280
            resource.sanitize_update_family_data(name_id='yyy', post_data=partial_update_params)
1320
            resource.sanitize_update_family_data(dui='XXX', post_data=partial_update_params)
1281 1321

  
1282 1322

  
1283 1323
def test_update_family_info_endpoint_sanitize_axel_error(app, resource, update_params):
......
1945 1985
    assert resp.json['data']['ACTIVITE'][2]['booking'] == {}
1946 1986
    assert resp.json['data']['ACTIVITE'][3]['IDACTIVITE'] == 'A19P1M4'
1947 1987
    assert resp.json['data']['ACTIVITE'][3]['booking'] == {}
1988

  
1989

  
1990
def test_are_children_registered_axel_error(resource):
1991
    with mock.patch('passerelle.contrib.toulouse_axel.models.enfants_activites') as operation:
1992
        operation.side_effect = AxelError('FooBar')
1993
        assert resource.are_children_registered(dui='XXX', reference_year=42) == {}
1994

  
1995

  
1996
@pytest.mark.parametrize('date_value, year, expected', [
1997
    # neither current year nor next year
1998
    ('2020-01-01', 2018, {}),
1999
    ('2020-01-01', 2021, {}),
2000
    # current year
2001
    ('2019-08-01', 2019, {'3535': True}),
2002
    ('2020-07-31', 2019, {'3535': True}),
2003
    # too early for next_year
2004
    ('2019-08-01', 2020, {}),
2005
    ('2020-01-01', 2020, {}),
2006
    ('2020-05-31', 2020, {}),
2007
    # good period for next year
2008
    ('2020-06-01', 2020, {'3535': True}),
2009
    ('2020-07-31', 2020, {'3535': True}),
2010
])
2011
def test_are_children_registered_reference_year(resource, date_value, year, expected):
2012
    with mock.patch('passerelle.contrib.toulouse_axel.models.ToulouseAxel.get_children_activities') as get_children_activities:
2013
        get_children_activities.return_value = {'3535': {'ACTIVITE': [{}]}}
2014
        with freezegun.freeze_time(date_value):
2015
            assert resource.are_children_registered(dui='XXX', reference_year=year) == expected
2016

  
2017

  
2018
@pytest.mark.parametrize('activities, expected', [
2019
    ({}, {}),
2020
    ({'3535': {'ACTIVITE': []}}, {'3535': False}),
2021
    ({'3535': {'ACTIVITE': [{}]}}, {'3535': True}),
2022
    ({'3535': {'ACTIVITE': [{}]}, '4242': {}}, {'3535': True, '4242': False}),
2023
])
2024
def test_are_children_registered(resource, activities, expected):
2025
    today = datetime.date.today()
2026
    with mock.patch('passerelle.contrib.toulouse_axel.models.ToulouseAxel.get_children_activities') as get_children_activities:
2027
        get_children_activities.return_value = activities
2028
        assert resource.are_children_registered(dui='XXX', reference_year=get_reference_year_from_date(today)) == expected
1948
-