From 29dd9f09e93699ac14cd80ea192794ff04cd8f35 Mon Sep 17 00:00:00 2001 From: Eevee Date: Sun, 4 Oct 2009 20:56:42 -0700 Subject: [PATCH] Added real registration that prompts for a username. --- floof/config/routing.py | 2 ++ floof/controllers/account.py | 54 ++++++++++++++++++++++++++++------- floof/public/layout.css | 17 ++++++++++- floof/templates/account/register.mako | 12 ++++++++ 4 files changed, 74 insertions(+), 11 deletions(-) create mode 100644 floof/templates/account/register.mako diff --git a/floof/config/routing.py b/floof/config/routing.py index 03edbeb..ff850b8 100644 --- a/floof/config/routing.py +++ b/floof/config/routing.py @@ -25,6 +25,8 @@ def make_map(): 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') diff --git a/floof/controllers/account.py b/floof/controllers/account.py index 6c36310..0c53a6d 100644 --- a/floof/controllers/account.py +++ b/floof/controllers/account.py @@ -5,7 +5,7 @@ from openid.extensions.sreg import SRegRequest, SRegResponse 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 @@ -53,18 +53,17 @@ class AccountController(BaseController): 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 @@ -72,3 +71,38 @@ class AccountController(BaseController): # 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('/') diff --git a/floof/public/layout.css b/floof/public/layout.css index 0f65486..f6e671f 100644 --- a/floof/public/layout.css +++ b/floof/public/layout.css @@ -1,3 +1,6 @@ +/*** Main layout ***/ +body { font-family: sans-serif; font-size: 12px; } + #header { padding: 1em; background: #c0c0c0; } #header #user { text-align: right; } @@ -5,4 +8,16 @@ #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 ***/ diff --git a/floof/templates/account/register.mako b/floof/templates/account/register.mako new file mode 100644 index 0000000..485012c --- /dev/null +++ b/floof/templates/account/register.mako @@ -0,0 +1,12 @@ +<%inherit file="/base.mako" /> + +

Registering from ${c.identity_url}.

+ +${h.form(url.current(action='register_finish'), method='POST')} +
+
Username
+
${h.text('username', value=c.username)}
+ +
${h.submit(None, 'Register')}
+
+${h.end_form()} -- 2.7.4