[API] Update to use Django ORM
[mygpo.git] / mygpo / api / advanced / directory.py
blob66c84016ca47eb72ea4912cf51cb714494f82eea
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.http import Http404
19 from django.core.urlresolvers import reverse
20 from django.contrib.sites.models import RequestSite
21 from django.views.decorators.csrf import csrf_exempt
22 from django.views.decorators.cache import cache_page
23 from django.shortcuts import get_object_or_404
25 from mygpo.podcasts.models import Podcast, Episode
26 from mygpo.utils import parse_range, normalize_feed_url
27 from mygpo.directory.tags import Topics
28 from mygpo.web.utils import get_episode_link_target, get_podcast_link_target
29 from mygpo.web.logo import get_logo_url
30 from mygpo.decorators import cors_origin
31 from mygpo.api.httpresponse import JsonResponse
32 from mygpo.db.couchdb.directory import category_for_tag
35 @csrf_exempt
36 @cache_page(60 * 60 * 24)
37 @cors_origin()
38 def top_tags(request, count):
39 count = parse_range(count, 1, 100, 100)
40 tag_cloud = Topics(count, num_cat=0)
41 resp = map(category_data, tag_cloud.tagcloud)
42 return JsonResponse(resp)
45 @csrf_exempt
46 @cache_page(60 * 60 * 24)
47 @cors_origin()
48 def tag_podcasts(request, tag, count):
49 count = parse_range(count, 1, 100, 100)
50 category = category_for_tag(tag)
51 if not category:
52 return JsonResponse([])
54 domain = RequestSite(request).domain
55 query = category.get_podcasts(0, count)
56 resp = map(lambda p: podcast_data(p, domain), query)
57 return JsonResponse(resp)
60 @cache_page(60 * 60)
61 @cors_origin()
62 def podcast_info(request):
63 url = normalize_feed_url(request.GET.get('url', ''))
65 # 404 before we query for url, because query would complain
66 # about missing param
67 if not url:
68 raise Http404
70 podcast = get_object_or_404(Podcast, urls__url=url)
71 domain = RequestSite(request).domain
72 resp = podcast_data(podcast, domain)
74 return JsonResponse(resp)
77 @cache_page(60 * 60)
78 @cors_origin()
79 def episode_info(request):
80 podcast_url = normalize_feed_url(request.GET.get('podcast', ''))
81 episode_url = normalize_feed_url(request.GET.get('url', ''))
83 # 404 before we query for url, because query would complain
84 # about missing parameters
85 if not podcast_url or not episode_url:
86 raise Http404
88 try:
89 query = Episode.objects.filter(podcast__urls__url=podcast_url,
90 urls__url=episode_url)
91 episode = query.select_related('podcast').get()
92 except Episode.DoesNotExist:
93 raise Http404
95 domain = RequestSite(request).domain
97 resp = episode_data(episode, domain)
98 return JsonResponse(resp)
101 def podcast_data(obj, domain, scaled_logo_size=64):
102 if obj is None:
103 raise ValueError('podcast should not be None')
105 podcast = obj
106 subscribers = podcast.subscribers
107 last_subscribers = podcast.subscribers
109 scaled_logo_url = get_logo_url(obj, scaled_logo_size)
111 return {
112 "url": podcast.url,
113 "title": podcast.title,
114 "description": podcast.description,
115 "subscribers": subscribers,
116 "subscribers_last_week": last_subscribers,
117 "logo_url": podcast.logo_url,
118 "scaled_logo_url": 'http://%s%s' % (domain, scaled_logo_url),
119 "website": podcast.link,
120 "mygpo_link": 'http://%s%s' % (domain, get_podcast_link_target(obj)),
123 def episode_data(episode, domain, podcast=None):
125 podcast = podcast or episode.podcast
127 data = {
128 "title": episode.title,
129 "url": episode.url,
130 "podcast_title": podcast.title if podcast else '',
131 "podcast_url": podcast.url if podcast else '',
132 "description": episode.description,
133 "website": episode.link,
134 "mygpo_link": 'http://%(domain)s%(res)s' % dict(domain=domain,
135 res=get_episode_link_target(episode, podcast)) if podcast else ''
138 if episode.released:
139 data['released'] = episode.released.strftime('%Y-%m-%dT%H:%M:%S')
141 return data
144 def category_data(category):
145 return dict(
146 tag = category.label,
147 usage = category.get_weight()