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
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
,
24 }, context_instance
=RequestContext(request
))
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'
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
,
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
,
62 }, context_instance
=RequestContext(request
))
63 response
['Content-Disposition'] = 'attachment; filename=%s-subscriptions.opml' % username
67 def create_subscriptionlist(request
):
68 #sync all devices first
69 for d
in Device
.objects
.filter(user
=request
.user
):
72 user
= migrate
.get_or_migrate_user(request
.user
)
73 subscriptions
= user
.get_subscriptions()
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
}
97 subscription_list
[podcast_id
]['devices'].append(device
)
99 return subscription_list
.values()