regluit/email_change/views.py

140 lines
5.0 KiB
Python

# -*- coding: utf-8 -*-
#
# This file is part of django-email-change.
#
# django-email-change adds support for email address change and confirmation.
#
# Development Web Site:
# - http://www.codetrax.org/projects/django-email-change
# Public Source Code Repository:
# - https://source.codetrax.org/hgroot/django-email-change
#
# Copyright 2010 George Notaras <gnot [at] g-loaded.eu>
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
from django.contrib.auth.decorators import login_required
from django.shortcuts import render_to_response, redirect
from django.db.models.loading import cache
from django.template import RequestContext, Context
from django.template.loader import render_to_string
from django.core.mail import send_mail
from email_change.forms import EmailChangeForm
from email_change.utils import generate_key
@login_required
def email_change_view(request, extra_context={},
success_url='email_verification_sent',
template_name='email_change/email_change_form.html',
email_message_template_name='email_change/emails/verification_email_message.html',
email_subject_template_name='email_change/emails/verification_email_subject.html'):
"""Allow a user to change the email address associated with the user account.
"""
if request.method == 'POST':
form = EmailChangeForm(username=request.user.username, data=request.POST, files=request.FILES)
if form.is_valid():
EmailChangeRequest = cache.get_model('email_change', 'EmailChangeRequest')
Site = cache.get_model('sites', 'Site')
email = form.cleaned_data.get('email')
verification_key = generate_key(request.user, email)
current_site = Site.objects.get_current()
site_name = current_site.name
domain = current_site.domain
protocol = 'http'
if request.is_secure():
protocol = 'https'
# First clean all email change requests made by this user
qs = EmailChangeRequest.objects.filter(user=request.user)
qs.delete()
# Create an email change request
EmailChangeRequest.objects.create(
user = request.user,
verification_key = verification_key,
email = email
)
old_email=request.user.email
# Prepare context
c = {
'email': email,
'site_domain': domain,
'site_name': site_name,
'user': request.user,
'verification_key': verification_key,
'protocol': protocol,
}
c.update(extra_context)
context = Context(c)
# Send success email
subject = render_to_string(email_subject_template_name, context_instance=context)
message = render_to_string(email_message_template_name, context_instance=context)
send_mail(subject, message, None, [email, old_email])
# Redirect
return redirect(success_url)
else:
form = EmailChangeForm(username=request.user.username)
context = RequestContext(request, extra_context)
context['form'] = form
return render_to_response(template_name, context_instance=context)
@login_required
def email_verify_view(request, verification_key, extra_context={},
success_url='email_change_complete',
template_name='email_change/email_verify.html'):
"""
"""
EmailChangeRequest = cache.get_model('email_change', 'EmailChangeRequest')
context = RequestContext(request, extra_context)
try:
ecr = EmailChangeRequest.objects.get(
user=request.user, verification_key=verification_key)
except EmailChangeRequest.DoesNotExist:
# Return failure response
return render_to_response(template_name, context_instance=context)
else:
# Check if the email change request has expired
if ecr.has_expired():
ecr.delete()
# Return failure response
return render_to_response(template_name, context_instance=context)
# Success. Replace the user's email with the new email
request.user.email = ecr.email
request.user.save()
# Delete the email change request
ecr.delete()
# Redirect to success URL
return redirect(success_url)