move all User and EpisodetUserState db queries into separate module
[mygpo.git] / mygpo / share / userpage.py
blob36d3bcace2cc4ec3831f597fb596776d040efa6f
1 from datetime import datetime, timedelta
3 import gevent
5 from django.shortcuts import render
6 from django.views.generic.base import View
7 from django.utils.decorators import method_decorator
9 from mygpo.share.models import PodcastList
10 from mygpo.users.models import User
11 from mygpo.users.models import HistoryEntry
12 from mygpo.decorators import requires_token
13 from mygpo.web.utils import fetch_episode_data
14 from mygpo.users.subscriptions import PodcastPercentageListenedSorter
15 from mygpo.web.views import GeventView
16 from mygpo.db.couchdb.episode import favorite_episodes_for_user
17 from mygpo.db.couchdb.user import get_latest_episodes, \
18 get_num_played_episodes, get_seconds_played
22 class UserpageView(GeventView):
23 """ Shows the profile page for a user """
25 @method_decorator(requires_token(token_name='userpage_token',
26 denied_template='userpage-denied.html'))
27 def get(self, request, username):
29 user = User.get_user(username)
30 month_ago = datetime.today() - timedelta(days=31)
32 context_funs = {
33 'lists': gevent.spawn(self.get_podcast_lists, user),
34 'subscriptions': gevent.spawn(self.get_subscriptions, user),
35 'recent_episodes': gevent.spawn(self.get_recent_episodes, user),
36 'seconds_played_total': gevent.spawn(self.get_seconds_played_total, user),
37 'seconds_played_month': gevent.spawn(self.get_seconds_played_since, user, month_ago),
38 'favorite_episodes': gevent.spawn(self.get_favorite_episodes, user),
39 'num_played_episodes_total': gevent.spawn(self.get_played_episodes_total, user),
40 'num_played_episodes_month': gevent.spawn(self.get_played_episodes_since, user, month_ago),
43 context = {
44 'page_user': user,
45 'subscriptions_token': user.get_token('subscriptions_token'),
46 'favorite_feeds_token': user.get_token('favorite_feeds_token'),
48 context.update(self.get_context(context_funs))
50 return render(request, 'userpage.html', context)
53 def get_podcast_lists(self, user):
54 return list(PodcastList.for_user(user._id))
57 def get_subscriptions(self, user):
58 subscriptions = user.get_subscribed_podcasts()
59 return PodcastPercentageListenedSorter(subscriptions, user)
62 def get_recent_episodes(self, user):
63 recent_episodes = get_latest_episodes(user)
64 return fetch_episode_data(recent_episodes)
67 def get_seconds_played_total(self, user):
68 return get_seconds_played(user)
71 def get_seconds_played_since(self, user, since):
72 return get_seconds_played(user, since=since)
75 def get_favorite_episodes(self, user):
76 favorite_episodes = favorite_episodes_for_user(user)
77 return fetch_episode_data(favorite_episodes)
80 def get_played_episodes_total(self, user):
81 return get_num_played_episodes(user)
84 def get_played_episodes_since(self, user, since):
85 return get_num_played_episodes(user, since=since)