add settings to advanced API (bug 1082)
[mygpo.git] / mygpo / web / views / settings.py
blob454c672d65d898074cfce107ebda711a15946460
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.contrib.auth import logout
21 from django.template import RequestContext
22 from mygpo.api.models import Podcast, Subscription, SubscriptionMeta
23 from mygpo.web.models import SecurityToken
24 from mygpo.web.forms import UserAccountForm
25 from django.forms import ValidationError
26 from django.utils.translation import ugettext as _
27 from mygpo.api.basic_auth import require_valid_user
28 from mygpo.decorators import manual_gc
29 from django.contrib.auth.decorators import login_required
30 from django.shortcuts import get_object_or_404
31 from django.contrib.sites.models import Site
34 @manual_gc
35 @login_required
36 def account(request):
37 success = False
38 error_message = ''
40 if request.method == 'GET':
42 form = UserAccountForm({
43 'email': request.user.email,
44 'public': request.user.get_profile().public_profile
47 return render_to_response('account.html', {
48 'form': form,
49 }, context_instance=RequestContext(request))
51 try:
52 form = UserAccountForm(request.POST)
54 if not form.is_valid():
55 raise ValueError(_('Oops! Something went wrong. Please double-check the data you entered.'))
57 if form.cleaned_data['password_current']:
58 if not request.user.check_password(form.cleaned_data['password_current']):
59 raise ValueError('Current password is incorrect')
61 request.user.set_password(form.cleaned_data['password1'])
63 request.user.email = form.cleaned_data['email']
64 request.user.save()
65 request.user.get_profile().save()
67 success = True
69 except ValueError, e:
70 success = False
71 error_message = e
73 except ValidationError, e:
74 success = False
75 error_message = e
77 return render_to_response('account.html', {
78 'form': form,
79 'success': success,
80 'error_message': error_message
81 }, context_instance=RequestContext(request))
84 @manual_gc
85 @login_required
86 def delete_account(request):
88 if request.method == 'GET':
89 return render_to_response('delete_account.html', context_instance=RequestContext(request))
91 profile = request.user.get_profile()
92 profile.deleted = True
93 profile.save()
95 request.user.is_active = False
96 request.user.save()
97 logout(request)
98 return render_to_response('delete_account.html', {
99 'success': True
100 }, context_instance=RequestContext(request))
103 @manual_gc
104 @login_required
105 def privacy(request):
107 if request.method == 'GET':
108 form = UserAccountForm({
109 'email': request.user.email,
110 'public': request.user.get_profile().public_profile
113 if 'private_subscriptions' in request.GET:
114 request.user.get_profile().settings['public_profile'] = False
115 request.user.get_profile().save()
117 elif 'public_subscriptions' in request.GET:
118 request.user.get_profile().settings['public_profile'] = True
119 request.user.get_profile().save()
121 if 'exclude' in request.GET:
122 id = request.GET['exclude']
123 try:
124 podcast = Podcast.objects.get(pk=id)
125 sm, c = SubscriptionMeta.objects.get_or_create(user=request.user, podcast=podcast, defaults={'public': False})
127 if not c:
128 sm.settings['public_subscription'] = False
129 sm.save()
131 except Podcast.DoesNotExist:
132 pass
134 if 'include' in request.GET:
135 id = request.GET['include']
136 try:
137 podcast = Podcast.objects.get(pk=id)
138 sm, c = SubscriptionMeta.objects.get_or_create(user=request.user, podcast=podcast, defaults={'public': True})
140 if not c:
141 sm.settings['public_subscription'] = True
142 sm.save()
144 except Podcast.DoesNotExist:
145 pass
147 subscriptions = [s for s in Subscription.objects.filter(user=request.user)]
148 included_subscriptions = set([s.podcast for s in subscriptions if s.get_meta().public])
149 excluded_subscriptions = set([s.podcast for s in subscriptions if not s.get_meta().public])
151 return render_to_response('privacy.html', {
152 'public_subscriptions': request.user.get_profile().public_profile,
153 'included_subscriptions': included_subscriptions,
154 'excluded_subscriptions': excluded_subscriptions,
155 }, context_instance=RequestContext(request))
158 @manual_gc
159 @login_required
160 def share(request):
161 site = Site.objects.get_current()
162 token, c = SecurityToken.objects.get_or_create(user=request.user, object='subscriptions', action='r')
165 if 'public_subscriptions' in request.GET:
166 token.token = ''
167 token.save()
169 elif 'private_subscriptions' in request.GET:
170 token.random_token()
171 token.save()
173 return render_to_response('share.html', {
174 'site': site,
175 'token': token.token,
176 }, context_instance=RequestContext(request))