2 from functools
import wraps
3 from datetime
import datetime
5 from django
.core
.urlresolvers
import reverse
6 from django
.http
import Http404
, HttpResponseRedirect
, HttpResponseForbidden
7 from django
.shortcuts
import render
, get_object_or_404
8 from django
.utils
.text
import slugify
9 from django
.contrib
.sites
.models
import RequestSite
10 from django
.contrib
.auth
.decorators
import login_required
11 from django
.contrib
.auth
import get_user_model
12 from django
.contrib
import messages
13 from django
.contrib
.contenttypes
.models
import ContentType
14 from django
.utils
.translation
import ugettext
as _
15 from django
.views
.generic
.base
import View
17 from mygpo
.podcasts
.models
import Podcast
, PodcastGroup
18 from mygpo
.podcastlists
.models
import PodcastList
, PodcastListEntry
19 from mygpo
.api
.simple
import format_podcast_list
20 from mygpo
.votes
.models
import Vote
21 from mygpo
.directory
.views
import search
as directory_search
22 from mygpo
.flattr
import Flattr
25 logger
= logging
.getLogger(__name__
)
28 def list_decorator(must_own
=False):
31 def _decorator(request
, username
, slug
, *args
, **kwargs
):
33 User
= get_user_model()
34 user
= get_object_or_404(User
, username
=username
)
36 if must_own
and request
.user
!= user
:
37 return HttpResponseForbidden()
39 plist
= get_object_or_404(PodcastList
, user
=user
, slug
=slug
)
41 return f(request
, plist
, user
, *args
, **kwargs
)
48 @list_decorator(must_own
=False)
49 def search(request
, plist
, owner
):
50 return directory_search(request
, 'list_search.html',
51 {'listname': plist
.slug
})
55 def lists_own(request
):
57 lists
= PodcastList
.objects
.filter(user
=request
.user
)
59 return render(request
, 'lists.html', {
64 def lists_user(request
, username
):
66 User
= get_user_model()
67 user
= get_object_or_404(User
, username
=username
)
68 lists
= PodcastList
.objects
.filter(user
=user
)
70 return render(request
, 'lists_user.html', {
76 @list_decorator(must_own
=False)
77 def list_show(request
, plist
, owner
):
79 is_own
= owner
== request
.user
80 site
= RequestSite(request
)
82 objs
= [entry
.content_object
for entry
in plist
.entries
.all()]
83 max_subscribers
= max([p
.subscriber_count() for p
in objs
] + [0])
85 thing
= plist
.get_flattr_thing(site
.domain
, owner
.username
)
86 flattr
= Flattr(owner
, site
.domain
, request
.is_secure())
87 flattr_autosubmit
= flattr
.get_autosubmit_url(thing
)
89 return render(request
, 'list.html', {
91 'max_subscribers': max_subscribers
,
93 'flattr_autosubmit': flattr_autosubmit
,
94 'domain': site
.domain
,
99 @list_decorator(must_own
=False)
100 def list_opml(request
, plist
, owner
):
101 podcasts
= [entry
.content_object
for entry
in plist
.entries
.all()]
102 return format_podcast_list(podcasts
, 'opml', plist
.title
)
106 def create_list(request
):
107 title
= request
.POST
.get('title', None)
110 messages
.error(request
, _('You have to specify a title.'))
111 return HttpResponseRedirect(reverse('lists-overview'))
113 slug
= slugify(title
)
116 messages
.error(request
, _('"{title}" is not a valid title').format(
118 return HttpResponseRedirect(reverse('lists-overview'))
120 plist
, created
= PodcastList
.objects
.get_or_create(
129 list_url
= reverse('list-show', args
=[request
.user
.username
, slug
])
130 return HttpResponseRedirect(list_url
)
134 @list_decorator(must_own
=True)
135 def add_podcast(request
, plist
, owner
, podcast_id
):
138 obj
= Podcast
.objects
.all().get_by_any_id(podcast_id
)
139 except Podcast
.DoesNotExist
:
141 obj
= PodcastGroup
.objects
.get(id=podcast_id
)
142 except PodcastList
.DoesNotExist
:
146 list_url
= reverse('list-show', args
=[owner
.username
, plist
.slug
])
147 return HttpResponseRedirect(list_url
)
151 @list_decorator(must_own
=True)
152 def remove_podcast(request
, plist
, owner
, order
):
153 PodcastListEntry
.objects
.filter(podcastlist
=plist
, order
=order
).delete()
154 list_url
= reverse('list-show', args
=[owner
.username
, plist
.slug
])
155 return HttpResponseRedirect(list_url
)
159 @list_decorator(must_own
=True)
160 def delete_list(request
, plist
, owner
):
162 return HttpResponseRedirect(reverse('lists-overview'))
166 @list_decorator(must_own
=False)
167 def rate_list(request
, plist
, owner
):
168 now
= datetime
.utcnow()
170 vote
, created
= Vote
.objects
.get_or_create(
172 content_type
=ContentType
.objects
.get_for_model(plist
),
175 messages
.success(request
, _('Thanks for rating!'))
177 list_url
= reverse('list-show', args
=[owner
.username
, plist
.slug
])
178 return HttpResponseRedirect(list_url
)