Bump gevent from 21.8.0 to 21.12.0
[mygpo.git] / mygpo / web / views.py
blobe6630b8581317c0bfdad21359ef239b1a56f4efb
1 import sys
2 from collections import defaultdict
3 from datetime import datetime, timedelta
5 from django.urls import reverse
6 from django.http import HttpResponseRedirect
7 from django.contrib import messages
8 from django.utils.translation import gettext as _
9 from django.contrib.auth.decorators import login_required
10 from django.shortcuts import render
11 from django.contrib.sites.requests import RequestSite
12 from django.views import View
13 from django.views.decorators.vary import vary_on_cookie
14 from django.views.decorators.cache import never_cache, cache_control
16 from mygpo.podcasts.models import Podcast, Episode, Tag
17 from mygpo.users.models import HistoryEntry, Client
18 from mygpo.subscriptions import get_subscribed_podcasts
19 from mygpo.web.utils import process_lang_params
20 from mygpo.utils import parse_range
21 from mygpo.podcastlists.models import PodcastList
22 from mygpo.favorites.models import FavoriteEpisode
24 # from mygpo.web.views.podcast import slug_id_decorator
25 from mygpo.publisher.models import PublishedPodcast
28 @vary_on_cookie
29 @cache_control(private=True)
30 def home(request):
31 if request.user.is_authenticated:
32 return dashboard(request)
33 else:
34 return welcome(request)
37 @vary_on_cookie
38 @cache_control(private=True)
39 def welcome(request):
40 current_site = RequestSite(request)
42 lang = process_lang_params(request)
44 toplist = Podcast.objects.all().toplist(lang)
46 return render(request, "home.html", {"url": current_site, "toplist": toplist})
49 @vary_on_cookie
50 @cache_control(private=True)
51 @login_required
52 def dashboard(request, episode_count=10):
54 subscribed_podcasts = get_subscribed_podcasts(request.user)
55 subscribed_podcasts = [sp.podcast for sp in subscribed_podcasts]
57 podcast_ad = Podcast.objects.get_advertised_podcast()
59 site = RequestSite(request)
61 checklist = []
63 if request.user.client_set.count():
64 checklist.append("devices")
66 if subscribed_podcasts:
67 checklist.append("subscriptions")
69 if FavoriteEpisode.objects.filter(user=request.user).exists():
70 checklist.append("favorites")
72 if not request.user.profile.get_token("subscriptions_token"):
73 checklist.append("share")
75 if not request.user.profile.get_token("favorite_feeds_token"):
76 checklist.append("share-favorites")
78 if not request.user.profile.get_token("userpage_token"):
79 checklist.append("userpage")
81 if Tag.objects.filter(user=request.user).exists():
82 checklist.append("tags")
84 if PodcastList.objects.filter(user=request.user).exists():
85 checklist.append("lists")
87 if PublishedPodcast.objects.filter(publisher=request.user).exists():
88 checklist.append("publish")
90 tomorrow = datetime.today() + timedelta(days=1)
92 # newest_episodes = Episode.objects.filter(podcast__in=subscribed_podcasts,
93 # released__lt=tomorrow).\
94 # select_related('podcast').\
95 # prefetch_related('slugs',
96 # 'podcast__slugs').\
97 # order_by('-released')[:episode_count]
100 newest_episodes = []
102 # we only show the "install reader" link in firefox, because we don't know
103 # yet how/if this works in other browsers.
104 # hints appreciated at https://bugs.gpodder.org/show_bug.cgi?id=58
105 show_install_reader = "firefox" in request.META.get("HTTP_USER_AGENT", "").lower()
107 random_podcast = Podcast.objects.all().random().prefetch_related("slugs").first()
109 return render(
110 request,
111 "dashboard.html",
113 "user": request.user,
114 "subscribed_podcasts": subscribed_podcasts,
115 "newest_episodes": list(newest_episodes),
116 "random_podcast": random_podcast,
117 "checklist": checklist,
118 "site": site,
119 "show_install_reader": show_install_reader,
120 "podcast_ad": podcast_ad,
125 @vary_on_cookie
126 @cache_control(private=True)
127 @login_required
128 def mytags(request):
129 tags_tag = defaultdict(list)
131 user = request.user
133 tags = Tag.objects.filter(source=Tag.USER, user=user).order_by("tag")
134 for tag in tags:
135 tags_tag[tag.tag].append(tag.content_object)
137 return render(request, "mytags.html", {"tags_tag": dict(tags_tag.items())})
140 @never_cache
141 def csrf_failure(request, reason=""):
142 site = RequestSite(request)
143 return render(
144 request,
145 "csrf.html",
147 "site": site,
148 "method": request.method,
149 "referer": request.META.get("HTTP_REFERER", _("another site")),
150 "path": request.path,
151 "get": request.GET,
152 "post": request.POST,