replace Http404 with more appropriate methods
[mygpo.git] / mygpo / web / views / public.py
blob970462bae1b7441d633fd424bca1ed3ef11a997f
2 # This file is part of my.gpodder.org.
4 # my.gpodder.org is free software: you can redistribute it and/or modify it
5 # under the terms of the GNU Affero General Public License as published by
6 # the Free Software Foundation, either version 3 of the License, or (at your
7 # option) any later version.
9 # my.gpodder.org is distributed in the hope that it will be useful, but
10 # WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
11 # or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public
12 # License for more details.
14 # You should have received a copy of the GNU Affero General Public License
15 # along with my.gpodder.org. If not, see <http://www.gnu.org/licenses/>.
18 from django.shortcuts import render_to_response
19 from django.http import HttpResponseRedirect, HttpResponse, HttpResponseBadRequest, HttpResponseForbidden
20 from django.template import RequestContext
21 from mygpo.api.models import Podcast, Episode, Subscription
22 from mygpo.api import backend
23 from mygpo.data.models import PodcastTag, DirectoryEntry
24 from mygpo.data.mimetype import CONTENT_TYPES
25 from mygpo.decorators import manual_gc
26 from mygpo.web import utils
27 from mygpo import settings
28 from django.shortcuts import get_object_or_404
29 from django.db.models import Sum
30 from django.contrib.sites.models import Site
31 from django.core.paginator import Paginator, InvalidPage, EmptyPage
34 @manual_gc
35 def browse(request, num_categories=10, num_tags_cloud=90, podcasts_per_category=10):
36 total = int(num_categories) + int(num_tags_cloud)
37 top_tags = DirectoryEntry.objects.top_tags(total)
39 categories = []
40 for tag in top_tags[:num_categories]:
41 entries = DirectoryEntry.objects.podcasts_for_tag(tag.tag)[:podcasts_per_category]
42 categories.append({
43 'tag': tag.tag,
44 'entries': entries
47 tag_cloud = top_tags[num_categories:]
49 tag_cloud.sort(key = lambda x: x.tag.lower())
50 max_entries = max([t.entries for t in tag_cloud])
52 return render_to_response('directory.html', {
53 'categories': categories,
54 'tag_cloud': tag_cloud,
55 'max_entries': max_entries,
56 }, context_instance=RequestContext(request))
59 @manual_gc
60 def category(request, category, page_size=20):
61 entries = DirectoryEntry.objects.podcasts_for_tag(category)
63 paginator = Paginator(entries, page_size)
65 # Make sure page request is an int. If not, deliver first page.
66 try:
67 page = int(request.GET.get('page', '1'))
68 except ValueError:
69 page = 1
71 # If page request (9999) is out of range, deliver last page of results.
72 try:
73 podcasts = paginator.page(page)
74 except (EmptyPage, InvalidPage):
75 podcasts = paginator.page(paginator.num_pages)
77 page_list = utils.get_page_list(1, podcasts.paginator.num_pages, podcasts.number, 15)
79 return render_to_response('category.html', {
80 'entries': podcasts,
81 'category': category,
82 'page_list': page_list,
83 }, context_instance=RequestContext(request))
86 @manual_gc
87 def toplist(request, num=100, lang=None):
89 try:
90 lang = utils.process_lang_params(request, '/toplist/')
91 except utils.UpdatedException, updated:
92 return HttpResponseRedirect('/toplist/?lang=%s' % ','.join(updated.data))
94 type_str = request.GET.get('types', '')
95 set_types = [t for t in type_str.split(',') if t]
96 if set_types:
97 media_types = dict([(t, t in set_types) for t in CONTENT_TYPES])
98 else:
99 media_types = dict([(t, True) for t in CONTENT_TYPES])
101 entries = backend.get_toplist(num, lang, set_types)
103 max_subscribers = max([e.subscriptions for e in entries]) if entries else 0
104 current_site = Site.objects.get_current()
105 all_langs = utils.get_language_names(utils.get_podcast_languages())
107 return render_to_response('toplist.html', {
108 'entries': entries,
109 'max_subscribers': max_subscribers,
110 'url': current_site,
111 'languages': lang,
112 'all_languages': all_langs,
113 'types': media_types,
114 }, context_instance=RequestContext(request))
117 @manual_gc
118 def episode_toplist(request, num=100):
120 try:
121 lang = utils.process_lang_params(request, '/toplist/episodes')
122 except utils.UpdatedException, updated:
123 return HttpResponseRedirect('/toplist/episodes?lang=%s' % ','.join(updated.data))
125 type_str = request.GET.get('types', '')
126 set_types = [t for t in type_str.split(',') if t]
127 if set_types:
128 media_types = dict([(t, t in set_types) for t in CONTENT_TYPES])
129 else:
130 media_types = dict([(t, True) for t in CONTENT_TYPES])
132 entries = backend.get_episode_toplist(num, lang, set_types)
134 current_site = Site.objects.get_current()
136 # Determine maximum listener amount (or 0 if no entries exist)
137 max_listeners = max([0]+[e.listeners for e in entries])
138 all_langs = utils.get_language_names(utils.get_podcast_languages())
139 return render_to_response('episode_toplist.html', {
140 'entries': entries,
141 'max_listeners': max_listeners,
142 'url': current_site,
143 'languages': lang,
144 'all_languages': all_langs,
145 'types': media_types,
146 }, context_instance=RequestContext(request))
149 def gpodder_example_podcasts(request):
150 sponsored_podcast = utils.get_sponsored_podcast()
151 return render_to_response('gpodder_examples.opml', {
152 'sponsored_podcast': sponsored_podcast
153 }, context_instance=RequestContext(request))