[snowy] Make openid error messages more friendly



commit cbfb09f86aeee37ea52f9d79aa19a9ea7d172a98
Author: Leon Handreke <leon handreke gmail com>
Date:   Sat Oct 23 01:42:23 2010 +0200

    Make openid error messages more friendly
    
        - Center error message above login page
        - Display login errors above the login form
        - Better error message when the OpenID endpoint was not found

 accounts/templates/openid/login.html |   18 +++++++-----------
 accounts/urls.py                     |    9 ++++-----
 accounts/views.py                    |   27 +++++++++++++++++++++++++++
 settings.py                          |    3 +++
 4 files changed, 41 insertions(+), 16 deletions(-)
---
diff --git a/accounts/templates/openid/login.html b/accounts/templates/openid/login.html
index 1e05bd8..b21d670 100644
--- a/accounts/templates/openid/login.html
+++ b/accounts/templates/openid/login.html
@@ -18,20 +18,16 @@
 
 {% block content %}
 
+{% if messages %}
+{% for message in messages %}
+<div{% if message.tags %} class="{{ message.tags }} center"{% endif %} style="color: red;">{{ message }}</div>
+<br />
+{% endfor %}
+{% endif %}
+
 <div id="login-leftcolumn">
     <h3>{% trans "Log in with your OpenID" %}</h3>
 
-    {% if form.errors %}
-    <p class="errors">{% trans "Please correct errors below:" %}<br />
-        {% if form.openid_identifier.errors %}
-        <span class="error">{{ form.openid_identifier.errors|join:", " }}</span>
-        {% endif %}
-        {% if form.next.errors %}
-        <span class="error">{{ form.next.errors|join:", " }}</span>
-        {% endif %}
-    </p>
-    {% endif %}
-
     <form name="fopenid" action="{{ action }}" method="post">
         <table>
             <tr>
diff --git a/accounts/urls.py b/accounts/urls.py
index 8d2bd57..281b554 100644
--- a/accounts/urls.py
+++ b/accounts/urls.py
@@ -24,8 +24,7 @@ from django.conf.urls.defaults import *
 from registration.views import activate
 from registration.views import register
 
-from snowy.accounts.views import openid_registration
-
+import snowy.accounts.views
 import django_openid_auth.views
 
 urlpatterns = patterns('',
@@ -37,11 +36,11 @@ urlpatterns = patterns('',
 
     # OpenID URLs
     # names must not be altered because django_openid_auth has to reverse them
-    url(r'^openid/login/$', django_openid_auth.views.login_begin,
+    url(r'^openid/login/$', snowy.accounts.views.openid_begin,
         {'template_name': 'openid/login.html'}, name='openid-login'),
-    url(r'^openid/complete/$', django_openid_auth.views.login_complete,
+    url(r'^openid/complete/$', snowy.accounts.views.openid_complete,
         name='openid-complete'),
-    url(r'^openid/registration/$', openid_registration,
+    url(r'^openid/registration/$', snowy.accounts.views.openid_registration,
         name='openid_registration'),
 
     # Registration URLs
diff --git a/accounts/views.py b/accounts/views.py
index bbe8e4e..f43fd99 100644
--- a/accounts/views.py
+++ b/accounts/views.py
@@ -21,6 +21,8 @@ from django.contrib.auth.forms import UserChangeForm, PasswordChangeForm
 from django.contrib.auth.models import User
 from django.contrib.auth import authenticate, login
 from django.contrib.auth.decorators import login_required
+from django.core.urlresolvers import reverse
+from django.contrib import messages
 
 from django.shortcuts import render_to_response
 from django.http import HttpResponseRedirect, HttpResponseNotAllowed
@@ -31,6 +33,7 @@ from snowy.accounts.models import UserProfile
 from snowy.accounts.forms import InternationalizationForm, OpenIDRegistrationFormUniqueUser, EmailChangeForm
 
 from django_openid_auth import auth
+import django_openid_auth.views
 
 def openid_registration(request, template_name='registration/registration_form.html'):
     registration_form = OpenIDRegistrationFormUniqueUser(request.POST or None)
@@ -79,6 +82,30 @@ def openid_registration(request, template_name='registration/registration_form.h
                               {'form' : registration_form},
                               context_instance=RequestContext(request))
 
+def openid_begin(request, **kwargs):
+    """A wrapper view around the login_begin view in
+    django_openid_auth that features a nicer error display"""
+    return django_openid_auth.views.login_begin(request, render_failure=render_openid_failure,
+                                                   **kwargs)
+
+def openid_complete(request, **kwargs):
+    """A wrapper view around the login_complete view in
+    django_openid_auth that features a nicer error page"""
+    return django_openid_auth.views.login_complete(request, render_failure=render_openid_failure,
+                                                   **kwargs)
+
+def render_openid_failure(request, message, status=403, **kwargs):
+    """A wrapper view around the login page to display an error message above
+    the login form"""
+    # the most common error is a mistyped URL - make the error message less cryptic for this case
+    # TODO: Put this "error message correction" in a better place - maybe django_openid_auth
+    error_message = unicode(message)
+    if error_message.find("OpenID discovery error: Error fetching XRDS document:") > -1:
+        error_message = unicode(_("OpenID endpoint not found. Please check your OpenID."))
+
+    messages.add_message(request, messages.ERROR, _("Error logging in: ") + error_message)
+    return HttpResponseRedirect(reverse('openid-login'))
+
 @login_required
 def accounts_preferences(request, template_name='accounts/preferences.html'):
     user = request.user
diff --git a/settings.py b/settings.py
index 16b7032..84f49c9 100644
--- a/settings.py
+++ b/settings.py
@@ -84,6 +84,7 @@ TEMPLATE_CONTEXT_PROCESSORS = (
     'django.core.context_processors.i18n',
     'django.core.context_processors.media',
     'django.core.context_processors.request',
+    'django.contrib.messages.context_processors.messages',
     'snowy.core.context_processors.current_site',
 )
 
@@ -92,6 +93,7 @@ MIDDLEWARE_CLASSES = [
     'django.contrib.csrf.middleware.CsrfViewMiddleware',
     'django.contrib.csrf.middleware.CsrfResponseMiddleware',
     'django.contrib.sessions.middleware.SessionMiddleware',
+    'django.contrib.messages.middleware.MessageMiddleware',
     'django.middleware.locale.LocaleMiddleware',
     'snowy.accounts.middleware.LocaleMiddleware',
     'django.contrib.auth.middleware.AuthenticationMiddleware',
@@ -132,6 +134,7 @@ INSTALLED_APPS = [
     'django.contrib.sessions',
     'django.contrib.sites',
     'django.contrib.humanize',
+    'django.contrib.messages',
 
     # External apps
     'registration',



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]