Source code for mezzanine.accounts.views

from __future__ import unicode_literals

from django.contrib.auth import (login as auth_login, authenticate,
                                 logout as auth_logout, get_user_model)
from django.contrib.auth.decorators import login_required
from django.contrib.messages import info, error
from django.core.urlresolvers import NoReverseMatch, get_script_prefix, reverse
from django.shortcuts import get_object_or_404, redirect
from django.utils.translation import ugettext_lazy as _

from mezzanine.accounts import get_profile_form
from mezzanine.accounts.forms import LoginForm, PasswordResetForm
from mezzanine.conf import settings
from mezzanine.utils.email import send_verification_mail, send_approve_mail
from mezzanine.utils.urls import login_redirect, next_url
from mezzanine.utils.views import render


User = get_user_model()


[docs]def login(request, template="accounts/account_login.html", extra_context=None): """ Login form. """ form = LoginForm(request.POST or None) if request.method == "POST" and form.is_valid(): authenticated_user = form.save() info(request, _("Successfully logged in")) auth_login(request, authenticated_user) return login_redirect(request) context = {"form": form, "title": _("Log in")} context.update(extra_context or {}) return render(request, template, context)
[docs]def logout(request): """ Log the user out. """ auth_logout(request) info(request, _("Successfully logged out")) return redirect(next_url(request) or get_script_prefix())
[docs]def signup(request, template="accounts/account_signup.html", extra_context=None): """ Signup form. """ profile_form = get_profile_form() form = profile_form(request.POST or None, request.FILES or None) if request.method == "POST" and form.is_valid(): new_user = form.save() if not new_user.is_active: if settings.ACCOUNTS_APPROVAL_REQUIRED: send_approve_mail(request, new_user) info(request, _("Thanks for signing up! You'll receive " "an email when your account is activated.")) else: send_verification_mail(request, new_user, "signup_verify") info(request, _("A verification email has been sent with " "a link for activating your account.")) return redirect(next_url(request) or "/") else: info(request, _("Successfully signed up")) auth_login(request, new_user) return login_redirect(request) context = {"form": form, "title": _("Sign up")} context.update(extra_context or {}) return render(request, template, context)
[docs]def signup_verify(request, uidb36=None, token=None): """ View for the link in the verification email sent to a new user when they create an account and ``ACCOUNTS_VERIFICATION_REQUIRED`` is set to ``True``. Activates the user and logs them in, redirecting to the URL they tried to access when signing up. """ user = authenticate(uidb36=uidb36, token=token, is_active=False) if user is not None: user.is_active = True user.save() auth_login(request, user) info(request, _("Successfully signed up")) return login_redirect(request) else: error(request, _("The link you clicked is no longer valid.")) return redirect("/")
@login_required
[docs]def profile_redirect(request): """ Just gives the URL prefix for profiles an action - redirect to the logged in user's profile. """ return redirect("profile", username=request.user.username)
[docs]def profile(request, username, template="accounts/account_profile.html", extra_context=None): """ Display a profile. """ lookup = {"username__iexact": username, "is_active": True} context = {"profile_user": get_object_or_404(User, **lookup)} context.update(extra_context or {}) return render(request, template, context)
@login_required
[docs]def account_redirect(request): """ Just gives the URL prefix for accounts an action - redirect to the profile update form. """ return redirect("profile_update")
@login_required
[docs]def profile_update(request, template="accounts/account_profile_update.html", extra_context=None): """ Profile update form. """ profile_form = get_profile_form() form = profile_form(request.POST or None, request.FILES or None, instance=request.user) if request.method == "POST" and form.is_valid(): user = form.save() info(request, _("Profile updated")) try: return redirect("profile", username=user.username) except NoReverseMatch: return redirect("profile_update") context = {"form": form, "title": _("Update Profile")} context.update(extra_context or {}) return render(request, template, context)
def password_reset(request, template="accounts/account_password_reset.html", extra_context=None): form = PasswordResetForm(request.POST or None) if request.method == "POST" and form.is_valid(): user = form.save() send_verification_mail(request, user, "password_reset_verify") info(request, _("A verification email has been sent with " "a link for resetting your password.")) context = {"form": form, "title": _("Password Reset")} context.update(extra_context or {}) return render(request, template, context) def password_reset_verify(request, uidb36=None, token=None): user = authenticate(uidb36=uidb36, token=token, is_active=True) if user is not None: auth_login(request, user) return redirect("profile_update") else: error(request, _("The link you clicked is no longer valid.")) return redirect("/")
[docs]def old_account_redirect(request, url_suffix): """ Catches and redirects any unmatched account URLs to their correct version (account/ to accounts/) as per #934. The URL is constructed manually, handling slashes as appropriate. """ if url_suffix is None: correct_url = reverse("account_redirect") else: correct_url = "{account_url}{middle_slash}{suffix}{slash}".format( account_url=reverse("account_redirect"), middle_slash="/" if not settings.APPEND_SLASH else "", suffix=url_suffix, slash="/" if settings.APPEND_SLASH else "") next = next_url(request) if next: correct_url += "?next=%s" % next return redirect(correct_url)