1 from functools
import wraps
3 from django
.core
.urlresolvers
import reverse
4 from django
.http
import Http404
, HttpResponseRedirect
, HttpResponseForbidden
5 from django
.shortcuts
import render
6 from django
.template
.defaultfilters
import slugify
7 from django
.contrib
.sites
.models
import RequestSite
8 from django
.contrib
.auth
.decorators
import login_required
9 from django
.contrib
import messages
10 from django
.utils
.translation
import ugettext
as _
12 from mygpo
.core
.models
import Podcast
13 from mygpo
.core
.proxy
import proxy_object
14 from mygpo
.api
.simple
import format_podcast_list
15 from mygpo
.share
.models
import PodcastList
16 from mygpo
.users
.models
import User
17 from mygpo
.directory
.views
import search
as directory_search
20 def list_decorator(must_own
=False):
23 def _decorator(request
, username
, listname
, *args
, **kwargs
):
25 user
= User
.get_user(username
)
29 if must_own
and request
.user
!= user
:
30 return HttpResponseForbidden()
32 plist
= PodcastList
.for_user_slug(user
._id
, listname
)
37 return f(request
, plist
, user
, *args
, **kwargs
)
45 def search(request
, username
, listname
):
46 return directory_search(request
, 'list_search.html',
47 {'listname': listname
})
51 def lists_own(request
):
53 lists
= PodcastList
.for_user(request
.user
._id
)
55 return render(request
, 'lists.html', {
60 def lists_user(request
, username
):
62 user
= User
.get_user(username
)
66 lists
= PodcastList
.for_user(user
._id
)
68 return render(request
, 'lists_user.html', {
74 @list_decorator(must_own
=False)
75 def list_show(request
, plist
, owner
):
77 is_own
= owner
== request
.user
79 plist
= proxy_object(plist
)
81 podcasts
= list(Podcast
.get_multi(plist
.podcasts
))
82 plist
.podcasts
= podcasts
84 max_subscribers
= max([p
.subscriber_count() for p
in podcasts
] + [0])
86 site
= RequestSite(request
)
88 return render(request
, 'list.html', {
90 'max_subscribers': max_subscribers
,
92 'domain': site
.domain
,
97 @list_decorator(must_own
=False)
98 def list_opml(request
, plist
, owner
):
99 podcasts
= list(Podcast
.get_multi(plist
.podcasts
))
100 return format_podcast_list(podcasts
, 'opml', plist
.title
)
104 def create_list(request
):
105 title
= request
.POST
.get('title', None)
108 messages
.error(request
, _('You have to specify a title.'))
109 return HttpResponseRedirect(reverse('lists-overview'))
111 slug
= slugify(title
)
114 messages
.error(request
, _('"{title}" is not a valid title').format(
116 return HttpResponseRedirect(reverse('lists-overview'))
118 plist
= PodcastList
.for_user_slug(request
.user
._id
, slug
)
121 plist
= PodcastList()
124 plist
.user
= request
.user
._id
127 list_url
= reverse('list-show', args
=[request
.user
.username
, slug
])
128 return HttpResponseRedirect(list_url
)
132 @list_decorator(must_own
=True)
133 def add_podcast(request
, plist
, owner
, podcast_id
):
135 plist
.podcasts
.append(podcast_id
)
138 list_url
= reverse('list-show', args
=[owner
.username
, plist
.slug
])
139 return HttpResponseRedirect(list_url
)
143 @list_decorator(must_own
=True)
144 def remove_podcast(request
, plist
, owner
, podcast_id
):
145 plist
.podcasts
.remove(podcast_id
)
148 list_url
= reverse('list-show', args
=[owner
.username
, plist
.slug
])
149 return HttpResponseRedirect(list_url
)
153 @list_decorator(must_own
=True)
154 def delete_list(request
, plist
, owner
):
156 return HttpResponseRedirect(reverse('lists-overview'))
160 @list_decorator(must_own
=False)
161 def rate_list(request
, plist
, owner
):
162 rating_val
= int(request
.GET
.get('rate', None))
164 plist
.rate(rating_val
, request
.user
._id
)
167 messages
.success(request
, _('Thanks for rating!'))
169 list_url
= reverse('list-show', args
=[owner
.username
, plist
.slug
])
170 return HttpResponseRedirect(list_url
)