Added real registration that prompts for a username.
authorEevee <git@veekun.com>
Mon, 5 Oct 2009 03:56:42 +0000 (20:56 -0700)
committerEevee <git@veekun.com>
Mon, 5 Oct 2009 03:56:42 +0000 (20:56 -0700)
floof/config/routing.py
floof/controllers/account.py
floof/public/layout.css
floof/templates/account/register.mako [new file with mode: 0644]

index 03edbeb..ff850b8 100644 (file)
@@ -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')
 
index 6c36310..0c53a6d 100644 (file)
@@ -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('/')
index 0f65486..f6e671f 100644 (file)
@@ -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 (file)
index 0000000..485012c
--- /dev/null
@@ -0,0 +1,12 @@
+<%inherit file="/base.mako" />
+
+<p>Registering from <strong>${c.identity_url}</strong>.</p>
+
+${h.form(url.current(action='register_finish'), method='POST')}
+<dl class="form">
+    <dt>Username</dt>
+    <dd>${h.text('username', value=c.username)}</dd>
+
+    <dd>${h.submit(None, 'Register')}</dd>
+</dl>
+${h.end_form()}