Projet

Général

Profil

0001-toulouse-axel-endpoint-to-get-bookable-years-44451.patch

Lauréline Guérin, 29 juin 2020 15:35

Télécharger (8,89 ko)

Voir les différences:

Subject: [PATCH] toulouse-axel: endpoint to get bookable years (#44451)

 passerelle/contrib/toulouse_axel/models.py | 64 ++++++++++++++++++++--
 passerelle/contrib/toulouse_axel/utils.py  |  1 -
 tests/test_toulouse_axel.py                | 58 ++++++++++++++++++++
 3 files changed, 116 insertions(+), 7 deletions(-)
passerelle/contrib/toulouse_axel/models.py
974 974
    @endpoint(
975 975
        display_category='CAN-CLA',
976 976
        display_order=1,
977
        description=_("Get the list of reference years available for bookings"),
978
        perm='can_access',
979
        parameters={
980
            'NameID': {'description': _('Publik ID')},
981
            'pivot_date': {'description': _('Pivot date (format MM-DD). After this date, next year is available.')},
982
        })
983
    def clae_years(self, request, NameID, pivot_date):
984
        link = self.get_link(NameID)
985

  
986
        today = datetime.date.today()
987
        reference_year = utils.get_reference_year_from_date(today)
988

  
989
        # get pivot date
990
        try:
991
            pivot_date = datetime.datetime.strptime('%s-%s' % (reference_year, pivot_date), utils.json_date_format).date()
992
        except ValueError:
993
            raise APIError('bad date format, should be MM-DD', err_code='bad-request', http_status=400)
994
        # adjust pivot year
995
        if pivot_date.month <= 7:
996
            # between january and july, reference year is the year just before
997
            pivot_date = pivot_date.replace(year=reference_year + 1)
998

  
999
        data = [{
1000
            'id': reference_year,
1001
            'text': '%s/%s' % (reference_year, reference_year + 1),
1002
            'type': 'encours',
1003
            'refdate': today.strftime(utils.json_date_format)
1004
        }]
1005
        if today < pivot_date:
1006
            # date pivot not in the past, return only current year
1007
            return {'data': data}
1008
        children_activities = self.get_children_activities(dui=link.dui, reference_year=reference_year + 1)
1009
        if not children_activities:
1010
            # no activities for next year, return only current year
1011
            return {'data': data}
1012
        try:
1013
            next_ref_date = today.replace(year=today.year + 1)
1014
        except ValueError:
1015
            # 02/29 ?
1016
            next_ref_date = today + datetime.timedelta(days=366)
1017
        # return also next year
1018
        data.append({
1019
            'id': reference_year + 1,
1020
            'text': '%s/%s' % (reference_year + 1, reference_year + 2),
1021
            'type': 'suivante',
1022
            'refdate': next_ref_date.strftime(utils.json_date_format)
1023
        })
1024
        return {'data': data}
1025

  
1026
    @endpoint(
1027
        display_category='CAN-CLA',
1028
        display_order=2,
977 1029
        description=_("Get information about CLAE activities of all children for the year"),
978 1030
        perm='can_access',
979 1031
        parameters={
......
996 1048

  
997 1049
    @endpoint(
998 1050
        display_category='CAN-CLA',
999
        display_order=2,
1051
        display_order=3,
1000 1052
        description=_("Get the list of CLAE booked activities of a child, for a period"),
1001 1053
        perm='can_access',
1002 1054
        parameters={
......
1069 1121

  
1070 1122
    @endpoint(
1071 1123
        display_category='CAN-CLA',
1072
        display_order=3,
1124
        display_order=4,
1073 1125
        description=_("Get possible days to book an activity of a child, for a period"),
1074 1126
        perm='can_access',
1075 1127
        parameters={
......
1145 1197

  
1146 1198
    @endpoint(
1147 1199
        display_category='CAN-CLA',
1148
        display_order=4,
1200
        display_order=5,
1149 1201
        description=_("Get annual possible days to book an activity of a child"),
1150 1202
        perm='can_access',
1151 1203
        parameters={
......
1189 1241

  
1190 1242
    @endpoint(
1191 1243
        display_category='CAN-CLA',
1192
        display_order=5,
1244
        display_order=6,
1193 1245
        description=_("Get booked days for an activity of a child, for a period"),
1194 1246
        perm='can_access',
1195 1247
        parameters={
......
1205 1257

  
1206 1258
    @endpoint(
1207 1259
        display_category='CAN-CLA',
1208
        display_order=6,
1260
        display_order=7,
1209 1261
        description=_("CLAE/Cantine booking"),
1210 1262
        perm='can_access',
1211 1263
        parameters={
......
1330 1382

  
1331 1383
    @endpoint(
1332 1384
        display_category='CAN-CLA',
1333
        display_order=7,
1385
        display_order=8,
1334 1386
        description=_("CLAE/Cantine annual booking"),
1335 1387
        perm='can_access',
1336 1388
        parameters={
passerelle/contrib/toulouse_axel/utils.py
210 210
def get_reference_year_from_date(booking_date):
211 211
    if booking_date.month <= 7:
212 212
        # between january and july, reference year is the year just before
213
        # (september)
214 213
        return booking_date.year - 1
215 214
    return booking_date.year
216 215

  
tests/test_toulouse_axel.py
2266 2266
    }
2267 2267

  
2268 2268

  
2269
def test_clae_years_endpoint_axel_error(app, resource):
2270
    Link.objects.create(resource=resource, name_id='yyy', dui='XXX', person_id='42')
2271
    with mock.patch('passerelle.contrib.toulouse_axel.schemas.enfants_activites') as operation:
2272
        operation.side_effect = AxelError('FooBar')
2273
        resp = app.get('/toulouse-axel/test/clae_years?NameID=yyy&pivot_date=06-15')
2274
    assert resp.json['err_desc'] == "Axel error: FooBar"
2275
    assert resp.json['err'] == 'error'
2276

  
2277

  
2278
@pytest.mark.parametrize('value', ['foo', '20/01/2020', '15/06', '06'])
2279
def test_clae_years_endpoint_bad_date_format(app, resource, value):
2280
    Link.objects.create(resource=resource, name_id='yyy', dui='XXX', person_id='42')
2281
    resp = app.get('/toulouse-axel/test/clae_years?NameID=yyy&pivot_date=%s' % value, status=400)
2282
    assert resp.json['err_desc'] == "bad date format, should be MM-DD"
2283
    assert resp.json['err'] == 'bad-request'
2284

  
2285

  
2286
def test_clae_years_endpoint_no_result(app, resource):
2287
    resp = app.get('/toulouse-axel/test/clae_years?NameID=yyy&pivot_date=06-15')
2288
    assert resp.json['err_desc'] == "Person not found"
2289
    assert resp.json['err'] == 'not-found'
2290

  
2291

  
2292
@pytest.mark.parametrize('today,pivot,next_year,next_date', [
2293
    ('2019-08-01', '08-01', True, '2020-08-01'),
2294
    ('2019-08-01', '08-02', False, None),
2295
    ('2020-07-31', '07-31', True, '2021-07-31'),
2296
    ('2020-07-30', '07-31', False, None),
2297
    ('2020-06-14', '06-15', False, None),
2298
    ('2020-06-15', '06-15', True, '2021-06-15'),
2299
    ('2020-06-16', '06-15', True, '2021-06-16'),
2300
    ('2020-02-29', '02-01', True, '2021-03-01'),
2301
])
2302
def test_clae_years_endpoint(app, resource, today, pivot, next_year, next_date):
2303
    Link.objects.create(resource=resource, name_id='yyy', dui='XXX', person_id='42')
2304
    filepath = os.path.join(os.path.dirname(__file__), 'data/toulouse_axel/child_activities.xml')
2305
    with open(filepath) as xml:
2306
        content = xml.read()
2307
    with mock_getdata(content, 'EnfantsActivites'):
2308
        with freezegun.freeze_time(today):
2309
            resp = app.get('/toulouse-axel/test/clae_years?NameID=yyy&pivot_date=%s' % pivot)
2310
    assert resp.json['data'][0] == {'id': 2019, 'text': '2019/2020', 'type': 'encours', 'refdate': today}
2311
    if next_year:
2312
        assert len(resp.json['data']) == 2
2313
        assert resp.json['data'][1] == {'id': 2020, 'text': '2020/2021', 'type': 'suivante', 'refdate': next_date}
2314
    else:
2315
        assert len(resp.json['data']) == 1
2316

  
2317

  
2318
@freezegun.freeze_time('2020-06-30')
2319
def test_clae_years_endpoint_noactivities(app, resource):
2320
    Link.objects.create(resource=resource, name_id='yyy', dui='XXX', person_id='42')
2321
    with mock.patch('passerelle.contrib.toulouse_axel.models.ToulouseAxel.get_children_activities', return_value={}) as mock_activities:
2322
        resp = app.get('/toulouse-axel/test/clae_years?NameID=yyy&pivot_date=06-15')
2323
    assert mock_activities.call_args_list == [mock.call(dui='XXX', reference_year=2020)]
2324
    assert len(resp.json['data']) == 1
2325

  
2326

  
2269 2327
def test_clae_children_activities_info_endpoint_axel_error(app, resource):
2270 2328
    Link.objects.create(resource=resource, name_id='yyy', dui='XXX', person_id='42')
2271 2329
    with mock.patch('passerelle.contrib.toulouse_axel.schemas.enfants_activites') as operation:
2272
-