toulouse-axel: check date entree and date sortie in possible days (#43915)
This commit is contained in:
parent
e2c4447266
commit
b48550ddc6
|
@ -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())
|
||||
|
||||
|
|
|
@ -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')
|
||||
|
|
Loading…
Reference in New Issue