Implemented logout and generally fixed the in/out sequence. #69
[zzz-spline-users.git] / spline / plugins / users / controllers / accounts.py
index 67d62e4..ba2fa26 100644 (file)
@@ -4,12 +4,13 @@ from openid.extensions.sreg import SRegRequest, SRegResponse
 from openid.store.filestore import FileOpenIDStore
 from sqlalchemy.orm.exc import NoResultFound
 
-from pylons import config, request, response, session, tmpl_context as c
+from pylons import config, request, response, session, tmpl_context as c, url
 from pylons.controllers.util import abort, redirect_to
-from routes import url_for, request_config
+from routes import request_config
 
 from spline import model
 from spline.model import meta
+from spline.lib import helpers as h
 from spline.lib.base import BaseController, render
 
 log = logging.getLogger(__name__)
@@ -35,7 +36,7 @@ class AccountsController(BaseController):
 
         host = request.headers['host']
         protocol = request_config().protocol
-        return_url = url_for(host=host, controller='accounts', action='login_finish')
+        return_url = url(host=host, controller='accounts', action='login_finish')
         new_url = auth_request.redirectURL(return_to=return_url,
                                            realm=protocol + '://' + host)
         redirect_to(new_url)
@@ -45,7 +46,7 @@ class AccountsController(BaseController):
 
         cons = Consumer(session=session, store=self.openid_store)
         host = request.headers['host']
-        return_url = url_for(host=host, controller='accounts', action='login_finish')
+        return_url = url(host=host, controller='accounts', action='login_finish')
         res = cons.complete(request.params, return_url)
 
         if res.status != 'success':
@@ -61,7 +62,8 @@ class AccountsController(BaseController):
             sreg_res = SRegResponse.fromSuccessResponse(res)
             try:
                 username = sreg_res['nickname']
-            except KeyError:
+            except (KeyError, TypeError):
+                # KeyError if sreg has no nickname; TypeError if sreg is None
                 username = 'Anonymous'
 
             # Create db records
@@ -75,4 +77,19 @@ class AccountsController(BaseController):
         session['user_id'] = user.id
         session.save()
 
-        return "Hello, %s" % user.name
+        h.flash(u"""Hello, {0}!""".format(user.name),
+                icon='user')
+
+        redirect_to('/', _code=303)
+
+    def logout(self):
+        """Logs the user out."""
+
+        if 'user_id' in session:
+            del session['user_id']
+            session.save()
+
+            h.flash(u"""Logged out.""",
+                    icon='user-silhouette')
+
+        redirect_to('/', _code=303)