Registering almost works right :)
authorChristopher Allan Webber <cwebber@dustycloud.org>
Sun, 3 Apr 2011 18:35:18 +0000 (13:35 -0500)
committerChristopher Allan Webber <cwebber@dustycloud.org>
Sun, 3 Apr 2011 18:35:18 +0000 (13:35 -0500)
mediagoblin/auth/forms.py [new file with mode: 0644]
mediagoblin/auth/routing.py [new file with mode: 0644]
mediagoblin/auth/views.py [new file with mode: 0644]
mediagoblin/models.py
mediagoblin/routing.py

diff --git a/mediagoblin/auth/forms.py b/mediagoblin/auth/forms.py
new file mode 100644 (file)
index 0000000..ce78600
--- /dev/null
@@ -0,0 +1,37 @@
+# GNU Mediagoblin -- federated, autonomous media hosting
+# Copyright (C) 2011 Free Software Foundation, Inc
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+import wtforms
+
+
+class RegistrationForm(wtforms.Form):
+    username = wtforms.TextField(
+        'Username',
+        [wtforms.validators.Required(),
+         wtforms.validators.Length(min=3, max=30),
+         wtforms.validators.Regexp(r'^\w+$')])
+    password = wtforms.TextField(
+        'Password',
+        [wtforms.validators.Required(),
+         wtforms.validators.Length(min=8, max=30),
+         wtforms.validators.EqualTo('confirm_password')])
+    confirm_password = wtforms.TextField(
+        'Confirm password',
+        [wtforms.validators.Required()])
+    email = wtforms.TextField(
+        'Email address',
+        [wtforms.validators.Required(),
+         wtforms.validators.Email()])
diff --git a/mediagoblin/auth/routing.py b/mediagoblin/auth/routing.py
new file mode 100644 (file)
index 0000000..5b604fd
--- /dev/null
@@ -0,0 +1,11 @@
+from routes.route import Route
+
+auth_routes = [
+    Route('mediagoblin.auth.register', '/register/',
+          controller='mediagoblin.auth.views:register'),
+    Route('mediagoblin.auth.register_success', '/register/success/',
+          controller='mediagoblin.auth.views:register_success'),
+    Route('mediagoblin.auth.login', '/login/',
+          controller='mediagoblin.auth.views:login'),
+    Route('mediagoblin.auth.logout', '/logout/',
+          controller='mediagoblin.auth.views:logout')]
diff --git a/mediagoblin/auth/views.py b/mediagoblin/auth/views.py
new file mode 100644 (file)
index 0000000..d970679
--- /dev/null
@@ -0,0 +1,72 @@
+# GNU Mediagoblin -- federated, autonomous media hosting
+# Copyright (C) 2011 Free Software Foundation, Inc
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+
+from webob import Response, exc
+
+from mediagoblin.auth import lib as auth_lib
+from mediagoblin.auth import forms as auth_forms
+
+
+def register(request):
+    """
+    Your classic registration view!
+    """
+    register_form = auth_forms.RegistrationForm(request.POST)
+
+    if request.method == 'POST' and register_form.validate():
+        # TODO: Make sure the user doesn't exist already
+        users_with_username = \
+            request.db.User.find({'username': request.POST['username']}).count()
+
+        if users_with_username:
+            register_form.username.errors.append(
+                u'Sorry, a user with that name already exists.')
+
+        else:
+            # Create the user
+            entry = request.db.User()
+            entry['username'] = request.POST['username']
+            entry['email'] = request.POST['email']
+            entry['pw_hash'] = auth_lib.bcrypt_gen_password_hash(
+                request.POST['password'])
+            entry.save(validate=True)
+
+            # TODO: Send email authentication request
+
+            # Redirect to register_success
+            return exc.HTTPTemporaryRedirect(
+                location=request.urlgen("mediagoblin.auth.register_success"))
+
+    # render
+    template = request.template_env.get_template(
+        'mediagoblin/auth/register.html')
+    return Response(
+        template.render(
+            {'request': request,
+             'register_form': register_form}))
+
+
+def register_success(request):
+    template = request.template_env.get_template(
+        'mediagoblin/auth/register_success.html')
+    return Response(
+        template.render(
+            {'request': request}))
+
+
+def login():
+    pass
index 31ddf13c948b36e2d0b9c4bcf2ee35618bc4ae2b..b1d63181999cdb21cf98aa4ec40800ca1267513e 100644 (file)
@@ -48,15 +48,18 @@ class User(Document):
 
     structure = {
         'username': unicode,
+        'email': unicode,
         'created': datetime.datetime,
         'plugin_data': dict, # plugins can dump stuff here.
         'pw_hash': unicode,
+        'email_verified': bool,
         }
 
-    required_fields = ['username', 'created', 'pw_hash']
+    required_fields = ['username', 'created', 'pw_hash', 'email']
 
     default_values = {
-        'created': datetime.datetime.utcnow}
+        'created': datetime.datetime.utcnow,
+        'email_verified': False}
 
 
 REGISTER_MODELS = [MediaEntry, User]
index c60f121c369485576766f84526dc057d85721f8c..f5b67f38fe681a47cf9ea2bc3b1951f451b4952f 100644 (file)
@@ -16,6 +16,9 @@
 
 from routes import Mapper
 
+from mediagoblin.auth.routing import auth_routes
+
+
 def get_mapper():
     mapping = Mapper()
     mapping.minimization = False
@@ -27,4 +30,8 @@ def get_mapper():
         "test_submit", "/test_submit/",
         controller="mediagoblin.views:submit_test")
 
+    mapping.extend(auth_routes, '/auth')
+
     return mapping
+
+