simplify some @repeat_on_conflict decorated methods
[mygpo.git] / mygpo / web / views / users.py
blob562cec4a5c5cef0e69854ef367c5d72630efa39c
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 import string
19 import random
21 from django.shortcuts import render
22 from django.http import HttpResponseRedirect
23 from django.contrib.auth import authenticate
24 from django.contrib import messages
25 from django.contrib.sites.models import RequestSite
26 from django.conf import settings
27 from django.utils.translation import ugettext as _
28 from django.views.decorators.cache import never_cache
30 from mygpo.decorators import allowed_methods, repeat_on_conflict
31 from mygpo.web.forms import RestorePasswordForm
32 from mygpo.users.models import User
33 from mygpo.web.forms import ResendActivationForm
34 from mygpo.constants import DEFAULT_LOGIN_REDIRECT
37 @repeat_on_conflict(['user'])
38 def login(request, user):
39 from django.contrib.auth import login
40 login(request, user)
43 @never_cache
44 def login_user(request):
45 # Do not show login page for already-logged-in users
46 if request.user.is_authenticated():
47 return HttpResponseRedirect(DEFAULT_LOGIN_REDIRECT)
49 if 'user' not in request.POST or 'pwd' not in request.POST:
51 return render(request, 'login.html', {
52 'url': RequestSite(request),
53 'next': request.GET.get('next', ''),
56 username = request.POST['user']
57 password = request.POST['pwd']
58 user = authenticate(username=username, password=password)
60 if user is None:
62 messages.error(request, _('Wrong username or password.'))
64 return render(request, 'login.html', {
65 'next': request.POST.get('next', ''),
68 if not user.is_active:
70 if user.deleted:
72 messages.error(request, _('You have deleted your account, '
73 'but you can register again'))
75 return render(request, 'login.html')
77 else:
79 messages.error(request, _('Please activate your account first.'))
81 return render(request, 'login.html', {
82 'activation_needed': True,
85 login(request, user)
87 if 'next' in request.POST and request.POST['next'] and request.POST['next'] != '/login/':
88 return HttpResponseRedirect(request.POST['next'])
90 return HttpResponseRedirect(DEFAULT_LOGIN_REDIRECT)
93 def get_user(username, email, is_active=None):
94 if username:
95 return User.get_user(username, is_active=None)
97 elif email:
98 return User.get_user_by_email(email, is_active=None)
100 return None
103 @never_cache
104 def restore_password(request):
106 if request.method == 'GET':
107 form = RestorePasswordForm()
108 return render(request, 'restore_password.html', {
109 'form': form,
113 form = RestorePasswordForm(request.POST)
114 if not form.is_valid():
115 return HttpResponseRedirect('/login/')
117 user = get_user(form.cleaned_data['username'], form.cleaned_data['email'], is_active=None)
119 if not user:
120 messages.error(request, _('User does not exist.'))
122 return render(request, 'password_reset_failed.html')
124 site = RequestSite(request)
125 pwd = "".join(random.sample(string.letters+string.digits, 8))
126 subject = _('Reset password for your account on %s') % site
127 message = _('Here is your new password for your account %(username)s on %(site)s: %(password)s') % {'username': user.username, 'site': site, 'password': pwd}
128 user.email_user(subject, message, settings.DEFAULT_FROM_EMAIL)
129 _set_password(user, pwd)
130 return render(request, 'password_reset.html')
133 @repeat_on_conflict(['user'])
134 def _set_password(user, password):
135 user.set_password(password)
136 user.save()
139 @repeat_on_conflict(['user'])
140 def _set_active(user, is_active=True):
141 user.is_active = is_active
142 user.save()
145 @never_cache
146 @allowed_methods(['GET', 'POST'])
147 def resend_activation(request):
149 if request.method == 'GET':
150 form = ResendActivationForm()
151 return render(request, 'registration/resend_activation.html', {
152 'form': form,
155 site = RequestSite(request)
156 form = ResendActivationForm(request.POST)
158 try:
159 if not form.is_valid():
160 raise ValueError(_('Invalid Username entered'))
162 user = get_user(form.cleaned_data['username'], form.cleaned_data['email'], is_active=None)
163 if not user:
164 raise ValueError(_('User does not exist.'))
166 if user.deleted:
167 raise ValueError(_('You have deleted your account, but you can regster again.'))
169 if user.activation_key == None:
170 _set_active(user=user, is_active=True)
171 raise ValueError(_('Your account already has been activated. Go ahead and log in.'))
173 elif user.activation_key_expired():
174 raise ValueError(_('Your activation key has expired. Please try another username, or retry with the same one tomorrow.'))
176 except ValueError, e:
177 messages.error(request, str(e))
179 return render(request, 'registration/resend_activation.html', {
180 'form': form,
184 try:
185 user.send_activation_email(site)
187 except AttributeError:
188 user.send_activation_email(site)
190 return render(request, 'registration/resent_activation.html')