dc1c51dd864075558da44f8e21ba05fe9c521271
[mygpo.git] / mygpo / web / views / subscriptions.py
blobdc1c51dd864075558da44f8e21ba05fe9c521271
1 from django.contrib.auth.decorators import login_required
2 from django.contrib.auth.models import User
3 from django.contrib.sites.models import Site
4 from django.shortcuts import get_object_or_404, render_to_response
5 from django.template import RequestContext
7 from mygpo.decorators import manual_gc, requires_token
8 from mygpo.api.models import Device, Subscription, Episode
9 from mygpo.api import backend, simple
10 from mygpo.web.models import SecurityToken
13 @manual_gc
14 @login_required
15 def list(request):
16 current_site = Site.objects.get_current()
17 subscriptionlist = create_subscriptionlist(request)
18 return render_to_response('subscriptions.html', {
19 'subscriptionlist': subscriptionlist,
20 'url': current_site
21 }, context_instance=RequestContext(request))
24 @manual_gc
25 @login_required
26 def download_all(request):
27 podcasts = backend.get_all_subscriptions(request.user)
28 response = simple.format_podcast_list(podcasts, 'opml', request.user.username)
29 response['Content-Disposition'] = 'attachment; filename=all-subscriptions.opml'
30 return response
33 @manual_gc
34 @requires_token(object='subscriptions', action='r', denied_template='user_subscriptions_denied.html')
35 def for_user(request, username):
36 user = get_object_or_404(User, username=username)
37 public_subscriptions = backend.get_public_subscriptions(user)
38 token = SecurityToken.objects.get(object='subscriptions', action='r', user__username=username)
40 return render_to_response('user_subscriptions.html', {
41 'subscriptions': public_subscriptions,
42 'other_user': user,
43 'token': token,
44 }, context_instance=RequestContext(request))
46 @requires_token(object='subscriptions', action='r')
47 def for_user_opml(request, username):
48 user = get_object_or_404(User, username=username)
49 public_subscriptions = backend.get_public_subscriptions(user)
51 response = render_to_response('user_subscriptions.opml', {
52 'subscriptions': public_subscriptions,
53 'other_user': user
54 }, context_instance=RequestContext(request))
55 response['Content-Disposition'] = 'attachment; filename=%s-subscriptions.opml' % username
56 return response
59 def create_subscriptionlist(request):
60 #sync all devices first
61 for d in Device.objects.filter(user=request.user):
62 d.sync()
64 subscriptions = Subscription.objects.filter(user=request.user)
66 l = {}
67 for s in subscriptions:
68 if s.podcast in l:
69 l[s.podcast]['devices'].append(s.device)
70 else:
71 e = Episode.objects.filter(podcast=s.podcast, timestamp__isnull=False).order_by('-timestamp')
72 episode = e[0] if e.count() > 0 else None
73 devices = [s.device]
74 l[s.podcast] = {'podcast': s.podcast, 'episode': episode, 'devices': devices}
76 return l.values()