1 from datetime
import datetime
, timedelta
3 from django
.shortcuts
import render
4 from django
.views
.generic
.base
import View
5 from django
.utils
.decorators
import method_decorator
6 from django
.contrib
.sites
.models
import RequestSite
7 from django
.contrib
.auth
import get_user_model
9 from mygpo
.podcasts
.models
import Episode
10 from mygpo
.users
.models
import HistoryEntry
11 from mygpo
.users
.settings
import FLATTR_USERNAME
12 from mygpo
.subscriptions
import get_subscribed_podcasts
13 from mygpo
.decorators
import requires_token
14 from mygpo
.podcastlists
.models
import PodcastList
15 from mygpo
.users
.subscriptions
import PodcastPercentageListenedSorter
16 from mygpo
.db
.couchdb
.episode_state
import favorite_episode_ids_for_user
17 from mygpo
.db
.couchdb
.user
import get_latest_episode_ids
, \
18 get_num_played_episodes
, get_seconds_played
22 class UserpageView(View
):
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
= get_user_model()
30 user
= User
.objects
.get(username
=username
)
31 month_ago
= datetime
.today() - timedelta(days
=31)
32 site
= RequestSite(request
)
36 'flattr_username': user
.profile
.get_wksetting(FLATTR_USERNAME
),
38 'subscriptions_token': user
.profile
.get_token('subscriptions_token'),
39 'favorite_feeds_token': user
.profile
.get_token('favorite_feeds_token'),
40 'lists': self
.get_podcast_lists(user
),
41 'subscriptions': self
.get_subscriptions(user
),
42 'recent_episodes': self
.get_recent_episodes(user
),
43 'seconds_played_total': self
.get_seconds_played_total(user
),
44 'seconds_played_month': self
.get_seconds_played_since( user
, month_ago
),
45 'favorite_episodes': self
.get_favorite_episodes(user
),
46 'num_played_episodes_total': self
.get_played_episodes_total(user
),
47 'num_played_episodes_month': self
.get_played_episodes_since(user
, month_ago
),
50 return render(request
, 'userpage.html', context
)
53 def get_podcast_lists(self
, user
):
54 return PodcastList
.objects
.filter(user
=user
)
57 def get_subscriptions(self
, user
):
58 subscriptions
= [sp
.podcast
for sp
in get_subscribed_podcasts(user
)]
59 return PodcastPercentageListenedSorter(subscriptions
, user
)
62 def get_recent_episodes(self
, user
):
63 recent_episode_ids
= get_latest_episode_ids(user
)
64 recent_episodes
= Episode
.objects
.filter(id__in
=recent_episode_ids
)\
65 .select_related('podcast')\
66 .prefetch_related('slugs',
68 return recent_episodes
71 def get_seconds_played_total(self
, user
):
72 return get_seconds_played(user
)
75 def get_seconds_played_since(self
, user
, since
):
76 return get_seconds_played(user
, since
=since
)
79 def get_favorite_episodes(self
, user
):
80 favorite_ids
= favorite_episode_ids_for_user(user
)
81 favorites
= Episode
.objects
.filter(id__in
=favorite_ids
)\
82 .select_related('podcast')\
83 .prefetch_related('slugs', 'podcast__slugs')
87 def get_played_episodes_total(self
, user
):
88 return get_num_played_episodes(user
)
91 def get_played_episodes_since(self
, user
, since
):
92 return get_num_played_episodes(user
, since
=since
)