mention username when resetting password
[mygpo.git] / mygpo / web / users.py
blob98b83dfa058c58bc0190c97741ca14f7a3aeb81a
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 authenticate, login, logout
21 from django.contrib.auth.models import User
22 from django.contrib.auth.decorators import login_required
23 from django.template.defaultfilters import slugify
24 from django.template import RequestContext
25 from registration.forms import RegistrationForm
26 from registration.views import activate, register
27 from registration.models import RegistrationProfile
28 from mygpo.api.models import UserProfile
29 from mygpo.web.forms import RestorePasswordForm
30 from django.contrib.sites.models import Site
31 from django.conf import settings
32 from django.utils.translation import ugettext as _
33 import string
34 import random
36 from mygpo.constants import DEFAULT_LOGIN_REDIRECT
38 def login_user(request):
39 # Do not show login page for already-logged-in users
40 if request.user.is_authenticated():
41 return HttpResponseRedirect(DEFAULT_LOGIN_REDIRECT)
43 if 'user' not in request.POST or 'pwd' not in request.POST:
44 if request.GET.get('restore_password', False):
45 form = RestorePasswordForm()
46 else:
47 form = None
49 return render_to_response('login.html', {
50 'url': Site.objects.get_current(),
51 'next': request.GET.get('next', ''),
52 'restore_password_form': form,
53 }, context_instance=RequestContext(request))
55 username = request.POST['user']
56 password = request.POST['pwd']
57 user = authenticate(username=username, password=password)
59 if user is None:
60 return render_to_response('login.html', {
61 'error_message': _('Wrong username or password.'),
62 'next': request.POST.get('next', ''),
63 }, context_instance=RequestContext(request))
65 if not user.is_active:
67 p, c = UserProfile.objects.get_or_create(user=user)
69 if p.deleted:
70 return render_to_response('login.html', {
71 'error_message': _('You have deleted your account, but you can register again')
72 }, context_instance=RequestContext(request))
74 else:
75 return render_to_response('login.html', {
76 'error_message': _('Please activate your account first.'),
77 'activation_needed': True,
78 }, context_instance=RequestContext(request))
80 login(request, user)
81 current_site = Site.objects.get_current()
83 try:
84 if user.get_profile().generated_id:
85 return render_to_response('migrate.html', {
86 'url': current_site,
87 'username': user
88 }, context_instance=RequestContext(request))
90 except UserProfile.DoesNotExist:
91 profile, c = UserProfile.objects.get_or_create(user=user)
93 if 'next' in request.POST and request.POST['next'] and request.POST['next'] != '/login/':
94 return HttpResponseRedirect(request.POST['next'])
96 return HttpResponseRedirect(DEFAULT_LOGIN_REDIRECT)
98 @login_required
99 def migrate_user(request):
100 user = request.user
101 username = request.POST.get('username', user.username)
103 if username == '':
104 username = user.username
106 if user.username != username:
107 current_site = Site.objects.get_current()
108 if User.objects.filter(username__exact=username).count() > 0:
109 return render_to_response('migrate.html', {
110 'error_message': '%s is already taken' % username,
111 'url': current_site,
112 'username': user.username
113 }, context_instance=RequestContext(request))
115 if slugify(username) != username.lower():
116 return render_to_response('migrate.html', {
117 'error_message': '%s is not a valid username. Please use characters, numbers, underscore and dash only.' % username,
118 'url': current_site,
119 'username': user.username
120 }, context_instance=RequestContext(request))
122 else:
123 user.username = username
124 user.save()
126 user.get_profile().generated_id = 0
127 user.get_profile().save()
129 return HttpResponseRedirect('/')
131 def get_user(username, email):
132 if username:
133 return User.objects.get(username=username)
134 elif email:
135 return User.objects.get(email=email)
136 else:
137 raise User.DoesNotExist('neither username nor email provided')
139 def restore_password(request):
141 if request.method != 'POST':
142 return HttpResponseRedirect('/login/')
144 form = RestorePasswordForm(request.POST)
145 if not form.is_valid():
146 return HttpResponseRedirect('/login/')
148 try:
149 user = get_user(form.cleaned_data['username'], form.cleaned_data['email'])
151 except User.DoesNotExist:
152 error_message = _('User does not exist.')
153 return render_to_response('password_reset_failed.html', {
154 'error_message': error_message
155 }, context_instance=RequestContext(request))
157 site = Site.objects.get_current()
158 pwd = "".join(random.sample(string.letters+string.digits, 8))
159 subject = _('Reset password for your account on %s') % site
160 message = _('Here is your new password for your account %(username)s on %(site)s: %(password)s') % {'username': user.username, 'site': site, 'password': pwd}
161 user.email_user(subject, message, settings.DEFAULT_FROM_EMAIL)
162 user.set_password(pwd)
163 user.save()
164 return render_to_response('password_reset.html', context_instance=RequestContext(request))