From 5c343715cf06bf1ebacec38d558baf2c90cfa540 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Stefan=20K=C3=B6gl?= Date: Sat, 11 Oct 2014 21:23:30 +0200 Subject: [PATCH] [Migration] remove / rewrite get_latest_episode_ids --- mygpo/db/couchdb/user.py | 25 ------------------------- mygpo/history/stats.py | 17 +++++++++++++++++ mygpo/share/userpage.py | 16 +++------------- mygpo/web/views/episode.py | 8 ++------ 4 files changed, 22 insertions(+), 44 deletions(-) diff --git a/mygpo/db/couchdb/user.py b/mygpo/db/couchdb/user.py index 9bab46b9..86dc6cf7 100644 --- a/mygpo/db/couchdb/user.py +++ b/mygpo/db/couchdb/user.py @@ -4,31 +4,6 @@ from mygpo.db import QueryParameterMissing @cache_result(timeout=60) -def get_latest_episode_ids(user, count=10): - """ Returns the latest episodes that the user has accessed """ - - if not user: - raise QueryParameterMissing('user') - - startkey = [user.profile.uuid.hex, {}] - endkey = [user.profile.uuid.hex, None] - - udb = get_userdata_database() - res = udb.view('listeners/by_user', - startkey = startkey, - endkey = endkey, - include_docs = True, - descending = True, - limit = count, - reduce = False, - stale = 'update_after', - ) - - return [r['value'] for r in res] - - - -@cache_result(timeout=60) def get_seconds_played(user, since=None, until={}): """ Returns the number of seconds that the user has listened diff --git a/mygpo/history/stats.py b/mygpo/history/stats.py index f353bfb5..77e1c551 100644 --- a/mygpo/history/stats.py +++ b/mygpo/history/stats.py @@ -1,5 +1,6 @@ from collections import Counter +from mygpo.podcasts.models import Episode from mygpo.history.models import EpisodeHistoryEntry @@ -32,3 +33,19 @@ def num_played_episodes(user, since=None, until=None): query = query.filter(timestamp__lte=until) return query.count() + + +def last_played_episodes(user, limit=10): + """ The last episodes that the user played """ + ep_ids = EpisodeHistoryEntry.objects\ + .filter(user=user, + action=EpisodeHistoryEntry.PLAY)\ + .order_by('episode__id', '-timestamp')\ + .distinct('episode__id')\ + .values_list('episode__id') + ep_ids = ep_ids[:limit] + episodes = Episode.objects.filter(id__in=ep_ids)\ + .select_related('podcast')\ + .prefetch_related('slugs', + 'podcast__slugs') + return episodes diff --git a/mygpo/share/userpage.py b/mygpo/share/userpage.py index 9e952b4c..3d53d52f 100644 --- a/mygpo/share/userpage.py +++ b/mygpo/share/userpage.py @@ -13,9 +13,9 @@ from mygpo.subscriptions import get_subscribed_podcasts from mygpo.decorators import requires_token from mygpo.podcastlists.models import PodcastList from mygpo.users.subscriptions import PodcastPercentageListenedSorter -from mygpo.history.stats import num_played_episodes +from mygpo.history.stats import num_played_episodes, last_played_episodes from mygpo.db.couchdb.episode_state import favorite_episode_ids_for_user -from mygpo.db.couchdb.user import get_latest_episode_ids, get_seconds_played +from mygpo.db.couchdb.user import get_seconds_played @@ -39,7 +39,7 @@ class UserpageView(View): 'favorite_feeds_token': user.profile.get_token('favorite_feeds_token'), 'lists': self.get_podcast_lists(user), 'subscriptions': self.get_subscriptions(user), - 'recent_episodes': self.get_recent_episodes(user), + 'recent_episodes': last_played_episodes(user), 'seconds_played_total': self.get_seconds_played_total(user), 'seconds_played_month': self.get_seconds_played_since( user, month_ago), 'favorite_episodes': self.get_favorite_episodes(user), @@ -58,16 +58,6 @@ class UserpageView(View): subscriptions = [sp.podcast for sp in get_subscribed_podcasts(user)] return PodcastPercentageListenedSorter(subscriptions, user) - - def get_recent_episodes(self, user): - recent_episode_ids = get_latest_episode_ids(user) - recent_episodes = Episode.objects.filter(id__in=recent_episode_ids)\ - .select_related('podcast')\ - .prefetch_related('slugs', - 'podcast__slugs') - return recent_episodes - - def get_seconds_played_total(self, user): return get_seconds_played(user) diff --git a/mygpo/web/views/episode.py b/mygpo/web/views/episode.py index 91a35d74..9c4119bd 100644 --- a/mygpo/web/views/episode.py +++ b/mygpo/web/views/episode.py @@ -37,13 +37,13 @@ from mygpo.users.models import Chapter, HistoryEntry, EpisodeAction from mygpo.utils import parse_time, get_timestamp from mygpo.users.settings import FLATTR_TOKEN from mygpo.web.heatmap import EpisodeHeatmap +from mygpo.history.stats import last_played_episodes from mygpo.publisher.utils import check_publisher_permission from mygpo.web.utils import get_episode_link_target, check_restrictions from mygpo.db.couchdb.episode_state import favorite_episode_ids_for_user, \ chapters_for_episode, set_episode_favorite from mygpo.db.couchdb.episode_state import episode_state_for_user_episode, \ add_episode_actions, update_episode_chapters -from mygpo.db.couchdb.user import get_latest_episode_ids from mygpo.userfeeds.feeds import FavoriteFeed @@ -161,11 +161,7 @@ def list_favorites(request): .select_related('podcast')\ .prefetch_related('slugs', 'podcast__slugs') - recently_listened_ids = get_latest_episode_ids(user) - recently_listened = Episode.objects.filter(id__in=recently_listened_ids)\ - .select_related('podcast')\ - .prefetch_related('slugs', - 'podcast__slugs') + recently_listened = last_played_episodes(user) favfeed = FavoriteFeed(user) feed_url = favfeed.get_public_url(site.domain) -- 2.11.4.GIT