map.connect('/account/login', controller='account', action='login')
map.connect('/account/login_begin', controller='account', action='login_begin', **require_POST)
map.connect('/account/login_finish', controller='account', action='login_finish')
+ map.connect('/account/register', controller='account', action='register')
+ map.connect('/account/register_finish', controller='account', action='register_finish', **require_POST)
map.connect('/search', controller='search', action='index')
from openid.store.filestore import FileOpenIDStore
from sqlalchemy.orm.exc import NoResultFound
-from pylons import request, response, session, tmpl_context as c
+from pylons import request, response, session, tmpl_context as c, url
from pylons.controllers.util import abort, redirect_to
from routes import url_for, request_config
q = User.query.filter(User.identity_urls.any(url=res.identity_url))
user = q.one()
except NoResultFound:
+ # Unrecognized URL. Redirect to a registration page to ask for a
+ # nickname, etc.
+ session['register:identity_url'] = res.identity_url
+
# Try to pull a name out of the SReg response
sreg_res = SRegResponse.fromSuccessResponse(res)
- try:
- username = unicode(sreg_res['nickname'])
- except:
- username = u'Anonymous'
+ if sreg_res and 'nickname' in sreg_res:
+ session['register:nickname'] = sreg_res['nickname']
- # Create db records
- user = User(name=username)
- identity_url = IdentityURL(url=res.identity_url)
- user.identity_urls.append(identity_url)
- elixir.session.commit()
+ session.save()
+ redirect_to(url.current(action='register'))
# Remember who's logged in, and we're good to go
session['user_id'] = user.id
# XXX send me where I came from
redirect_to('/')
+
+ def register(self):
+ """Logging in with an unrecognized identity URL redirects here."""
+
+ c.identity_url = session['register:identity_url']
+ c.nickname = session.get('register:nickname', None)
+
+ return render('/account/register.mako')
+
+ def register_finish(self):
+ """Complete a new-user registration. Create the user and log in."""
+
+ identity_url = session['register:identity_url']
+ username = request.params.get('username', None)
+
+ # XXX how do we return errors in some useful way?
+
+ if not username:
+ return 'Please enter a username.'
+
+ if User.query.filter_by(name=username).count():
+ return 'That username is taken.'
+
+ # Create db records
+ user = User(name=username)
+ user.identity_urls.append(IdentityURL(url=identity_url))
+ elixir.session.commit()
+
+ # Log in
+ session['user_id'] = user.id
+ session.save()
+
+ # XXX how do we do success messages in some useful way?
+ # XXX send me where I came from
+ redirect_to('/')
+/*** Main layout ***/
+body { font-family: sans-serif; font-size: 12px; }
+
#header { padding: 1em; background: #c0c0c0; }
#header #user { text-align: right; }
#footer { padding: 1em; background: #c0c0c0; }
-.full {display:block;}
\ No newline at end of file
+.full {display:block;}
+
+
+
+/*** Common bits and pieces ***/
+/* General form layout */
+dl.form { margin: 1em 0; padding-left: 1em; border-left: 0.5em solid gray; }
+dl.form dt { padding-bottom: 0.25em; font-style: italic; }
+dl.form dd { margin-bottom: 0.5em; }
+
+
+
+/*** Individual page layout ***/