Merge pull request #68 from northbaypython/chrisjrn/nicer-login-view

Nicer Login View
This commit is contained in:
Josh Simmons 2017-08-18 10:48:31 -07:00 committed by GitHub
commit 67da09a3dd
5 changed files with 111 additions and 0 deletions

25
pinaxcon/account_hooks.py Normal file
View file

@ -0,0 +1,25 @@
from account import hooks
from django.contrib.auth.models import User
class BetterAccountHookSet(hooks.AccountDefaultHookSet):
def get_user_credentials(self, form, identifier_field):
username = form.cleaned_data[identifier_field]
# Find an actual username so we can authenticate
print username,
if identifier_field == "email":
username = self.get_username_by_email(username)
print username,
return {
"username": username,
"password": form.cleaned_data["password"],
}
def get_username_by_email(self, email):
try:
return User.objects.get(email=email).username
except User.DoesNotExist:
return None

View file

@ -261,6 +261,8 @@ EMAIL_HOST_PASSWORD = os.environ.get("DJANGO_EMAIL_HOST_PASSWORD", "")
EMAIL_USE_TLS = bool(int(os.environ.get("DJANGO_EMAIL_USE_TLS", "0"))) EMAIL_USE_TLS = bool(int(os.environ.get("DJANGO_EMAIL_USE_TLS", "0")))
EMAIL_USE_SSL = bool(int(os.environ.get("DJANGO_EMAIL_USE_SSL", "0"))) EMAIL_USE_SSL = bool(int(os.environ.get("DJANGO_EMAIL_USE_SSL", "0")))
ACCOUNT_LOGIN_URL = "nbpy_login"
LOGIN_URL = "nbpy_login"
# We need to explicitly switch on signups. # We need to explicitly switch on signups.
ACCOUNT_OPEN_SIGNUP = bool(int(os.environ.get("DJANGO_ACCOUNT_OPEN_SIGNUP", "0"))) ACCOUNT_OPEN_SIGNUP = bool(int(os.environ.get("DJANGO_ACCOUNT_OPEN_SIGNUP", "0")))
@ -270,6 +272,7 @@ ACCOUNT_LOGIN_REDIRECT_URL = "home"
ACCOUNT_LOGOUT_REDIRECT_URL = "home" ACCOUNT_LOGOUT_REDIRECT_URL = "home"
ACCOUNT_EMAIL_CONFIRMATION_EXPIRE_DAYS = 2 ACCOUNT_EMAIL_CONFIRMATION_EXPIRE_DAYS = 2
ACCOUNT_USE_AUTH_AUTHENTICATE = True ACCOUNT_USE_AUTH_AUTHENTICATE = True
ACCOUNT_HOOKSET = "pinaxcon.account_hooks.BetterAccountHookSet"
AUTHENTICATION_BACKENDS = [ AUTHENTICATION_BACKENDS = [
"symposion.teams.backends.TeamPermissionsBackend", "symposion.teams.backends.TeamPermissionsBackend",

View file

@ -0,0 +1,59 @@
{% extends "page_with_title_and_lede.html" %}
{% load bootstrap %}
{% load i18n %}
{% block head_title %}Log In{% endblock %}
{% block heading %}Log In or Sign Up{% endblock %}
{% block body_class %}login{% endblock %}
{% block content %}
<div class="container">
<div class="row">
<div class="col-md-4">
<form action="{% url 'account_login' %}" method="POST">
<div class="panel panel-primary">
<div class="panel-heading">
<h3 class="panel-title">
Log into an existing account
</h3>
</div>
<div class="panel-body">
{% csrf_token %}
{{ login_form|bootstrap }}
</div>
<div class="panel-footer">
<button role="submit" class="btn btn-primary">Log In</button>
</div>
</div>
</form>
</div>
{% if signup_open %}
<div class="col-md-4">
<form action="{% url 'account_signup' %}" method="POST">
<div class="panel panel-default">
<div class="panel-heading">
<h3 class="panel-title">
Sign up for a new account
</h3>
</div>
<div class="panel-body">
{% csrf_token %}
{{ signup_form|bootstrap }}
</div>
<div class="panel-footer">
<button role="submit" class="btn btn-primary">Sign Up</button>
</div>
</div>
</form>
</div>
{% endif %}
</div>
</div>
{% endblock %}

View file

@ -52,6 +52,9 @@ urlpatterns = [
url(r"^admin/", include(admin.site.urls)), url(r"^admin/", include(admin.site.urls)),
url(r"^login$", views.account_login, name="nbpy_login"),
# Override the default account_login view with one that takes email addys
url(r"^account/login/$", views.EmailLoginView.as_view(), name="account_login"),
url(r"^account/", include("account.urls")), url(r"^account/", include("account.urls")),
url(r"^dashboard/", symposion.views.dashboard, name="dashboard"), url(r"^dashboard/", symposion.views.dashboard, name="dashboard"),

View file

@ -1,9 +1,30 @@
from django.conf import settings
from django.http import HttpResponseServerError from django.http import HttpResponseServerError
from django.shortcuts import render
from django.template import RequestContext from django.template import RequestContext
from django.template import Template from django.template import Template
from django.template.loader import get_template from django.template.loader import get_template
from django.views import defaults from django.views import defaults
from account.forms import LoginEmailForm, LoginUsernameForm, SignupForm
from account.views import LoginView
def server_error(request, template_name=defaults.ERROR_500_TEMPLATE_NAME): def server_error(request, template_name=defaults.ERROR_500_TEMPLATE_NAME):
t = Template("{%% include '%s' %%}" % template_name) t = Template("{%% include '%s' %%}" % template_name)
return HttpResponseServerError(t.render(RequestContext(request))) return HttpResponseServerError(t.render(RequestContext(request)))
def account_login(request):
d = {
"login_form": LoginEmailForm(),
"signup_form": SignupForm(),
"signup_open": getattr(settings, "ACCOUNT_OPEN_SIGNUP", True),
}
print d["signup_open"], settings.ACCOUNT_OPEN_SIGNUP
return render(request, "account_login.html", d)
class EmailLoginView(LoginView):
form_class = LoginEmailForm