1 from functools
import wraps
3 from django
.shortcuts
import render
4 from django
.http
import HttpResponse
, HttpResponseRedirect
, \
5 HttpResponseForbidden
, Http404
6 from django
.views
.decorators
.cache
import never_cache
, cache_control
7 from django
.views
.decorators
.vary
import vary_on_cookie
8 from django
.core
.urlresolvers
import reverse
10 from mygpo
.core
.models
import Podcast
11 from mygpo
.core
.proxy
import proxy_object
12 from mygpo
.publisher
.auth
import require_publisher
, is_publisher
13 from mygpo
.publisher
.forms
import SearchPodcastForm
14 from mygpo
.publisher
.utils
import listener_data
, episode_listener_data
, \
15 check_publisher_permission
, subscriber_data
16 from mygpo
.web
.heatmap
import EpisodeHeatmap
17 from mygpo
.web
.views
.episode
import oldid_decorator
, slug_id_decorator
18 from mygpo
.web
.views
.podcast
import \
19 slug_id_decorator
as podcast_slug_id_decorator
, \
20 oldid_decorator
as podcast_oldid_decorator
21 from mygpo
.web
.utils
import get_podcast_link_target
22 from django
.contrib
.sites
.models
import RequestSite
23 from mygpo
.data
.feeddownloader
import update_podcasts
24 from mygpo
.decorators
import requires_token
, allowed_methods
25 from mygpo
.users
.models
import User
26 from mygpo
.db
.couchdb
.episode
import episodes_for_podcast
27 from mygpo
.db
.couchdb
.podcast
import podcast_by_id
, podcasts_by_id
, \
28 podcast_for_url
, podcastgroup_for_slug_id
, podcastgroup_for_oldid
, \
33 @cache_control(private
=True)
35 if is_publisher(request
.user
):
36 podcasts
= podcasts_by_id(request
.user
.published_objects
)
37 form
= SearchPodcastForm()
38 return render(request
, 'publisher/home.html', {
44 site
= RequestSite(request
)
45 return render(request
, 'publisher/info.html', {
51 @cache_control(private
=True)
53 def search_podcast(request
):
54 form
= SearchPodcastForm(request
.POST
)
56 url
= form
.cleaned_data
['url']
58 podcast
= podcast_for_url(url
)
62 url
= get_podcast_link_target(podcast
, 'podcast-publisher-detail')
64 url
= reverse('publisher')
66 return HttpResponseRedirect(url
)
70 @cache_control(private
=True)
72 @allowed_methods(['GET', 'POST'])
73 def podcast(request
, podcast
):
75 if not check_publisher_permission(request
.user
, podcast
):
76 return HttpResponseForbidden()
78 timeline_data
= listener_data([podcast
])
79 subscription_data
= subscriber_data([podcast
])[-20:]
82 group
= podcastgroup_by_id(podcast
.group
)
86 # if request.method == 'POST':
87 # form = NonePodcastForm(request.POST, instance=p)
91 # elif request.method == 'GET':
92 # form = PodcastForm(instance=p)
94 if 'new_token' in request
.GET
:
95 request
.user
.create_new_token('publisher_update_token')
98 update_token
= request
.user
.publisher_update_token
100 heatmap
= EpisodeHeatmap(podcast
.get_id())
102 site
= RequestSite(request
)
104 return render(request
, 'publisher/podcast.html', {
109 'timeline_data': timeline_data
,
110 'subscriber_data': subscription_data
,
111 'update_token': update_token
,
117 @cache_control(private
=True)
119 def group(request
, group
):
121 podcasts
= group
.podcasts
123 # users need to have publisher access for at least one of the group's podcasts
124 if not any([check_publisher_permission(request
.user
, p
) for p
in podcasts
]):
125 return HttpResponseForbidden()
127 timeline_data
= listener_data(podcasts
)
128 subscription_data
= list(subscriber_data(podcasts
))[-20:]
130 return render(request
, 'publisher/group.html', {
132 'timeline_data': timeline_data
,
133 'subscriber_data': subscription_data
,
138 @cache_control(private
=True)
140 def update_podcast(request
, podcast
):
142 if not check_publisher_permission(request
.user
, podcast
):
143 return HttpResponseForbidden()
145 update_podcasts( [podcast
] )
147 url
= get_podcast_link_target(podcast
, 'podcast-publisher-detail')
148 return HttpResponseRedirect(url
)
152 @requires_token(token_name
='publisher_update_token')
153 def update_published_podcasts(request
, username
):
154 user
= User
.get_user(username
)
158 published_podcasts
= podcasts_by_id(user
.published_objects
)
159 update_podcasts(published_podcasts
)
161 return HttpResponse('Updated:\n' + '\n'.join([p
.url
for p
in published_podcasts
]), mimetype
='text/plain')
165 @cache_control(private
=True)
167 def episodes(request
, podcast
):
169 if not check_publisher_permission(request
.user
, podcast
):
170 return HttpResponseForbidden()
172 episodes
= episodes_for_podcast(podcast
, descending
=True)
173 listeners
= dict(podcast
.episode_listener_counts())
175 max_listeners
= max(listeners
.values() + [0])
177 def annotate_episode(episode
):
178 listener_count
= listeners
.get(episode
._id
, None)
179 return proxy_object(episode
, listeners
=listener_count
)
181 episodes
= map(annotate_episode
, episodes
)
183 return render(request
, 'publisher/episodes.html', {
185 'episodes': episodes
,
186 'max_listeners': max_listeners
192 @cache_control(private
=True)
193 @allowed_methods(['GET', 'POST'])
194 def episode(request
, episode
):
196 podcast
= podcast_by_id(episode
.podcast
)
198 if not check_publisher_permission(request
.user
, podcast
):
199 return HttpResponseForbidden()
201 if request
.method
== 'POST':
202 form
= None #EpisodeForm(request.POST, instance=e)
206 elif request
.method
== 'GET':
207 form
= None #EpisodeForm(instance=e)
209 timeline_data
= list(episode_listener_data(episode
))
211 heatmap
= EpisodeHeatmap(episode
.podcast
, episode
._id
,
212 duration
=episode
.duration
)
214 return render(request
, 'publisher/episode.html', {
218 'timeline_data': timeline_data
,
224 @cache_control(private
=True)
226 current_site
= RequestSite(request
)
227 return render(request
, 'link.html', {
233 @cache_control(private
=True)
234 def advertise(request
):
235 site
= RequestSite(request
)
236 return render(request
, 'publisher/advertise.html', {
241 def group_slug_id_decorator(f
):
243 def _decorator(request
, slug_id
, *args
, **kwargs
):
244 group
= podcastgroup_for_slug_id(slug_id
)
249 return f(request
, group
, *args
, **kwargs
)
254 def group_oldid_decorator(f
):
256 def _decorator(request
, pid
, *args
, **kwargs
):
259 except (TypeError, ValueError):
262 group
= podcastgroup_for_oldid(pid
)
267 return f(request
, group
, *args
, **kwargs
)
273 episode_oldid
= oldid_decorator(episode
)
274 podcast_oldid
= podcast_oldid_decorator(podcast
)
275 update_podcast_oldid
= podcast_oldid_decorator(update_podcast
)
276 episodes_oldid
= podcast_oldid_decorator(episodes
)
277 group_oldid
= group_oldid_decorator(group
)
279 episode_slug_id
= slug_id_decorator(episode
)
280 podcast_slug_id
= podcast_slug_id_decorator(podcast
)
281 episodes_slug_id
= podcast_slug_id_decorator(episodes
)
282 update_podcast_slug_id
= podcast_slug_id_decorator(update_podcast
)
283 group_slug_id
= group_slug_id_decorator(group
)