return tracks instead of radiosessiontrack

This commit is contained in:
Petitminion 2023-07-13 13:05:14 +02:00
parent 31e856c258
commit 591ef6adf3
3 changed files with 17 additions and 24 deletions

View File

@ -123,7 +123,7 @@ class SessionRadio(SimpleRadio):
# get cached RadioTracks if any # get cached RadioTracks if any
try: try:
cached_evaluated_radio_tracks = pickle.loads( cached_evaluated_radio_tracks = pickle.loads(
cache.get(f"radiosessiontracks{self.session.id}") cache.get(f"radiotracks{self.session.id}")
) )
except TypeError: except TypeError:
cached_evaluated_radio_tracks = None cached_evaluated_radio_tracks = None
@ -145,26 +145,25 @@ class SessionRadio(SimpleRadio):
raise ValueError("No more radio candidates") raise ValueError("No more radio candidates")
# create the radio session tracks into db in bulk # create the radio session tracks into db in bulk
radio_tracks = self.session.add(sliced_queryset) self.session.add(sliced_queryset)
# evaluate the queryset to save it in cache # evaluate the queryset to save it in cache
radio_tracks = list(sliced_queryset)
if cached_evaluated_radio_tracks is not None: if cached_evaluated_radio_tracks is not None:
radio_tracks = list(radio_tracks)
radio_tracks.extend(cached_evaluated_radio_tracks) radio_tracks.extend(cached_evaluated_radio_tracks)
logger.info( logger.info(
f"Setting redis cache for radio generation with radio id {self.session.id}" f"Setting redis cache for radio generation with radio id {self.session.id}"
) )
cache.set( cache.set(f"radiotracks{self.session.id}", pickle.dumps(radio_tracks), 3600)
f"radiosessiontracks{self.session.id}", pickle.dumps(radio_tracks), 3600
)
cache.set(f"radioqueryset{self.session.id}", sliced_queryset, 3600) cache.set(f"radioqueryset{self.session.id}", sliced_queryset, 3600)
return sliced_queryset return sliced_queryset
def get_choices_v2(self, quantity, **kwargs): def get_choices_v2(self, quantity, **kwargs):
if cache.get(f"radiosessiontracks{self.session.id}"): if cache.get(f"radiotracks{self.session.id}"):
cached_radio_tracks = pickle.loads( cached_radio_tracks = pickle.loads(
cache.get(f"radiosessiontracks{self.session.id}") cache.get(f"radiotracks{self.session.id}")
) )
logger.info("Using redis cache for radio generation") logger.info("Using redis cache for radio generation")
radio_tracks = cached_radio_tracks radio_tracks = cached_radio_tracks

View File

@ -213,11 +213,9 @@ class V2_RadioSessionViewSet(
) )
# self.perform_create(serializer) # self.perform_create(serializer)
# dirty override here, since we use a different serializer for creation and detail # dirty override here, since we use a different serializer for creation and detail
evaluated_radio_tracks = pickle.loads( evaluated_radio_tracks = pickle.loads(cache.get(f"radiotracks{session.id}"))
cache.get(f"radiosessiontracks{session.id}")
)
batch = evaluated_radio_tracks[:count] batch = evaluated_radio_tracks[:count]
serializer = serializers.RadioSessionTrackSerializer( serializer = TrackSerializer(
data=batch, data=batch,
many="true", many="true",
) )
@ -225,9 +223,7 @@ class V2_RadioSessionViewSet(
# delete the tracks we sent from the cache # delete the tracks we sent from the cache
new_cached_radiotracks = evaluated_radio_tracks[count:] new_cached_radiotracks = evaluated_radio_tracks[count:]
cache.set( cache.set(f"radiotracks{session.id}", pickle.dumps(new_cached_radiotracks))
f"radiosessiontracks{session.id}", pickle.dumps(new_cached_radiotracks)
)
return Response( return Response(
serializer.data, serializer.data,

View File

@ -221,8 +221,7 @@ def test_can_get_track_for_session_from_api_v2(factories, logged_in_api_client):
response = logged_in_api_client.get(url, {"session": session.pk}) response = logged_in_api_client.get(url, {"session": session.pk})
data = json.loads(response.content.decode("utf-8")) data = json.loads(response.content.decode("utf-8"))
assert data[0]["track"]["id"] == track.pk assert data[0]["id"] == track.pk
assert data[0]["position"] == 1
next_track = factories["music.Upload"]( next_track = factories["music.Upload"](
library__actor=actor, import_status="finished" library__actor=actor, import_status="finished"
@ -230,8 +229,7 @@ def test_can_get_track_for_session_from_api_v2(factories, logged_in_api_client):
response = logged_in_api_client.get(url, {"session": session.pk}) response = logged_in_api_client.get(url, {"session": session.pk})
data = json.loads(response.content.decode("utf-8")) data = json.loads(response.content.decode("utf-8"))
assert data[0]["track"]["id"] == next_track.id assert data[0]["id"] == next_track.id
assert data[0]["position"] == 2
def test_related_object_radio_validate_related_object(factories): def test_related_object_radio_validate_related_object(factories):
@ -489,9 +487,9 @@ def test_session_radio_excludes_previous_picks_v2(factories, logged_in_api_clien
url, {"session": session.pk, "filter_playable": False} url, {"session": session.pk, "filter_playable": False}
) )
pick = json.loads(response.content.decode("utf-8")) pick = json.loads(response.content.decode("utf-8"))
assert pick[0]["track"]["title"] not in previous_choices assert pick[0]["title"] not in previous_choices
assert pick[0]["track"]["title"] in [t.title for t in tracks] assert pick[0]["title"] in [t.title for t in tracks]
previous_choices.append(pick[0]["track"]["title"]) previous_choices.append(pick[0]["title"])
response = logged_in_api_client.get(url, {"session": session.pk}) response = logged_in_api_client.get(url, {"session": session.pk})
assert ( assert (
@ -540,8 +538,8 @@ def test_can_cache_radio_track(factories):
session = radio.start_session(user) session = radio.start_session(user)
picked = session.radio.pick_many_v2(quantity=1, filter_playable=False) picked = session.radio.pick_many_v2(quantity=1, filter_playable=False)
assert len(picked) == 1 assert len(picked) == 1
for t in pickle.loads(cache.get(f"radiosessiontracks{session.id}")): for t in pickle.loads(cache.get(f"radiotracks{session.id}")):
assert t.track in uploads assert t in uploads
def test_regenerate_cache_if_not_enought_tracks_in_it( def test_regenerate_cache_if_not_enought_tracks_in_it(