0001-toulouse-axel-endpoint-to-get-bookable-years-44451.patch
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 |
- |