toulouse-axel: check date entree and date sortie in possible days (#43915)

This commit is contained in:
Lauréline Guérin 2020-06-11 11:51:18 +02:00
parent e2c4447266
commit b48550ddc6
No known key found for this signature in database
GPG Key ID: 1FAB9B9B4F93D473
2 changed files with 73 additions and 12 deletions

View File

@ -985,6 +985,20 @@ class ToulouseAxel(BaseResource):
week_end_date = min(week_end_date + datetime.timedelta(days=7), end_date)
return {'data': result}
def get_min_and_max_possible_days(self, dui, reference_year, child_id):
child_activities = self.get_child_activities(
dui=dui,
reference_year=reference_year,
child_id=child_id)
if not child_activities.get('ACTIVITE', []):
return None, None
entree_dates = [act['DATEENTREE'] for act in child_activities.get('ACTIVITE', [])]
sortie_dates = [act['DATESORTIE'] for act in child_activities.get('ACTIVITE', [])]
return (
datetime.datetime.strptime(max(entree_dates), utils.json_date_format).date(),
datetime.datetime.strptime(min(sortie_dates), utils.json_date_format).date()
)
@endpoint(
display_category='CAN-CLA',
display_order=3,
@ -1010,7 +1024,17 @@ class ToulouseAxel(BaseResource):
today = datetime.date.today()
# be sure that start_date is after today + 8 days
start_date = max(start_date, today + datetime.timedelta(days=8))
# but if start_date is a saturday or a sunday, jump to the next monday
# besure that start_date is after greatest DATEENTREE,
# and end_date is before smallest DATESORTIE
reference_year = utils.get_reference_year_from_date(today)
possible_days_min, possible_days_max = self.get_min_and_max_possible_days(
dui=link.dui, reference_year=reference_year, child_id=idpersonne)
if possible_days_min and possible_days_max:
start_date = max(start_date, possible_days_min)
end_date = min(end_date, possible_days_max)
# if start_date is a saturday or a sunday, jump to the next monday
if start_date.weekday() > 4:
start_date = start_date + datetime.timedelta(days=7 - start_date.weekday())

View File

@ -2781,9 +2781,10 @@ def test_clae_booking_activity_possible_days_endpoint(app, resource, child_activ
assert resp.json['data'][4]['prefill'] is True
# again - data are in cache
resp = app.get(
'/toulouse-axel/test/clae_booking_activity_possible_days?NameID=yyy&idpersonne=3535'
'&start_date=2020-01-20&end_date=2020-01-24&activity_type=MAT')
with mock.patch('passerelle.contrib.toulouse_axel.models.ToulouseAxel.get_child_activities', return_value=activities):
resp = app.get(
'/toulouse-axel/test/clae_booking_activity_possible_days?NameID=yyy&idpersonne=3535'
'&start_date=2020-01-20&end_date=2020-01-24&activity_type=MAT')
assert resp.json['err'] == 0
assert len(resp.json['data']) == 5
@ -2811,24 +2812,60 @@ def test_clae_booking_activity_possible_days_endpoint(app, resource, child_activ
# start date is after end date, not the same week => result is empty
('2020-03-26', '2020-04-16', None, '2020-04-12', None),
])
def test_clae_booking_activity_possible_days_period(app, resource, today, start_date, first_date, end_date, last_date):
def test_clae_booking_activity_possible_days_period(app, resource, today, start_date, first_date, end_date, last_date, child_activities_data):
Link.objects.create(resource=resource, name_id='yyy', dui='XXX', person_id='42')
activities = child_activities_data['ENFANT'][0]
with mock.patch('passerelle.contrib.toulouse_axel.models.ToulouseAxel.get_child_activities', return_value=activities):
with mock.patch('passerelle.contrib.toulouse_axel.models.ToulouseAxel.get_booking_data') as activities_info:
activities_info.return_value = {'ACTIVITE': [{
'id': 'TOTO',
'TYPEACTIVITE': 'MAT',
'booking': {'days': {'monday': True, 'tuesday': True, 'wednesday': True, 'thursday': True, 'friday': True}}
}]}
with freezegun.freeze_time(today):
resp = app.get(
'/toulouse-axel/test/clae_booking_activity_possible_days?NameID=yyy&idpersonne=3535'
'&start_date=%s&end_date=%s&activity_type=MAT' % (start_date, end_date))
if first_date is None:
assert resp.json['data'] == []
else:
assert resp.json['data'][0]['id'] == '3535:MAT:TOTO:%s' % first_date
assert resp.json['data'][-1]['id'] == '3535:MAT:TOTO:%s' % last_date
@freezegun.freeze_time('2019-09-01')
def test_clae_booking_activity_possible_days_endpoint_dates(app, resource, child_activities_data):
Link.objects.create(resource=resource, name_id='yyy', dui='XXX', person_id='42')
activities = child_activities_data['ENFANT'][0]
# second activity starts after 2019-08-01
activities['ACTIVITE'][1]['DATEENTREE'] = '2019-10-01'
# last activity ends before 2020-07-31
activities['ACTIVITE'][3]['DATESORTIE'] = '2020-06-30'
with mock.patch('passerelle.contrib.toulouse_axel.models.ToulouseAxel.get_booking_data') as activities_info:
activities_info.return_value = {'ACTIVITE': [{
'id': 'TOTO',
'TYPEACTIVITE': 'MAT',
'booking': {'days': {'monday': True, 'tuesday': True, 'wednesday': True, 'thursday': True, 'friday': True}}
}]}
with freezegun.freeze_time(today):
# it is not possible to book before 2019-10-01
with mock.patch('passerelle.contrib.toulouse_axel.models.ToulouseAxel.get_child_activities', return_value=activities):
resp = app.get(
'/toulouse-axel/test/clae_booking_activity_possible_days?NameID=yyy&idpersonne=3535'
'&start_date=%s&end_date=%s&activity_type=MAT' % (start_date, end_date))
if first_date is None:
assert resp.json['data'] == []
else:
assert resp.json['data'][0]['id'] == '3535:MAT:TOTO:%s' % first_date
assert resp.json['data'][-1]['id'] == '3535:MAT:TOTO:%s' % last_date
'&start_date=2019-09-01&end_date=2019-10-11&activity_type=MAT')
assert resp.json['err'] == 0
assert len(resp.json['data']) == 9
assert resp.json['data'][0]['id'] == '3535:MAT:TOTO:2019-10-01'
assert resp.json['data'][-1]['id'] == '3535:MAT:TOTO:2019-10-11'
# it is not possible to book after 2020-06-30
with mock.patch('passerelle.contrib.toulouse_axel.models.ToulouseAxel.get_child_activities', return_value=activities):
resp = app.get(
'/toulouse-axel/test/clae_booking_activity_possible_days?NameID=yyy&idpersonne=3535'
'&start_date=2020-06-20&end_date=2020-07-15&activity_type=MAT')
assert resp.json['err'] == 0
assert len(resp.json['data']) == 7
assert resp.json['data'][0]['id'] == '3535:MAT:TOTO:2020-06-22'
assert resp.json['data'][-1]['id'] == '3535:MAT:TOTO:2020-06-30'
@freezegun.freeze_time('2019-09-01')