Encode strings before hashing
[mygpo.git] / mygpo / podcastlists / views.py
blobc2766371183aa3e09cab85a8b24e72391f36b841
1 import uuid
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
24 import logging
25 logger = logging.getLogger(__name__)
28 def list_decorator(must_own=False):
29 def _tmp(f):
30 @wraps(f)
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)
43 return _decorator
45 return _tmp
48 @list_decorator(must_own=False)
49 def search(request, plist, owner):
50 return directory_search(request, 'list_search.html',
51 {'listname': plist.slug})
54 @login_required
55 def lists_own(request):
57 lists = PodcastList.objects.filter(user=request.user)
59 return render(request, 'lists.html', {
60 'lists': lists
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', {
71 'lists': lists,
72 'user': user,
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', {
90 'podcastlist': plist,
91 'max_subscribers': max_subscribers,
92 'owner': owner,
93 'flattr_autosubmit': flattr_autosubmit,
94 'domain': site.domain,
95 'is_own': is_own,
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)
105 @login_required
106 def create_list(request):
107 title = request.POST.get('title', None)
109 if not title:
110 messages.error(request, _('You have to specify a title.'))
111 return HttpResponseRedirect(reverse('lists-overview'))
113 slug = slugify(title)
115 if not slug:
116 messages.error(request, _('"{title}" is not a valid title').format(
117 title=title))
118 return HttpResponseRedirect(reverse('lists-overview'))
120 plist, created = PodcastList.objects.get_or_create(
121 user=request.user,
122 slug=slug,
123 defaults={
124 'id': uuid.uuid1(),
125 'title': title,
129 list_url = reverse('list-show', args=[request.user.username, slug])
130 return HttpResponseRedirect(list_url)
133 @login_required
134 @list_decorator(must_own=True)
135 def add_podcast(request, plist, owner, podcast_id):
137 try:
138 obj = Podcast.objects.all().get_by_any_id(podcast_id)
139 except Podcast.DoesNotExist:
140 try:
141 obj = PodcastGroup.objects.get(id=podcast_id)
142 except PodcastList.DoesNotExist:
143 raise Http404
145 plist.add_entry(obj)
146 list_url = reverse('list-show', args=[owner.username, plist.slug])
147 return HttpResponseRedirect(list_url)
150 @login_required
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)
158 @login_required
159 @list_decorator(must_own=True)
160 def delete_list(request, plist, owner):
161 plist.delete()
162 return HttpResponseRedirect(reverse('lists-overview'))
165 @login_required
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(
171 user=request.user,
172 content_type=ContentType.objects.get_for_model(plist),
173 object_id=plist.id,
175 messages.success(request, _('Thanks for rating!'))
177 list_url = reverse('list-show', args=[owner.username, plist.slug])
178 return HttpResponseRedirect(list_url)