Projet

Général

Profil

0001-toulouse-axel-get-possible-days-for-annual-values-41.patch

Lauréline Guérin, 17 avril 2020 09:34

Télécharger (12,2 ko)

Voir les différences:

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

 passerelle/contrib/toulouse_axel/models.py |  37 +++++
 tests/test_toulouse_axel.py                | 152 ++++++++++++++++++++-
 2 files changed, 183 insertions(+), 6 deletions(-)
passerelle/contrib/toulouse_axel/models.py
985 985

  
986 986
        return {'data': activity_days}
987 987

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

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

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

  
1023
        return {'data': activity_days}
1024

  
988 1025
    @endpoint(
989 1026
        description=_("Get booked days for an activity of a child, for a period"),
990 1027
        perm='can_access',
tests/test_toulouse_axel.py
2615 2615
    assert resp.json['data'][3]['prefill'] is False
2616 2616
    assert resp.json['data'][4]['prefill'] is True
2617 2617

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

  
2624 2618
    # again - data are in cache
2625 2619
    resp = app.get(
2626 2620
        '/toulouse-axel/test/clae_booking_activity_possible_days?NameID=yyy&idpersonne=3535'
......
2674 2668
        assert resp.json['data'][-1]['id'] == '3535:MAT:TOTO:%s' % last_date
2675 2669

  
2676 2670

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

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

  
2690

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

  
2698

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

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

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

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

  
2742

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

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

  
2792

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

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

  
2816

  
2677 2817
@freezegun.freeze_time('2019-09-01')
2678 2818
def test_clae_booking_activity_prefill_endpoint_axel_error(app, resource):
2679 2819
    Link.objects.create(resource=resource, name_id='yyy', dui='XXX', person_id='42')
2680
-