simplify creation of SecurityTokens
[mygpo.git] / mygpo / web / views / episode.py
blob224a60462a71752c48309358f4a47b256ce875ca
2 # This file is part of my.gpodder.org.
4 # my.gpodder.org is free software: you can redistribute it and/or modify it
5 # under the terms of the GNU Affero General Public License as published by
6 # the Free Software Foundation, either version 3 of the License, or (at your
7 # option) any later version.
9 # my.gpodder.org is distributed in the hope that it will be useful, but
10 # WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
11 # or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public
12 # License for more details.
14 # You should have received a copy of the GNU Affero General Public License
15 # along with my.gpodder.org. If not, see <http://www.gnu.org/licenses/>.
18 from django.shortcuts import render_to_response
19 from django.http import HttpResponseRedirect
20 from django.template import RequestContext
21 from mygpo.api.models import Podcast, Episode, EpisodeAction, Subscription
22 from mygpo.api.models.episodes import Chapter
23 from mygpo.api.models.users import EpisodeFavorite
24 from mygpo.web.models import SecurityToken
25 from mygpo.web.utils import get_played_parts
26 from mygpo.decorators import manual_gc
27 from mygpo.utils import parse_time
28 from django.contrib.auth.decorators import login_required
29 from django.shortcuts import get_object_or_404
30 from django.contrib.sites.models import Site
32 @manual_gc
33 def episode(request, id):
34 episode = get_object_or_404(Episode, pk=id)
36 if request.user.is_authenticated():
37 history = EpisodeAction.objects.filter(user=request.user, episode=episode).order_by('-timestamp')
38 subscription_tmp = Subscription.objects.filter(podcast=episode.podcast, user=request.user)
39 if subscription_tmp.exists():
40 subscription_meta = subscription_tmp[0].get_meta()
41 else:
42 subscription_meta = None
43 is_fav = EpisodeFavorite.objects.filter(user=request.user, episode=episode).exists()
45 played_parts, duration = get_played_parts(request.user, episode)
47 else:
48 history = []
49 subscription_meta = None
50 is_fav = False
51 played_parts = None
52 duration = episode.duration
54 chapters = [c for c in Chapter.objects.filter(episode=episode).order_by('start') if c.is_public() or c.user == request.user]
56 return render_to_response('episode.html', {
57 'episode': episode,
58 'history': history,
59 'chapters': chapters,
60 'subscription_meta': subscription_meta,
61 'is_favorite': is_fav,
62 'played_parts': played_parts,
63 'duration': duration
64 }, context_instance=RequestContext(request))
67 @manual_gc
68 @login_required
69 def add_chapter(request, id):
70 episode = get_object_or_404(Episode, pk=id)
72 try:
73 start = parse_time(request.POST.get('start', '0'))
75 if request.POST.get('end', '0'):
76 end = parse_time(request.POST.get('end', '0'))
77 else:
78 end = start
80 adv = 'advertisement' in request.POST
81 label = request.POST.get('label')
83 Chapter.objects.create(user=request.user, episode=episode, start=start, end=end, advertisement=adv, label=label)
84 except:
85 pass
87 return HttpResponseRedirect('/episode/%s' % id)
90 @manual_gc
91 @login_required
92 def remove_chapter(request, id, chapter_id):
93 Chapter.objects.filter(user=request.user, id=chapter_id).delete()
95 return HttpResponseRedirect('/episode/%s' % id)
98 @manual_gc
99 @login_required
100 def toggle_favorite(request, id):
101 episode = get_object_or_404(Episode, id=id)
102 fav, c = EpisodeFavorite.objects.get_or_create(user=request.user, episode=episode)
103 if not c:
104 fav.delete()
106 return HttpResponseRedirect('/episode/%s' % id)
109 @manual_gc
110 @login_required
111 def list_favorites(request):
112 site = Site.objects.get_current()
113 episodes = [x.episode for x in EpisodeFavorite.objects.filter(user=request.user).order_by('-created')]
115 token, c = SecurityToken.objects.get_or_create(user=request.user, object='fav-feed', action='r')
117 from django.core.urlresolvers import reverse
118 feed_url = 'http://%s/%s' % (site.domain, reverse('favorites-feed', args=[request.user.username]))
120 try:
121 podcast = Podcast.objects.get(url=feed_url)
122 except Podcast.DoesNotExist:
123 podcast = None
125 if 'public_feed' in request.GET:
126 token.token = ''
127 token.save()
129 elif 'private_feed' in request.GET:
130 token.random_token(length=8)
131 token.save()
134 return render_to_response('favorites.html', {
135 'episodes': episodes,
136 'feed_token': token,
137 'site': site,
138 'podcast': podcast,
139 }, context_instance=RequestContext(request))