avoid race condition when creating directories
[mygpo.git] / mygpo / share / views.py
blobf8bc248fc8de05f1105eac16fab378e8fbb20e96
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):
21 def _tmp(f):
22 @wraps(f)
23 def _decorator(request, username, listname, *args, **kwargs):
25 user = User.get_user(username)
26 if not user:
27 raise Http404
29 if must_own and request.user != user:
30 return HttpResponseForbidden()
32 plist = PodcastList.for_user_slug(user._id, listname)
34 if plist is None:
35 raise Http404
37 return f(request, plist, user, *args, **kwargs)
39 return _decorator
41 return _tmp
44 @login_required
45 def search(request, username, listname):
46 return directory_search(request, 'list_search.html',
47 {'listname': listname})
50 @login_required
51 def lists_own(request):
53 lists = PodcastList.for_user(request.user._id)
55 return render(request, 'lists.html', {
56 'lists': lists
60 def lists_user(request, username):
62 user = User.get_user(username)
63 if not user:
64 raise Http404
66 lists = PodcastList.for_user(user._id)
68 return render(request, 'lists_user.html', {
69 'lists': lists,
70 'user': user,
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', {
89 'podcastlist': plist,
90 'max_subscribers': max_subscribers,
91 'owner': owner,
92 'domain': site.domain,
93 'is_own': is_own,
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)
103 @login_required
104 def create_list(request):
105 title = request.POST.get('title', None)
107 if not title:
108 messages.error(request, _('You have to specify a title.'))
109 return HttpResponseRedirect(reverse('lists-overview'))
111 slug = slugify(title)
113 if not slug:
114 messages.error(request, _('"{title}" is not a valid title').format(
115 title=title))
116 return HttpResponseRedirect(reverse('lists-overview'))
118 plist = PodcastList.for_user_slug(request.user._id, slug)
120 if plist is None:
121 plist = PodcastList()
122 plist.title = title
123 plist.slug = slug
124 plist.user = request.user._id
125 plist.save()
127 list_url = reverse('list-show', args=[request.user.username, slug])
128 return HttpResponseRedirect(list_url)
131 @login_required
132 @list_decorator(must_own=True)
133 def add_podcast(request, plist, owner, podcast_id):
135 plist.podcasts.append(podcast_id)
136 plist.save()
138 list_url = reverse('list-show', args=[owner.username, plist.slug])
139 return HttpResponseRedirect(list_url)
142 @login_required
143 @list_decorator(must_own=True)
144 def remove_podcast(request, plist, owner, podcast_id):
145 plist.podcasts.remove(podcast_id)
146 plist.save()
148 list_url = reverse('list-show', args=[owner.username, plist.slug])
149 return HttpResponseRedirect(list_url)
152 @login_required
153 @list_decorator(must_own=True)
154 def delete_list(request, plist, owner):
155 plist.delete()
156 return HttpResponseRedirect(reverse('lists-overview'))
159 @login_required
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)
165 plist.save()
167 messages.success(request, _('Thanks for rating!'))
169 list_url = reverse('list-show', args=[owner.username, plist.slug])
170 return HttpResponseRedirect(list_url)