[Core] remove gevent usage
[mygpo.git] / mygpo / web / views / __init__.py
blobccad9e2d2eb27f62a83e15d476dccf1893d8a5c5
2 # This file is part of my.gpodder.org.
4 # my.gpodder.org is free software: you can redistribute it and/or modify it
5 # under the terms of the GNU Affero General Public License as published by
6 # the Free Software Foundation, either version 3 of the License, or (at your
7 # option) any later version.
9 # my.gpodder.org is distributed in the hope that it will be useful, but
10 # WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
11 # or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public
12 # License for more details.
14 # You should have received a copy of the GNU Affero General Public License
15 # along with my.gpodder.org. If not, see <http://www.gnu.org/licenses/>.
18 import sys
19 from collections import defaultdict
20 from datetime import datetime, timedelta
22 from django.core.urlresolvers import reverse
23 from django.http import HttpResponseRedirect
24 from django.contrib import messages
25 from django.utils.translation import ugettext as _
26 from django.contrib.auth.decorators import login_required
27 from django.shortcuts import render
28 from django.contrib.sites.models import RequestSite
29 from django.views.generic.base import View
30 from django.views.decorators.vary import vary_on_cookie
31 from django.views.decorators.cache import never_cache, cache_control
33 from mygpo.decorators import repeat_on_conflict
34 from mygpo.podcasts.models import Podcast, Episode, Tag
35 from mygpo.users.models import HistoryEntry, Client
36 from mygpo.users.tasks import update_suggestions
37 from mygpo.subscriptions import get_subscribed_podcasts
38 from mygpo.web.utils import process_lang_params
39 from mygpo.utils import parse_range
40 #from mygpo.web.views.podcast import slug_id_decorator
41 from mygpo.users.settings import FLATTR_AUTO, FLATTR_TOKEN
42 from mygpo.publisher.models import PublishedPodcast
43 from mygpo.db.couchdb.episode_state import favorite_episode_ids_for_user
44 from mygpo.db.couchdb.user import (suggestions_for_user,
45 blacklist_suggested_podcast)
46 from mygpo.db.couchdb.directory import tags_for_user
47 from mygpo.db.couchdb.podcastlist import podcastlists_for_user
50 @vary_on_cookie
51 @cache_control(private=True)
52 def home(request):
53 if request.user.is_authenticated():
54 return dashboard(request)
55 else:
56 return welcome(request)
59 @vary_on_cookie
60 @cache_control(private=True)
61 def welcome(request):
62 current_site = RequestSite(request)
64 lang = process_lang_params(request)
66 toplist = Podcast.objects.all().toplist(lang)
68 return render(request, 'home.html', {
69 'url': current_site,
70 'toplist': toplist,
74 @vary_on_cookie
75 @cache_control(private=True)
76 @login_required
77 def dashboard(request, episode_count=10):
79 subscribed_podcasts = get_subscribed_podcasts(request.user)
80 subscribed_podcasts = [sp.podcast for sp in subscribed_podcasts]
82 site = RequestSite(request)
84 checklist = []
86 if request.user.client_set.count():
87 checklist.append('devices')
89 if subscribed_podcasts:
90 checklist.append('subscriptions')
92 if favorite_episode_ids_for_user(request.user):
93 checklist.append('favorites')
95 if not request.user.profile.get_token('subscriptions_token'):
96 checklist.append('share')
98 if not request.user.profile.get_token('favorite_feeds_token'):
99 checklist.append('share-favorites')
101 if not request.user.profile.get_token('userpage_token'):
102 checklist.append('userpage')
104 if tags_for_user(request.user):
105 checklist.append('tags')
107 # TODO add podcastlist_count_for_user
108 if podcastlists_for_user(request.user.profile.uuid.hex):
109 checklist.append('lists')
111 if PublishedPodcast.objects.filter(publisher=request.user).exists():
112 checklist.append('publish')
114 if request.user.profile.get_wksetting(FLATTR_TOKEN):
115 checklist.append('flattr')
117 if request.user.profile.get_wksetting(FLATTR_AUTO):
118 checklist.append('auto-flattr')
120 tomorrow = datetime.today() + timedelta(days=1)
122 newest_episodes = Episode.objects.filter(podcast__in=subscribed_podcasts,
123 released__lt=tomorrow).\
124 select_related('podcast').\
125 prefetch_related('slugs',
126 'podcast__slugs').\
127 order_by('-released')[:episode_count]
130 # we only show the "install reader" link in firefox, because we don't know
131 # yet how/if this works in other browsers.
132 # hints appreciated at https://bugs.gpodder.org/show_bug.cgi?id=58
133 show_install_reader = \
134 'firefox' in request.META.get('HTTP_USER_AGENT', '').lower()
136 random_podcast = Podcast.objects.all().random().prefetch_related('slugs').first()
138 return render(request, 'dashboard.html', {
139 'user': request.user,
140 'subscribed_podcasts': subscribed_podcasts,
141 'newest_episodes': list(newest_episodes),
142 'random_podcast': random_podcast,
143 'checklist': checklist,
144 'site': site,
145 'show_install_reader': show_install_reader,
149 @never_cache
150 @login_required
151 #@slug_id_decorator
152 def blacklist(request, blacklisted_podcast):
153 user = request.user
154 suggestion = suggestions_for_user(user)
155 blacklist_suggested_podcast(suggestion, blacklisted_podcast.get_id())
156 update_suggestions.delay(user)
157 return HttpResponseRedirect(reverse('suggestions'))
160 @never_cache
161 @login_required
162 def rate_suggestions(request):
163 rating_val = int(request.GET.get('rate', None))
165 suggestion = suggestions_for_user(request.user)
166 suggestion.rate(rating_val, request.user.profile.uuid.hex)
167 suggestion.save()
169 messages.success(request, _('Thanks for rating!'))
171 return HttpResponseRedirect(reverse('suggestions'))
174 @vary_on_cookie
175 @cache_control(private=True)
176 @login_required
177 def suggestions(request):
178 suggestion_obj = suggestions_for_user(request.user)
179 suggestions = suggestion_obj.get_podcasts()
180 current_site = RequestSite(request)
181 return render(request, 'suggestions.html', {
182 'entries': suggestions,
183 'url': current_site
187 @vary_on_cookie
188 @cache_control(private=True)
189 @login_required
190 def mytags(request):
191 tags_tag = defaultdict(list)
193 user = request.user
195 tags = Tag.objects.filter(source=Tag.USER, user=user).order_by('tag')
196 for tag in tags:
197 tags_tag[tag.tag].append(tag.content_object)
199 return render(request, 'mytags.html', {
200 'tags_tag': dict(tags_tag.items()),