[Registration] implement User registration logic
[mygpo.git] / mygpo / share / userpage.py
blob4623b259fe85e6b1eabfcf9f2a3fbfa26573e53d
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)
37 context_funs = {
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),
48 context = {
49 'page_user': user,
50 'flattr_username': user.profile.get_wksetting(FLATTR_USERNAME),
51 'site': site.domain,
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',
74 'podcast__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')
91 return favorites
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)