[UserSettings] refactor, add tests
[mygpo.git] / mygpo / share / userpage.py
blobe1d9b8eefa7d823904bb02fe19d5cf412f4095db
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.history.stats import (num_played_episodes, last_played_episodes,
17 seconds_played)
18 from mygpo.favorites.models import FavoriteEpisode
21 class UserpageView(View):
22 """ Shows the profile page for a user """
24 @method_decorator(requires_token(token_name='userpage_token',
25 denied_template='userpage-denied.html'))
26 def get(self, request, username):
28 User = get_user_model()
29 user = User.objects.get(username=username)
30 month_ago = datetime.today() - timedelta(days=31)
31 site = RequestSite(request)
33 context = {
34 'page_user': user,
35 'flattr_username': user.profile.settings.get_wksetting(FLATTR_USERNAME),
36 'site': site.domain,
37 'subscriptions_token': user.profile.get_token('subscriptions_token'),
38 'favorite_feeds_token': user.profile.get_token('favorite_feeds_token'),
39 'lists': self.get_podcast_lists(user),
40 'subscriptions': self.get_subscriptions(user),
41 'recent_episodes': last_played_episodes(user),
42 'seconds_played_total': seconds_played(user),
43 'seconds_played_month': seconds_played(user, month_ago),
44 'favorite_episodes': FavoriteEpisode.episodes_for_user(user),
45 'num_played_episodes_total': num_played_episodes(user),
46 'num_played_episodes_month': num_played_episodes(user, month_ago),
49 return render(request, 'userpage.html', context)
52 def get_podcast_lists(self, user):
53 return PodcastList.objects.filter(user=user)
56 def get_subscriptions(self, user):
57 subscriptions = [sp.podcast for sp in get_subscribed_podcasts(user)]
58 return PodcastPercentageListenedSorter(subscriptions, user)