Remove unused license preamble
[mygpo.git] / mygpo / users / views / settings.py
blob332b4855b94d3f67e1608687502bfb516a883162
1 from django.shortcuts import render
2 from django.core.urlresolvers import reverse
3 from django.http import HttpResponseRedirect
4 from django.contrib.auth import logout
5 from django.contrib import messages
6 from django.forms import ValidationError
7 from django.utils.translation import ugettext as _
8 from django.contrib.auth.decorators import login_required
9 from django.contrib.contenttypes.models import ContentType
10 from django.contrib.sites.requests import RequestSite
11 from django.views.decorators.vary import vary_on_cookie
12 from django.views.decorators.cache import never_cache, cache_control
13 from django.utils.decorators import method_decorator
14 from django.views.generic.base import View
15 from django.utils.html import strip_tags
17 from mygpo.podcasts.models import Podcast
18 from mygpo.usersettings.models import UserSettings
19 from mygpo.decorators import allowed_methods
20 from mygpo.web.forms import UserAccountForm, ProfileForm, FlattrForm
21 from mygpo.web.utils import normalize_twitter
22 from mygpo.flattr import Flattr
23 from mygpo.users.settings import PUBLIC_SUB_USER, PUBLIC_SUB_PODCAST, \
24 FLATTR_TOKEN, FLATTR_AUTO, FLATTR_MYGPO, FLATTR_USERNAME
27 @login_required
28 @vary_on_cookie
29 @cache_control(private=True)
30 @allowed_methods(['GET', 'POST'])
31 def account(request):
33 if request.method == 'GET':
35 site = RequestSite(request)
36 flattr = Flattr(request.user, site.domain, request.is_secure())
37 userpage_token = request.user.profile.get_token('userpage_token')
39 profile_form = ProfileForm({
40 'twitter': request.user.profile.twitter,
41 'about': request.user.profile.about,
44 form = UserAccountForm({
45 'email': request.user.email,
46 'public': request.user.profile.settings.get_wksetting(PUBLIC_SUB_USER)
49 flattr_form = FlattrForm({
50 'enable': request.user.profile.settings.get_wksetting(FLATTR_AUTO),
51 'token': request.user.profile.settings.get_wksetting(FLATTR_TOKEN),
52 'flattr_mygpo': request.user.profile.settings.get_wksetting(FLATTR_MYGPO),
53 'username': request.user.profile.settings.get_wksetting(FLATTR_USERNAME),
56 return render(request, 'account.html', {
57 'site': site,
58 'form': form,
59 'profile_form': profile_form,
60 'flattr_form': flattr_form,
61 'flattr': flattr,
62 'userpage_token': userpage_token,
65 try:
66 form = UserAccountForm(request.POST)
68 if not form.is_valid():
69 raise ValueError(_('Oops! Something went wrong. Please double-check the data you entered.'))
71 if form.cleaned_data['password_current']:
72 if not request.user.check_password(form.cleaned_data['password_current']):
73 raise ValueError('Current password is incorrect')
75 request.user.set_password(form.cleaned_data['password1'])
77 request.user.email = form.cleaned_data['email']
79 try:
80 request.user.save()
81 except Exception as ex:
82 # TODO: which exception?
83 messages.error(request, str(ex))
85 messages.success(request, 'Account updated')
87 except (ValueError, ValidationError) as e:
88 messages.error(request, str(e))
90 return render(request, 'account.html', {
91 'form': form,
95 class ProfileView(View):
96 """ Updates the public profile and redirects back to the account view """
98 def post(self, request):
99 user = request.user
101 form = ProfileForm(request.POST)
103 if not form.is_valid():
104 raise ValueError(_('Oops! Something went wrong. Please double-check the data you entered.'))
106 request.user.twitter = normalize_twitter(form.cleaned_data['twitter'])
107 request.user.about = strip_tags(form.cleaned_data['about'])
109 request.user.save()
110 messages.success(request, _('Data updated'))
112 return HttpResponseRedirect(reverse('account') + '#profile')
115 class FlattrSettingsView(View):
116 """ Updates Flattr settings and redirects back to the Account page """
118 def post(self, request):
119 user = request.user
121 form = FlattrForm(request.POST)
123 if not form.is_valid():
124 raise ValueError('asdf')
126 auto_flattr = form.cleaned_data.get('enable', False)
127 flattr_mygpo = form.cleaned_data.get('flattr_mygpo', False)
128 username = form.cleaned_data.get('username', '')
130 settings = user.profile.settings
131 settings.set_wksetting(FLATTR_AUTO, auto_flattr)
132 settings.set_wksetting(FLATTR_MYGPO, flattr_mygpo)
133 settings.set_wksetting(FLATTR_USERNAME, username)
134 settings.save()
136 return HttpResponseRedirect(reverse('account') + '#flattr')
139 class FlattrLogout(View):
140 """ Removes Flattr authentication token """
142 def get(self, request):
143 user = request.user
144 settings = user.profile.settings
145 settings.set_wksetting(FLATTR_AUTO, False)
146 settings.set_wksetting(FLATTR_TOKEN, False)
147 settings.set_wksetting(FLATTR_MYGPO, False)
148 settings.save()
149 return HttpResponseRedirect(reverse('account') + '#flattr')
152 class FlattrTokenView(View):
153 """ Callback for the Flattr authentication
155 Updates the user's Flattr token and redirects back to the account page """
157 @method_decorator(login_required)
158 def get(self, request):
160 user = request.user
161 site = RequestSite(request)
162 flattr = Flattr(user, site.domain, request.is_secure())
164 url = request.build_absolute_uri()
165 token = flattr.process_retrieved_code(url)
166 if token:
167 messages.success(request, _('Authentication successful'))
168 settings = user.profile.settings
169 settings.set_wksetting(FLATTR_TOKEN, token)
170 settings.save()
172 else:
173 messages.error(request, _('Authentication failed. Try again later'))
175 return HttpResponseRedirect(reverse('account') + '#flattr')
178 class AccountRemoveGoogle(View):
179 """ Removes the connected Google account """
181 @method_decorator(login_required)
182 def post(self, request):
183 request.user.google_email = None
184 request.user.save()
185 messages.success(request, _('Your account has been disconnected'))
186 return HttpResponseRedirect(reverse('account'))
189 @login_required
190 @never_cache
191 @allowed_methods(['GET', 'POST'])
192 def delete_account(request):
194 if request.method == 'GET':
195 return render(request, 'delete_account.html')
197 user = request.user
198 user.is_active = False
199 user.save()
200 logout(request)
201 return render(request, 'deleted_account.html')
205 class DefaultPrivacySettings(View):
207 public = True
209 @method_decorator(login_required)
210 @method_decorator(never_cache)
211 def post(self, request):
212 settings = request.user.profile.settings
213 settings.set_setting(PUBLIC_SUB_USER.name, self.public)
214 settings.save()
215 return HttpResponseRedirect(reverse('privacy'))
218 class PodcastPrivacySettings(View):
220 public = True
222 @method_decorator(login_required)
223 @method_decorator(never_cache)
224 def post(self, request, podcast_id):
225 podcast = Podcast.objects.get(id=podcast_id)
227 settings, created = UserSettings.objects.get_or_create(
228 user=request.user,
229 content_type=ContentType.objects.get_for_model(podcast),
230 object_id=podcast.pk,
233 settings.set_wksetting(PUBLIC_SUB_PODCAST, self.public)
234 settings.save()
235 return HttpResponseRedirect(reverse('privacy'))
238 @login_required
239 @never_cache
240 def privacy(request):
241 site = RequestSite(request)
242 user = request.user
244 podcasts = Podcast.objects.filter(subscription__user=user)\
245 .distinct('pk')
246 private = UserSettings.objects.get_private_podcasts(user)
248 subscriptions = []
249 for podcast in podcasts:
251 subscriptions.append( (podcast, podcast in private) )
253 return render(request, 'privacy.html', {
254 'private_subscriptions': not request.user.profile.settings.get_wksetting(PUBLIC_SUB_USER),
255 'subscriptions': subscriptions,
256 'domain': site.domain,
260 @vary_on_cookie
261 @cache_control(private=True)
262 @login_required
263 def share(request):
264 site = RequestSite(request)
266 user = request.user
268 if 'public_subscriptions' in request.GET:
269 user.profile.subscriptions_token = ''
270 user.profile.save()
272 elif 'private_subscriptions' in request.GET:
273 user.profile.create_new_token('subscriptions_token')
274 user.profile.save()
276 token = user.profile.get_token('subscriptions_token')
278 return render(request, 'share.html', {
279 'site': site,
280 'token': token,