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
29 @cache_control(private
=True)
31 if request
.user
.is_authenticated
:
32 return dashboard(request
)
34 return welcome(request
)
38 @cache_control(private
=True)
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
})
50 @cache_control(private
=True)
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
)
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',
97 # 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
= "firefox" in request
.META
.get("HTTP_USER_AGENT", "").lower()
107 random_podcast
= Podcast
.objects
.all().random().prefetch_related("slugs").first()
113 "user": request
.user
,
114 "subscribed_podcasts": subscribed_podcasts
,
115 "newest_episodes": list(newest_episodes
),
116 "random_podcast": random_podcast
,
117 "checklist": checklist
,
119 "show_install_reader": show_install_reader
,
120 "podcast_ad": podcast_ad
,
126 @cache_control(private
=True)
129 tags_tag
= defaultdict(list)
133 tags
= Tag
.objects
.filter(source
=Tag
.USER
, user
=user
).order_by("tag")
135 tags_tag
[tag
.tag
].append(tag
.content_object
)
137 return render(request
, "mytags.html", {"tags_tag": dict(tags_tag
.items())})
141 def csrf_failure(request
, reason
=""):
142 site
= RequestSite(request
)
148 "method": request
.method
,
149 "referer": request
.META
.get("HTTP_REFERER", _("another site")),
150 "path": request
.path
,
152 "post": request
.POST
,