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 ugettext
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
23 #from mygpo.web.views.podcast import slug_id_decorator
24 from mygpo
.publisher
.models
import PublishedPodcast
28 @cache_control(private
=True)
30 if request
.user
.is_authenticated
:
31 return dashboard(request
)
33 return welcome(request
)
37 @cache_control(private
=True)
39 current_site
= RequestSite(request
)
41 lang
= process_lang_params(request
)
43 toplist
= Podcast
.objects
.all().toplist(lang
)
45 return render(request
, 'home.html', {
52 @cache_control(private
=True)
54 def dashboard(request
, episode_count
=10):
56 subscribed_podcasts
= get_subscribed_podcasts(request
.user
)
57 subscribed_podcasts
= [sp
.podcast
for sp
in subscribed_podcasts
]
59 podcast_ad
= Podcast
.objects
.get_advertised_podcast()
61 site
= RequestSite(request
)
65 if request
.user
.client_set
.count():
66 checklist
.append('devices')
68 if subscribed_podcasts
:
69 checklist
.append('subscriptions')
71 if FavoriteEpisode
.objects
.filter(user
=request
.user
).exists():
72 checklist
.append('favorites')
74 if not request
.user
.profile
.get_token('subscriptions_token'):
75 checklist
.append('share')
77 if not request
.user
.profile
.get_token('favorite_feeds_token'):
78 checklist
.append('share-favorites')
80 if not request
.user
.profile
.get_token('userpage_token'):
81 checklist
.append('userpage')
83 if Tag
.objects
.filter(user
=request
.user
).exists():
84 checklist
.append('tags')
86 if PodcastList
.objects
.filter(user
=request
.user
).exists():
87 checklist
.append('lists')
89 if PublishedPodcast
.objects
.filter(publisher
=request
.user
).exists():
90 checklist
.append('publish')
92 tomorrow
= datetime
.today() + timedelta(days
=1)
94 newest_episodes
= Episode
.objects
.filter(podcast__in
=subscribed_podcasts
,
95 released__lt
=tomorrow
).\
96 select_related('podcast').\
97 prefetch_related('slugs',
99 order_by('-released')[:episode_count
]
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
= \
106 'firefox' in request
.META
.get('HTTP_USER_AGENT', '').lower()
108 random_podcast
= Podcast
.objects
.all().random().prefetch_related('slugs').first()
110 return render(request
, 'dashboard.html', {
111 'user': request
.user
,
112 'subscribed_podcasts': subscribed_podcasts
,
113 'newest_episodes': list(newest_episodes
),
114 'random_podcast': random_podcast
,
115 'checklist': checklist
,
117 'show_install_reader': show_install_reader
,
118 'podcast_ad': podcast_ad
,
123 @cache_control(private
=True)
126 tags_tag
= defaultdict(list)
130 tags
= Tag
.objects
.filter(source
=Tag
.USER
, user
=user
).order_by('tag')
132 tags_tag
[tag
.tag
].append(tag
.content_object
)
134 return render(request
, 'mytags.html', {
135 'tags_tag': dict(tags_tag
.items()),
140 def csrf_failure(request
, reason
=""):
141 site
= RequestSite(request
)
142 return render(request
, 'csrf.html', {
144 'method': request
.method
,
145 'referer': request
.META
.get('HTTP_REFERER', _('another site')),
146 'path': request
.path
,
148 'post': request
.POST
,