remove unused imports
[mygpo.git] / mygpo / publisher / views.py
blobaee4c781857120bae4c8a48dd1828e689626a5bd
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.proxy import proxy_object
11 from mygpo.publisher.auth import require_publisher, is_publisher
12 from mygpo.publisher.forms import SearchPodcastForm
13 from mygpo.publisher.utils import listener_data, episode_listener_data, \
14 check_publisher_permission, subscriber_data
15 from mygpo.web.heatmap import EpisodeHeatmap
16 from mygpo.web.views.episode import oldid_decorator, slug_id_decorator
17 from mygpo.web.views.podcast import \
18 slug_id_decorator as podcast_slug_id_decorator, \
19 oldid_decorator as podcast_oldid_decorator
20 from mygpo.web.utils import get_podcast_link_target
21 from django.contrib.sites.models import RequestSite
22 from mygpo.data.feeddownloader import PodcastUpdater
23 from mygpo.decorators import requires_token, allowed_methods
24 from mygpo.users.models import User
25 from mygpo.db.couchdb.episode import episodes_for_podcast
26 from mygpo.db.couchdb.podcast import podcast_by_id, podcasts_by_id, \
27 podcast_for_url, podcastgroup_for_slug_id, podcastgroup_for_oldid, \
28 podcastgroup_by_id
29 from mygpo.db.couchdb.episode_state import episode_listener_counts
32 @vary_on_cookie
33 @cache_control(private=True)
34 def home(request):
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', {
39 'podcasts': podcasts,
40 'form': form,
43 else:
44 site = RequestSite(request)
45 return render(request, 'publisher/info.html', {
46 'site': site
50 @vary_on_cookie
51 @cache_control(private=True)
52 @require_publisher
53 def search_podcast(request):
54 form = SearchPodcastForm(request.POST)
55 if form.is_valid():
56 url = form.cleaned_data['url']
58 podcast = podcast_for_url(url)
59 if not podcast:
60 raise Http404
62 url = get_podcast_link_target(podcast, 'podcast-publisher-detail')
63 else:
64 url = reverse('publisher')
66 return HttpResponseRedirect(url)
69 @vary_on_cookie
70 @cache_control(private=True)
71 @require_publisher
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:]
81 if podcast.group:
82 group = podcastgroup_by_id(podcast.group)
83 else:
84 group = None
86 # if request.method == 'POST':
87 # form = NonePodcastForm(request.POST, instance=p)
88 # if form.is_valid():
89 # form.save()
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')
96 request.user.save()
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', {
105 'site': site,
106 'podcast': podcast,
107 'group': group,
108 'form': None,
109 'timeline_data': timeline_data,
110 'subscriber_data': subscription_data,
111 'update_token': update_token,
112 'heatmap': heatmap,
116 @vary_on_cookie
117 @cache_control(private=True)
118 @require_publisher
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', {
131 'group': group,
132 'timeline_data': timeline_data,
133 'subscriber_data': subscription_data,
137 @vary_on_cookie
138 @cache_control(private=True)
139 @require_publisher
140 def update_podcast(request, podcast):
142 if not check_publisher_permission(request.user, podcast):
143 return HttpResponseForbidden()
145 updater = PodcastUpdater( [podcast] )
146 updater.update()
148 url = get_podcast_link_target(podcast, 'podcast-publisher-detail')
149 return HttpResponseRedirect(url)
152 @never_cache
153 @requires_token(token_name='publisher_update_token')
154 def update_published_podcasts(request, username):
155 user = User.get_user(username)
156 if not user:
157 raise Http404
159 published_podcasts = podcasts_by_id(user.published_objects)
160 updater = PodcastUpdater(published_podcasts)
161 updater.update()
163 return HttpResponse('Updated:\n' + '\n'.join([p.url for p in published_podcasts]), mimetype='text/plain')
166 @vary_on_cookie
167 @cache_control(private=True)
168 @require_publisher
169 def episodes(request, podcast):
171 if not check_publisher_permission(request.user, podcast):
172 return HttpResponseForbidden()
174 episodes = episodes_for_podcast(podcast, descending=True)
175 listeners = dict(episode_listener_counts(podcast))
177 max_listeners = max(listeners.values() + [0])
179 def annotate_episode(episode):
180 listener_count = listeners.get(episode._id, None)
181 return proxy_object(episode, listeners=listener_count)
183 episodes = map(annotate_episode, episodes)
185 return render(request, 'publisher/episodes.html', {
186 'podcast': podcast,
187 'episodes': episodes,
188 'max_listeners': max_listeners
192 @require_publisher
193 @vary_on_cookie
194 @cache_control(private=True)
195 @allowed_methods(['GET', 'POST'])
196 def episode(request, episode):
198 podcast = podcast_by_id(episode.podcast)
200 if not check_publisher_permission(request.user, podcast):
201 return HttpResponseForbidden()
203 if request.method == 'POST':
204 form = None #EpisodeForm(request.POST, instance=e)
205 #if form.is_valid():
206 # form.save()
208 elif request.method == 'GET':
209 form = None #EpisodeForm(instance=e)
211 timeline_data = list(episode_listener_data(episode))
213 heatmap = EpisodeHeatmap(episode.podcast, episode._id,
214 duration=episode.duration)
216 return render(request, 'publisher/episode.html', {
217 'episode': episode,
218 'podcast': podcast,
219 'form': form,
220 'timeline_data': timeline_data,
221 'heatmap': heatmap,
225 @vary_on_cookie
226 @cache_control(private=True)
227 def link(request):
228 current_site = RequestSite(request)
229 return render(request, 'link.html', {
230 'url': current_site
234 @vary_on_cookie
235 @cache_control(private=True)
236 def advertise(request):
237 site = RequestSite(request)
238 return render(request, 'publisher/advertise.html', {
239 'site': site
243 def group_slug_id_decorator(f):
244 @wraps(f)
245 def _decorator(request, slug_id, *args, **kwargs):
246 group = podcastgroup_for_slug_id(slug_id)
248 if podcast is None:
249 raise Http404
251 return f(request, group, *args, **kwargs)
253 return _decorator
256 def group_oldid_decorator(f):
257 @wraps(f)
258 def _decorator(request, pid, *args, **kwargs):
259 try:
260 pid = int(pid)
261 except (TypeError, ValueError):
262 raise Http404
264 group = podcastgroup_for_oldid(pid)
266 if not podcast:
267 raise Http404
269 return f(request, group, *args, **kwargs)
271 return _decorator
275 episode_oldid = oldid_decorator(episode)
276 podcast_oldid = podcast_oldid_decorator(podcast)
277 update_podcast_oldid = podcast_oldid_decorator(update_podcast)
278 episodes_oldid = podcast_oldid_decorator(episodes)
279 group_oldid = group_oldid_decorator(group)
281 episode_slug_id = slug_id_decorator(episode)
282 podcast_slug_id = podcast_slug_id_decorator(podcast)
283 episodes_slug_id = podcast_slug_id_decorator(episodes)
284 update_podcast_slug_id = podcast_slug_id_decorator(update_podcast)
285 group_slug_id = group_slug_id_decorator(group)