1 from datetime
import datetime
, timedelta
3 from functools
import partial
5 from django
.shortcuts
import render
6 from django
.views
.generic
.base
import View
7 from django
.utils
.decorators
import method_decorator
8 from django
.contrib
.sites
.models
import RequestSite
9 from django
.contrib
.auth
import get_user_model
11 from mygpo
.podcasts
.models
import Episode
12 from mygpo
.users
.models
import HistoryEntry
13 from mygpo
.users
.settings
import FLATTR_USERNAME
14 from mygpo
.users
.subscriptions
import get_subscribed_podcasts
15 from mygpo
.decorators
import requires_token
16 from mygpo
.users
.subscriptions
import PodcastPercentageListenedSorter
17 from mygpo
.web
.views
import GeventView
18 from mygpo
.db
.couchdb
.episode_state
import favorite_episode_ids_for_user
19 from mygpo
.db
.couchdb
.user
import get_latest_episode_ids
, \
20 get_num_played_episodes
, get_seconds_played
21 from mygpo
.db
.couchdb
.podcastlist
import podcastlists_for_user
25 class UserpageView(GeventView
):
26 """ Shows the profile page for a user """
28 @method_decorator(requires_token(token_name
='userpage_token',
29 denied_template
='userpage-denied.html'))
30 def get(self
, request
, username
):
32 User
= get_user_model()
33 user
= User
.objects
.get(username
=username
)
34 month_ago
= datetime
.today() - timedelta(days
=31)
35 site
= RequestSite(request
)
38 'lists': partial(self
.get_podcast_lists
, user
),
39 'subscriptions': partial(self
.get_subscriptions
, user
),
40 'recent_episodes': partial(self
.get_recent_episodes
, user
),
41 'seconds_played_total': partial(self
.get_seconds_played_total
, user
),
42 'seconds_played_month': partial(self
.get_seconds_played_since
, user
, month_ago
),
43 'favorite_episodes': partial(self
.get_favorite_episodes
, user
),
44 'num_played_episodes_total': partial(self
.get_played_episodes_total
, user
),
45 'num_played_episodes_month': partial(self
.get_played_episodes_since
, user
, month_ago
),
50 'flattr_username': user
.profile
.get_wksetting(FLATTR_USERNAME
),
52 'subscriptions_token': user
.profile
.get_token('subscriptions_token'),
53 'favorite_feeds_token': user
.profile
.get_token('favorite_feeds_token'),
55 context
.update(self
.get_context(context_funs
))
57 return render(request
, 'userpage.html', context
)
60 def get_podcast_lists(self
, user
):
61 return podcastlists_for_user(user
.profile
.uuid
.hex)
64 def get_subscriptions(self
, user
):
65 subscriptions
= get_subscribed_podcasts(user
)
66 return PodcastPercentageListenedSorter(subscriptions
, user
)
69 def get_recent_episodes(self
, user
):
70 recent_episode_ids
= get_latest_episode_ids(user
)
71 recent_episodes
= Episode
.objects
.filter(id__in
=recent_episode_ids
)\
72 .select_related('podcast')\
73 .prefetch_related('slugs',
75 return recent_episodes
78 def get_seconds_played_total(self
, user
):
79 return get_seconds_played(user
)
82 def get_seconds_played_since(self
, user
, since
):
83 return get_seconds_played(user
, since
=since
)
86 def get_favorite_episodes(self
, user
):
87 favorite_ids
= favorite_episode_ids_for_user(user
)
88 favorites
= Episode
.objects
.filter(id__in
=favorite_ids
)\
89 .select_related('podcast')\
90 .prefetch_related('slugs', 'podcast__slugs')
94 def get_played_episodes_total(self
, user
):
95 return get_num_played_episodes(user
)
98 def get_played_episodes_since(self
, user
, since
):
99 return get_num_played_episodes(user
, since
=since
)