toulouse-axel: always get all activities to optimize caching (#43815)

This commit is contained in:
Lauréline Guérin 2020-06-09 15:49:47 +02:00
parent b37a3ddcf9
commit f67455c390
No known key found for this signature in database
GPG Key ID: 1FAB9B9B4F93D473
2 changed files with 49 additions and 43 deletions

View File

@ -776,10 +776,8 @@ class ToulouseAxel(BaseResource):
'xml_response': e.xml_response})
return {'data': True}
def get_children_activities(self, dui, reference_year, activity_types=None):
activity_types = activity_types or ['MAT', 'MIDI', 'SOIR', 'GARD']
cache_key = 'toulouse-axel-%s-children-activities-%s-%s-%s' % (
self.pk, dui, reference_year, '-'.join(activity_types or []))
def get_children_activities(self, dui, reference_year):
cache_key = 'toulouse-axel-%s-children-activities-%s-%s' % (self.pk, dui, reference_year)
result = cache.get(cache_key)
if result is not None:
return result
@ -788,7 +786,7 @@ class ToulouseAxel(BaseResource):
'DUI': {
'IDDUI': dui,
'ANNEEREFERENCE': str(reference_year),
'TYPESACTIVITES': ','.join(activity_types),
'TYPESACTIVITES': 'MAT,MIDI,SOIR,GARD',
}
})
except AxelError as e:
@ -805,9 +803,8 @@ class ToulouseAxel(BaseResource):
cache.set(cache_key, children_activities, 30) # 30 seconds
return children_activities
def get_child_activities(self, dui, reference_year, child_id, activity_types=None):
children_activities = self.get_children_activities(
dui=dui, reference_year=reference_year, activity_types=activity_types)
def get_child_activities(self, dui, reference_year, child_id):
children_activities = self.get_children_activities(dui=dui, reference_year=reference_year)
if child_id not in children_activities:
raise APIError('Child not found', err_code='not-found')
@ -825,10 +822,9 @@ class ToulouseAxel(BaseResource):
return {}
return {child_id: bool(child.get('ACTIVITE', [])) for child_id, child in children_activities.items()}
def get_booking_data(self, dui, child_id, booking_date, activity_types=None):
def get_booking_data(self, dui, child_id, booking_date):
start_date, end_date = utils.get_week_dates_from_date(booking_date)
cache_key = 'toulouse-axel-%s-booking-data-%s-%s-%s-%s' % (
self.pk, dui, child_id, start_date.isoformat(), '-'.join(activity_types or []))
cache_key = 'toulouse-axel-%s-booking-data-%s-%s-%s' % (self.pk, dui, child_id, start_date.isoformat())
result = cache.get(cache_key)
if result is not None:
return result
@ -839,8 +835,7 @@ class ToulouseAxel(BaseResource):
child_activities = self.get_child_activities(
dui=dui,
reference_year=reference_year,
child_id=child_id,
activity_types=activity_types)
child_id=child_id)
# then get booking of the requested week for the child
activity_ids = [act['IDACTIVITE'] for act in child_activities.get('ACTIVITE', [])]
@ -1022,10 +1017,14 @@ class ToulouseAxel(BaseResource):
def get_activity_days_for_week(week_start_date, week_end_date):
# ask Axel for the booking of a week (starts may be a monday, ends a friday)
activities = self.get_booking_data(
dui=link.dui, child_id=idpersonne, booking_date=week_start_date, activity_types=[activity_type]).get('ACTIVITE', [])
if not activities:
dui=link.dui, child_id=idpersonne, booking_date=week_start_date).get('ACTIVITE', [])
activity = None
for act in activities:
if act['TYPEACTIVITE'] == activity_type:
activity = act
break
if activity is None:
return
activity = activities[0]
day_date = week_start_date
while day_date <= week_end_date:
day = WEEKDAYS[day_date.weekday()]
@ -1072,23 +1071,27 @@ class ToulouseAxel(BaseResource):
activities = self.get_child_activities(
dui=link.dui,
reference_year=reference_year,
child_id=idpersonne,
activity_types=[activity_type]).get('ACTIVITE', [])
child_id=idpersonne).get('ACTIVITE', [])
activity = None
for act in activities:
if act['TYPEACTIVITE'] == activity_type:
activity = act
break
if activity is None:
return {'data': []}
activity_days = []
if activities:
activity = activities[0]
for i, day in enumerate(['monday', 'tuesday', 'wednesday', 'thursday', 'friday']):
disabled = False
if activity_type == 'GARD' and day != 'wednesday':
disabled = True
elif activity_type == 'SOIR' and day == 'wednesday':
disabled = True
activity_days.append({
'id': '{}:{}:{}:{}'.format(idpersonne, activity_type, activity['IDACTIVITE'], day),
'text': WEEKDAYS_LABELS[i],
'disabled': disabled,
})
for i, day in enumerate(['monday', 'tuesday', 'wednesday', 'thursday', 'friday']):
disabled = False
if activity_type == 'GARD' and day != 'wednesday':
disabled = True
elif activity_type == 'SOIR' and day == 'wednesday':
disabled = True
activity_days.append({
'id': '{}:{}:{}:{}'.format(idpersonne, activity_type, activity['IDACTIVITE'], day),
'text': WEEKDAYS_LABELS[i],
'disabled': disabled,
})
return {'data': activity_days}

View File

@ -2197,13 +2197,13 @@ def test_clae_children_activities_info_endpoint_bad_date_format(app, resource, v
assert resp.json['err'] == 'bad-request'
def test_clae_children_activities_info_endpoint_no_result(app, resource, child_activities_data):
def test_clae_children_activities_info_endpoint_no_result(app, resource):
resp = app.get('/toulouse-axel/test/clae_children_activities_info?NameID=yyy&booking_date=2020-01-20')
assert resp.json['err_desc'] == "Person not found"
assert resp.json['err'] == 'not-found'
def test_clae_children_activities_info_endpoint(app, resource, child_activities_data):
def test_clae_children_activities_info_endpoint(app, resource):
Link.objects.create(resource=resource, name_id='yyy', dui='XXX', person_id='42')
filepath = os.path.join(os.path.dirname(__file__), 'data/toulouse_axel/child_activities.xml')
with open(filepath) as xml:
@ -2740,6 +2740,11 @@ def test_clae_booking_activity_possible_days_endpoint(app, resource, child_activ
<ACTIVITE>
<ANNEEREFERENCE>2019</ANNEEREFERENCE>
<IDACTIVITE>A19P1M1</IDACTIVITE>
<JOUR>00000</JOUR>
</ACTIVITE>
<ACTIVITE>
<ANNEEREFERENCE>2019</ANNEEREFERENCE>
<IDACTIVITE>A19P1M2</IDACTIVITE>
<JOUR>10201</JOUR>
</ACTIVITE>
</ENFANT>
@ -2750,15 +2755,15 @@ def test_clae_booking_activity_possible_days_endpoint(app, resource, child_activ
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')
'&start_date=2020-01-20&end_date=2020-01-24&activity_type=MIDI')
assert resp.json['err'] == 0
assert len(resp.json['data']) == 5
assert set(resp.json['data'][0].keys()) == set(['id', 'text', 'disabled', 'prefill', 'details'])
assert resp.json['data'][0]['id'] == '3535:MAT:A19P1M1:2020-01-20'
assert resp.json['data'][1]['id'] == '3535:MAT:A19P1M1:2020-01-21'
assert resp.json['data'][2]['id'] == '3535:MAT:A19P1M1:2020-01-22'
assert resp.json['data'][3]['id'] == '3535:MAT:A19P1M1:2020-01-23'
assert resp.json['data'][4]['id'] == '3535:MAT:A19P1M1:2020-01-24'
assert resp.json['data'][0]['id'] == '3535:MIDI:A19P1M2:2020-01-20'
assert resp.json['data'][1]['id'] == '3535:MIDI:A19P1M2:2020-01-21'
assert resp.json['data'][2]['id'] == '3535:MIDI:A19P1M2:2020-01-22'
assert resp.json['data'][3]['id'] == '3535:MIDI:A19P1M2:2020-01-23'
assert resp.json['data'][4]['id'] == '3535:MIDI:A19P1M2:2020-01-24'
assert resp.json['data'][0]['text'] == 'Monday 20 January 2020'
assert resp.json['data'][1]['text'] == 'Tuesday 21 January 2020'
assert resp.json['data'][2]['text'] == 'Wednesday 22 January 2020'
@ -2812,6 +2817,7 @@ def test_clae_booking_activity_possible_days_period(app, resource, today, start_
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):
@ -2867,7 +2873,7 @@ def test_clae_booking_activity_annual_possible_days_endpoint_no_result(app, reso
@freezegun.freeze_time('2019-09-01')
def test_clae_booking_activity_annual_possible_days_endpoint(app, resource, child_activities_data):
Link.objects.create(resource=resource, name_id='yyy', dui='XXX', person_id='42')
activities = {'ACTIVITE': [child_activities_data['ENFANT'][0]['ACTIVITE'][0]]}
activities = child_activities_data['ENFANT'][0]
with mock.patch('passerelle.contrib.toulouse_axel.models.ToulouseAxel.get_child_activities', return_value=activities):
resp = app.get('/toulouse-axel/test/clae_booking_activity_annual_possible_days?NameID=yyy&idpersonne=3535&activity_type=MAT')
assert resp.json['err'] == 0
@ -2898,7 +2904,6 @@ def test_clae_booking_activity_annual_possible_days_endpoint(app, resource, chil
'disabled': False,
},
]
activities = {'ACTIVITE': [child_activities_data['ENFANT'][0]['ACTIVITE'][1]]}
with mock.patch('passerelle.contrib.toulouse_axel.models.ToulouseAxel.get_child_activities', return_value=activities):
resp = app.get('/toulouse-axel/test/clae_booking_activity_annual_possible_days?NameID=yyy&idpersonne=3535&activity_type=MIDI')
assert resp.json['err'] == 0
@ -2929,7 +2934,6 @@ def test_clae_booking_activity_annual_possible_days_endpoint(app, resource, chil
'disabled': False,
},
]
activities = {'ACTIVITE': [child_activities_data['ENFANT'][0]['ACTIVITE'][2]]}
with mock.patch('passerelle.contrib.toulouse_axel.models.ToulouseAxel.get_child_activities', return_value=activities):
resp = app.get('/toulouse-axel/test/clae_booking_activity_annual_possible_days?NameID=yyy&idpersonne=3535&activity_type=SOIR')
assert resp.json['err'] == 0
@ -2960,7 +2964,6 @@ def test_clae_booking_activity_annual_possible_days_endpoint(app, resource, chil
'disabled': False,
},
]
activities = {'ACTIVITE': [child_activities_data['ENFANT'][0]['ACTIVITE'][3]]}
with mock.patch('passerelle.contrib.toulouse_axel.models.ToulouseAxel.get_child_activities', return_value=activities):
resp = app.get('/toulouse-axel/test/clae_booking_activity_annual_possible_days?NameID=yyy&idpersonne=3535&activity_type=GARD')
assert resp.json['err'] == 0