have list of deleted devices in PodcastUserState
[mygpo.git] / mygpo / web / views / subscriptions.py
blobe694be3122202d80cc4df3ee34aa093d51b4a3c8
1 from django.contrib.auth.decorators import login_required
2 from django.contrib.auth.models import User
3 from django.contrib.sites.models import RequestSite
4 from django.shortcuts import get_object_or_404, render_to_response
5 from django.template import RequestContext
7 from mygpo.core.models import Podcast
8 from mygpo.utils import parse_bool, unzip
9 from mygpo.decorators import manual_gc, requires_token
10 from mygpo.api.models import Device, Subscription, Episode
11 from mygpo.api import backend, simple
12 from mygpo.web import utils
13 from mygpo import migrate
16 @manual_gc
17 @login_required
18 def show_list(request):
19 current_site = RequestSite(request)
20 subscriptionlist = create_subscriptionlist(request)
21 return render_to_response('subscriptions.html', {
22 'subscriptionlist': subscriptionlist,
23 'url': current_site
24 }, context_instance=RequestContext(request))
27 @manual_gc
28 @login_required
29 def download_all(request):
30 podcasts = backend.get_all_subscriptions(request.user)
31 response = simple.format_podcast_list(podcasts, 'opml', request.user.username)
32 response['Content-Disposition'] = 'attachment; filename=all-subscriptions.opml'
33 return response
36 @manual_gc
37 @requires_token(token_name='subscriptions_token', denied_template='user_subscriptions_denied.html')
38 def for_user(request, username):
39 user = get_object_or_404(User, username=username)
40 new_user = migrate.get_or_migrate_user(user)
42 subscriptions = Subscription.objects.public_subscribed_podcasts(user)
43 token = new_user.subscriptions_token
45 return render_to_response('user_subscriptions.html', {
46 'subscriptions': subscriptions,
47 'other_user': user,
48 'token': token,
49 }, context_instance=RequestContext(request))
51 @requires_token(token_name='subscriptions_token')
52 def for_user_opml(request, username):
53 user = get_object_or_404(User, username=username)
54 subscriptions = Subscription.objects.public_subscribed_podcasts(user)
56 if parse_bool(request.GET.get('symbian', False)):
57 subscriptions = map(utils.symbian_opml_changes, subscriptions)
59 response = render_to_response('user_subscriptions.opml', {
60 'subscriptions': subscriptions,
61 'other_user': user
62 }, context_instance=RequestContext(request))
63 response['Content-Disposition'] = 'attachment; filename=%s-subscriptions.opml' % username
64 return response
67 def create_subscriptionlist(request):
68 #sync all devices first
69 for d in Device.objects.filter(user=request.user):
70 d.sync()
72 user = migrate.get_or_migrate_user(request.user)
73 subscriptions = user.get_subscriptions()
75 if not subscriptions:
76 return []
78 # Load all Podcasts and Devices first to ensure that they are
79 # only loaded once, not for each occurance in a Subscription
80 podcast_ids, device_ids = unzip(subscriptions)
81 podcast_ids= list(set(podcast_ids))
82 device_ids = list(set(device_ids))
84 pobj = Podcast.get_multi(podcast_ids)
85 podcasts = dict(zip(podcast_ids, pobj))
86 devices = dict([ (id, user.get_device(id)) for id in device_ids])
88 subscription_list = {}
89 for podcast_id, device_id in subscriptions:
90 device = devices[device_id]
91 if not podcast_id in subscription_list:
92 podcast = podcasts[podcast_id]
93 e = Episode.objects.filter(podcast=podcast.get_old_obj(), timestamp__isnull=False).order_by('-timestamp')
94 episode = e[0] if e.count() > 0 else None
95 subscription_list[podcast_id] = {'podcast': podcasts[podcast_id], 'devices': [device], 'episode': episode}
96 else:
97 subscription_list[podcast_id]['devices'].append(device)
99 return subscription_list.values()