Projet

Général

Profil

0001-toulouse-axel-get-possible-days-and-prefill-for-annu.patch

Lauréline Guérin, 16 avril 2020 16:02

Télécharger (18,7 ko)

Voir les différences:

Subject: [PATCH 1/2] toulouse-axel: get possible days and prefill for annual
 values (#41405)

 passerelle/contrib/toulouse_axel/models.py |  49 ++++
 tests/test_toulouse_axel.py                | 256 ++++++++++++++++++++-
 2 files changed, 299 insertions(+), 6 deletions(-)
passerelle/contrib/toulouse_axel/models.py
983 983

  
984 984
        return {'data': activity_days}
985 985

  
986
    @endpoint(
987
        description=_("Get annual possible days to book an activity of a child"),
988
        perm='can_access',
989
        parameters={
990
            'NameID': {'description': _('Publik ID')},
991
            'idpersonne': {'description': _('Child ID')},
992
            'activity_type': {'description': _('Activity type (MAT, MIDI, SOIR, GARD)')},
993
        })
994
    def clae_booking_activity_annual_possible_days(self, request, NameID, idpersonne, activity_type):
995
        link = self.get_link(NameID)
996
        if activity_type not in ['MAT', 'MIDI', 'SOIR', 'GARD']:
997
            raise APIError('bad activity_type, should be MAT, MIDI, SOIR or GARD', err_code='bad-request', http_status=400)
998

  
999
        today = datetime.date.today()
1000
        reference_year = utils.get_reference_year_from_date(today)
1001
        # find the week of the 15 septembre of the reference year
1002
        start_date, end_date = utils.get_week_dates_from_date(datetime.date(reference_year, 9, 15))
1003

  
1004
        activity_days = []
1005
        activities = self.get_booking_data(
1006
            dui=link.dui, child_id=idpersonne, booking_date=start_date, activity_types=[activity_type]).get('ACTIVITE', [])
1007
        if activities:
1008
            activity = activities[0]
1009
            day_date = start_date
1010
            while day_date <= end_date:
1011
                day = WEEKDAYS[day_date.weekday()]
1012
                activity_days.append({
1013
                    'id': '{}:{}:{}:{}'.format(idpersonne, activity_type, activity['id'], day),
1014
                    'text': dateformat.format(day_date, 'l'),
1015
                    'disabled': activity['booking']['days'][day] is None,
1016
                    'prefill': activity['booking']['days'][day],
1017
                    'details': activity,
1018
                })
1019
                day_date = day_date + datetime.timedelta(days=1)
1020

  
1021
        return {'data': activity_days}
1022

  
986 1023
    @endpoint(
987 1024
        description=_("Get booked days for an activity of a child, for a period"),
988 1025
        perm='can_access',
......
997 1034
        possible_days = self.clae_booking_activity_possible_days(request, NameID, idpersonne, activity_type, start_date, end_date)
998 1035
        return {'data': [d['id'] for d in possible_days['data'] if d['prefill'] is True]}
999 1036

  
1037
    @endpoint(
1038
        description=_("Get annual booked days for an activity of a child"),
1039
        perm='can_access',
1040
        parameters={
1041
            'NameID': {'description': _('Publik ID')},
1042
            'idpersonne': {'description': _('Child ID')},
1043
            'activity_type': {'description': _('Activity type (MAT, MIDI, SOIR, GARD)')},
1044
        })
1045
    def clae_booking_activity_annual_prefill(self, request, NameID, idpersonne, activity_type):
1046
        possible_days = self.clae_booking_activity_annual_possible_days(request, NameID, idpersonne, activity_type)
1047
        return {'data': [d['id'] for d in possible_days['data'] if d['prefill'] is True]}
1048

  
1000 1049
    @endpoint(
1001 1050
        description=_("CLAE/Cantine booking"),
1002 1051
        perm='can_access',
tests/test_toulouse_axel.py
2612 2612
    assert resp.json['data'][3]['prefill'] is False
2613 2613
    assert resp.json['data'][4]['prefill'] is True
2614 2614

  
2615
    with mock_getdata(content, 'ReservationPeriode'):
2616
        with mock.patch('passerelle.contrib.toulouse_axel.models.ToulouseAxel.get_child_activities', return_value=activities):
2617
            resp = app.get(
2618
                '/toulouse-axel/test/clae_booking_activity_possible_days?NameID=yyy&idpersonne=3535'
2619
                '&start_date=2020-01-20&end_date=2020-01-24&activity_type=MAT')
2620

  
2621 2615
    # again - data are in cache
2622 2616
    resp = app.get(
2623 2617
        '/toulouse-axel/test/clae_booking_activity_possible_days?NameID=yyy&idpersonne=3535'
......
2671 2665
        assert resp.json['data'][-1]['id'] == '3535:MAT:TOTO:%s' % last_date
2672 2666

  
2673 2667

  
2668
@freezegun.freeze_time('2019-09-01')
2669
def test_clae_booking_activity_annual_possible_days_endpoint_axel_error(app, resource):
2670
    Link.objects.create(resource=resource, name_id='yyy', dui='XXX', person_id='42')
2671
    with mock.patch('passerelle.contrib.toulouse_axel.schemas.enfants_activites') as operation:
2672
        operation.side_effect = AxelError('FooBar')
2673
        resp = app.get('/toulouse-axel/test/clae_booking_activity_annual_possible_days?NameID=yyy&idpersonne=3535&activity_type=MAT')
2674
    assert resp.json['err_desc'] == "Axel error: FooBar"
2675
    assert resp.json['err'] == 'error'
2676

  
2677
    filepath = os.path.join(os.path.dirname(__file__), 'data/toulouse_axel/child_activities.xml')
2678
    with open(filepath) as xml:
2679
        content = xml.read()
2680
    with mock_getdata(content, 'EnfantsActivites'):
2681
        with mock.patch('passerelle.contrib.toulouse_axel.schemas.reservation_periode') as operation:
2682
            operation.side_effect = AxelError('FooBar')
2683
            resp = app.get('/toulouse-axel/test/clae_booking_activity_annual_possible_days?NameID=yyy&idpersonne=3535&activity_type=MAT')
2684
    assert resp.json['err_desc'] == "Axel error: FooBar"
2685
    assert resp.json['err'] == 'error'
2686

  
2687

  
2688
@freezegun.freeze_time('2019-09-01')
2689
def test_clae_booking_activity_annual_possible_days_endpoint_activity_type(app, resource):
2690
    Link.objects.create(resource=resource, name_id='yyy', dui='XXX', person_id='42')
2691
    resp = app.get('/toulouse-axel/test/clae_booking_activity_annual_possible_days?NameID=yyy&idpersonne=3535&activity_type=FOO', status=400)
2692
    assert resp.json['err_desc'] == "bad activity_type, should be MAT, MIDI, SOIR or GARD"
2693
    assert resp.json['err'] == 'bad-request'
2694

  
2695

  
2696
@freezegun.freeze_time('2019-09-01')
2697
def test_clae_booking_activity_annual_possible_days_endpoint_no_result(app, resource, child_activities_data):
2698
    resp = app.get('/toulouse-axel/test/clae_booking_activity_annual_possible_days?NameID=yyy&idpersonne=3535&activity_type=MAT')
2699
    assert resp.json['err_desc'] == "Person not found"
2700
    assert resp.json['err'] == 'not-found'
2701

  
2702
    Link.objects.create(resource=resource, name_id='yyy', dui='XXX', person_id='42')
2703
    filepath = os.path.join(os.path.dirname(__file__), 'data/toulouse_axel/child_activities.xml')
2704
    with open(filepath) as xml:
2705
        content = xml.read()
2706
    with mock_getdata(content, 'EnfantsActivites'):
2707
        with mock.patch('passerelle.contrib.toulouse_axel.schemas.reservation_periode') as operation:
2708
            operation.side_effect = AxelError('FooBar')
2709
            resp = app.get('/toulouse-axel/test/clae_booking_activity_annual_possible_days?NameID=yyy&idpersonne=4242&activity_type=MAT')
2710
    assert resp.json['err_desc'] == "Child not found"
2711
    assert resp.json['err'] == 'not-found'
2712

  
2713
    content = """<PORTAIL>
2714
  <DUI>
2715
    <IDDUI>XXX</IDDUI>
2716
    <ENFANT>
2717
      <IDPERSONNE>4242</IDPERSONNE>
2718
      <ACTIVITE>
2719
        <ANNEEREFERENCE>2019</ANNEEREFERENCE>
2720
        <IDACTIVITE>A19P1M1</IDACTIVITE>
2721
        <JOUR>00000</JOUR>
2722
      </ACTIVITE>
2723
    </ENFANT>
2724
  </DUI>
2725
</PORTAIL>"""
2726
    activities = child_activities_data['ENFANT'][0]
2727
    with mock_getdata(content, 'ReservationPeriode'):
2728
        with mock.patch('passerelle.contrib.toulouse_axel.models.ToulouseAxel.get_child_activities', return_value=activities):
2729
            resp = app.get('/toulouse-axel/test/clae_booking_activity_annual_possible_days?NameID=yyy&idpersonne=3535&activity_type=MAT')
2730
    assert resp.json['err_desc'] == "Child not found"
2731
    assert resp.json['err'] == 'not-found'
2732

  
2733
    with mock.patch('passerelle.contrib.toulouse_axel.models.ToulouseAxel.get_booking_data') as activities_info:
2734
        activities_info.return_value = {'ACTIVITE': []}
2735
        resp = app.get('/toulouse-axel/test/clae_booking_activity_annual_possible_days?NameID=yyy&idpersonne=3535&activity_type=MAT')
2736
    assert resp.json['err'] == 0
2737
    assert resp.json['data'] == []
2738

  
2739

  
2740
@freezegun.freeze_time('2019-09-01')
2741
def test_clae_booking_activity_annual_possible_days_endpoint(app, resource, child_activities_data):
2742
    Link.objects.create(resource=resource, name_id='yyy', dui='XXX', person_id='42')
2743
    content = """<PORTAIL>
2744
  <DUI>
2745
    <IDDUI>XXX</IDDUI>
2746
    <ENFANT>
2747
      <IDPERSONNE>3535</IDPERSONNE>
2748
      <ACTIVITE>
2749
        <ANNEEREFERENCE>2019</ANNEEREFERENCE>
2750
        <IDACTIVITE>A19P1M1</IDACTIVITE>
2751
        <JOUR>10201</JOUR>
2752
      </ACTIVITE>
2753
    </ENFANT>
2754
  </DUI>
2755
</PORTAIL>"""
2756
    activities = child_activities_data['ENFANT'][0]
2757
    with mock_getdata(content, 'ReservationPeriode'):
2758
        with mock.patch('passerelle.contrib.toulouse_axel.models.ToulouseAxel.get_child_activities', return_value=activities):
2759
            resp = app.get('/toulouse-axel/test/clae_booking_activity_annual_possible_days?NameID=yyy&idpersonne=3535&activity_type=MAT')
2760
    assert resp.json['err'] == 0
2761
    assert len(resp.json['data']) == 5
2762
    assert set(resp.json['data'][0].keys()) == set(['id', 'text', 'disabled', 'prefill', 'details'])
2763
    assert resp.json['data'][0]['id'] == '3535:MAT:A19P1M1:monday'
2764
    assert resp.json['data'][1]['id'] == '3535:MAT:A19P1M1:tuesday'
2765
    assert resp.json['data'][2]['id'] == '3535:MAT:A19P1M1:wednesday'
2766
    assert resp.json['data'][3]['id'] == '3535:MAT:A19P1M1:thursday'
2767
    assert resp.json['data'][4]['id'] == '3535:MAT:A19P1M1:friday'
2768
    assert resp.json['data'][0]['text'] == 'Monday'
2769
    assert resp.json['data'][1]['text'] == 'Tuesday'
2770
    assert resp.json['data'][2]['text'] == 'Wednesday'
2771
    assert resp.json['data'][3]['text'] == 'Thursday'
2772
    assert resp.json['data'][4]['text'] == 'Friday'
2773
    assert resp.json['data'][0]['disabled'] is False
2774
    assert resp.json['data'][1]['disabled'] is False
2775
    assert resp.json['data'][2]['disabled'] is True
2776
    assert resp.json['data'][3]['disabled'] is False
2777
    assert resp.json['data'][4]['disabled'] is False
2778
    assert resp.json['data'][0]['prefill'] is True
2779
    assert resp.json['data'][1]['prefill'] is False
2780
    assert resp.json['data'][2]['prefill'] is None
2781
    assert resp.json['data'][3]['prefill'] is False
2782
    assert resp.json['data'][4]['prefill'] is True
2783

  
2784
    # again - data are in cache
2785
    resp = app.get('/toulouse-axel/test/clae_booking_activity_annual_possible_days?NameID=yyy&idpersonne=3535&activity_type=MAT')
2786
    assert resp.json['err'] == 0
2787
    assert len(resp.json['data']) == 5
2788

  
2789

  
2790
def test_clae_booking_activity_annual_possible_days_reference_year(app, resource, child_activities_data):
2791
    Link.objects.create(resource=resource, name_id='yyy', dui='XXX', person_id='42')
2792
    activities = child_activities_data['ENFANT'][0]
2793
    with freezegun.freeze_time('2019-09-01'):
2794
        with mock.patch('passerelle.contrib.toulouse_axel.models.ToulouseAxel.get_child_activities', return_value=activities):
2795
            with mock.patch('passerelle.contrib.toulouse_axel.schemas.reservation_periode') as operation:
2796
                operation.return_value = OperationResult(json_response={'DATA': {'PORTAIL': {'DUI': {}}}}, xml_request='', xml_response='')
2797
                app.get('/toulouse-axel/test/clae_booking_activity_annual_possible_days?NameID=yyy&idpersonne=3535&activity_type=MAT')
2798
    payload = operation.call_args_list[0][0][1]['PORTAIL']['DUI']
2799
    assert payload['ENFANT']['ACTIVITE'][0]['ANNEEREFERENCE'] == '2019'
2800
    assert payload['ENFANT']['ACTIVITE'][0]['DATEDEBUT'] == '2019-09-09'
2801
    assert payload['ENFANT']['ACTIVITE'][0]['DATEDFIN'] == '2019-09-13'
2802

  
2803
    with freezegun.freeze_time('2020-08-01'):
2804
        with mock.patch('passerelle.contrib.toulouse_axel.models.ToulouseAxel.get_child_activities', return_value=activities):
2805
            with mock.patch('passerelle.contrib.toulouse_axel.schemas.reservation_periode') as operation:
2806
                operation.return_value = OperationResult(json_response={'DATA': {'PORTAIL': {'DUI': {}}}}, xml_request='', xml_response='')
2807
                app.get('/toulouse-axel/test/clae_booking_activity_annual_possible_days?NameID=yyy&idpersonne=3535&activity_type=MAT')
2808
    payload = operation.call_args_list[0][0][1]['PORTAIL']['DUI']
2809
    assert payload['ENFANT']['ACTIVITE'][0]['ANNEEREFERENCE'] == '2020'
2810
    assert payload['ENFANT']['ACTIVITE'][0]['DATEDEBUT'] == '2020-09-14'
2811
    assert payload['ENFANT']['ACTIVITE'][0]['DATEDFIN'] == '2020-09-18'
2812

  
2813

  
2674 2814
@freezegun.freeze_time('2019-09-01')
2675 2815
def test_clae_booking_activity_prefill_endpoint_axel_error(app, resource):
2676 2816
    Link.objects.create(resource=resource, name_id='yyy', dui='XXX', person_id='42')
......
2807 2947
    assert resp.json['data'] == ['3535:MAT:A19P1M1:2020-01-20', '3535:MAT:A19P1M1:2020-01-24']
2808 2948

  
2809 2949

  
2950
@freezegun.freeze_time('2019-09-01')
2951
def test_clae_booking_activity_annual_prefill_endpoint_axel_error(app, resource):
2952
    Link.objects.create(resource=resource, name_id='yyy', dui='XXX', person_id='42')
2953
    with mock.patch('passerelle.contrib.toulouse_axel.schemas.enfants_activites') as operation:
2954
        operation.side_effect = AxelError('FooBar')
2955
        resp = app.get('/toulouse-axel/test/clae_booking_activity_annual_prefill?NameID=yyy&idpersonne=3535&activity_type=MAT')
2956
    assert resp.json['err_desc'] == "Axel error: FooBar"
2957
    assert resp.json['err'] == 'error'
2958

  
2959
    filepath = os.path.join(os.path.dirname(__file__), 'data/toulouse_axel/child_activities.xml')
2960
    with open(filepath) as xml:
2961
        content = xml.read()
2962
    with mock_getdata(content, 'EnfantsActivites'):
2963
        with mock.patch('passerelle.contrib.toulouse_axel.schemas.reservation_periode') as operation:
2964
            operation.side_effect = AxelError('FooBar')
2965
            resp = app.get('/toulouse-axel/test/clae_booking_activity_annual_prefill?NameID=yyy&idpersonne=3535&activity_type=MAT')
2966
    assert resp.json['err_desc'] == "Axel error: FooBar"
2967
    assert resp.json['err'] == 'error'
2968

  
2969

  
2970
@freezegun.freeze_time('2019-09-01')
2971
def test_clae_booking_activity_annual_prefill_endpoint_activity_type(app, resource):
2972
    Link.objects.create(resource=resource, name_id='yyy', dui='XXX', person_id='42')
2973
    resp = app.get('/toulouse-axel/test/clae_booking_activity_annual_prefill?NameID=yyy&idpersonne=3535&activity_type=FOO', status=400)
2974
    assert resp.json['err_desc'] == "bad activity_type, should be MAT, MIDI, SOIR or GARD"
2975
    assert resp.json['err'] == 'bad-request'
2976

  
2977

  
2978
@freezegun.freeze_time('2019-09-01')
2979
def test_clae_booking_activity_annual_prefill_endpoint_no_result(app, resource, child_activities_data):
2980
    resp = app.get('/toulouse-axel/test/clae_booking_activity_annual_prefill?NameID=yyy&idpersonne=3535&activity_type=MAT')
2981
    assert resp.json['err_desc'] == "Person not found"
2982
    assert resp.json['err'] == 'not-found'
2983

  
2984
    Link.objects.create(resource=resource, name_id='yyy', dui='XXX', person_id='42')
2985
    filepath = os.path.join(os.path.dirname(__file__), 'data/toulouse_axel/child_activities.xml')
2986
    with open(filepath) as xml:
2987
        content = xml.read()
2988
    with mock_getdata(content, 'EnfantsActivites'):
2989
        with mock.patch('passerelle.contrib.toulouse_axel.schemas.reservation_periode') as operation:
2990
            operation.side_effect = AxelError('FooBar')
2991
            resp = app.get('/toulouse-axel/test/clae_booking_activity_annual_prefill?NameID=yyy&idpersonne=4242&activity_type=MAT')
2992
    assert resp.json['err_desc'] == "Child not found"
2993
    assert resp.json['err'] == 'not-found'
2994

  
2995
    content = """<PORTAIL>
2996
  <DUI>
2997
    <IDDUI>XXX</IDDUI>
2998
    <ENFANT>
2999
      <IDPERSONNE>4242</IDPERSONNE>
3000
      <ACTIVITE>
3001
        <ANNEEREFERENCE>2019</ANNEEREFERENCE>
3002
        <IDACTIVITE>A19P1M1</IDACTIVITE>
3003
        <JOUR>00000</JOUR>
3004
      </ACTIVITE>
3005
    </ENFANT>
3006
  </DUI>
3007
</PORTAIL>"""
3008
    activities = child_activities_data['ENFANT'][0]
3009
    with mock_getdata(content, 'ReservationPeriode'):
3010
        with mock.patch('passerelle.contrib.toulouse_axel.models.ToulouseAxel.get_child_activities', return_value=activities):
3011
            resp = app.get('/toulouse-axel/test/clae_booking_activity_annual_prefill?NameID=yyy&idpersonne=3535&activity_type=MAT')
3012
    assert resp.json['err_desc'] == "Child not found"
3013
    assert resp.json['err'] == 'not-found'
3014

  
3015
    with mock.patch('passerelle.contrib.toulouse_axel.models.ToulouseAxel.clae_booking_activity_annual_possible_days') as possible_days:
3016
        possible_days.return_value = {'data': []}
3017
        resp = app.get('/toulouse-axel/test/clae_booking_activity_annual_prefill?NameID=yyy&idpersonne=3535&activity_type=MAT')
3018
    assert resp.json['err'] == 0
3019
    assert resp.json['data'] == []
3020

  
3021

  
3022
def test_clae_booking_activity_annual_prefill_endpoint(app, resource):
3023
    Link.objects.create(resource=resource, name_id='yyy', dui='XXX', person_id='42')
3024
    with mock.patch('passerelle.contrib.toulouse_axel.models.ToulouseAxel.clae_booking_activity_annual_possible_days') as possible_days:
3025
        possible_days.return_value = {
3026
            'data': [
3027
                {
3028
                    'id': '3535:MAT:A19P1M1:monday',
3029
                    'prefill': True,
3030
                },
3031
                {
3032
                    'id': '3535:MAT:A19P1M1:tuesday',
3033
                    'prefill': False,
3034
                },
3035
                {
3036
                    'id': '3535:MAT:A19P1M1:wednesday',
3037
                    'prefill': None,
3038
                },
3039
                {
3040
                    'id': '3535:MAT:A19P1M1:thursday',
3041
                    'prefill': False,
3042
                },
3043
                {
3044
                    'id': '3535:MAT:A19P1M1:friday',
3045
                    'prefill': True,
3046
                },
3047
            ]
3048
        }
3049
        resp = app.get('/toulouse-axel/test/clae_booking_activity_annual_prefill?NameID=yyy&idpersonne=3535&activity_type=MAT')
3050
    assert resp.json['err'] == 0
3051
    assert resp.json['data'] == ['3535:MAT:A19P1M1:monday', '3535:MAT:A19P1M1:friday']
3052

  
3053

  
2810 3054
def test_are_children_registered_axel_error(resource):
2811 3055
    with mock.patch('passerelle.contrib.toulouse_axel.schemas.enfants_activites') as operation:
2812 3056
        operation.side_effect = AxelError('FooBar')
2813
-