Merge remote branch 'remotes/aleks/aleks'
authorChristopher Allan Webber <cwebber@dustycloud.org>
Wed, 1 Jun 2011 00:17:28 +0000 (19:17 -0500)
committerChristopher Allan Webber <cwebber@dustycloud.org>
Wed, 1 Jun 2011 00:17:28 +0000 (19:17 -0500)
mediagoblin/auth/routing.py
mediagoblin/auth/views.py
mediagoblin/db/models.py
mediagoblin/decorators.py
mediagoblin/templates/mediagoblin/auth/verification_needed.html [new file with mode: 0644]

index 59762840e44c56e908320f3fa57dc0fa5965c576..069e301949ebce4065c9a7186e77efb0d481d955 100644 (file)
@@ -26,4 +26,8 @@ auth_routes = [
     Route('mediagoblin.auth.logout', '/logout/',
           controller='mediagoblin.auth.views:logout'),
     Route('mediagoblin.auth.verify_email', '/verify_email/',
-          controller='mediagoblin.auth.views:verify_email')]
+          controller='mediagoblin.auth.views:verify_email'),
+    Route('mediagoblin.auth.verify_email_notice', '/verification_required/',
+          controller='mediagoblin.auth.views:verify_email_notice'),
+    Route('mediagoblin.auth.resend_verification', '/resend_verification/',
+          controller='mediagoblin.auth.views:resend_activation')]
index 6b5ce88cfdccda7245eac2d68637d203125b144d..22fdd46bbcbaf5b5f69142197051d90db281760b 100644 (file)
@@ -168,3 +168,59 @@ def verify_email(request):
             {'request': request,
              'user': user,
              'verification_successful': verification_successful}))
+
+def verify_email_notice(request):
+    """
+    Verify warning view.
+
+    When the user tries to do some action that requires their account
+    to be verified beforehand, this view is called upon!
+    """
+
+    template = request.template_env.get_template(
+        'mediagoblin/auth/verification_needed.html')
+    return Response(
+        template.render(
+            {'request': request}))
+
+def resend_activation(request):
+    """
+    The reactivation view
+
+    Resend the activation email.
+    """
+
+    request.user.generate_new_verification_key()
+
+    # Copied shamelessly from the register view above.
+
+    email_template = request.template_env.get_template(
+        'mediagoblin/auth/verification_email.txt')
+
+    # TODO: There is no error handling in place
+    send_email(
+        mgoblin_globals.email_sender_address,
+        [request.user['email']],
+        # TODO
+        # Due to the distributed nature of GNU MediaGoblin, we should
+        # find a way to send some additional information about the 
+        # specific GNU MediaGoblin instance in the subject line. For 
+        # example "GNU MediaGoblin @ Wandborg - [...]".   
+        'GNU MediaGoblin - Verify email',
+        email_template.render(
+            username=request.user['username'],
+            verification_url='http://{host}{uri}?userid={userid}&token={verification_key}'.format(
+                host=request.host,
+                uri=request.urlgen('mediagoblin.auth.verify_email'),
+                userid=unicode(request.user['_id']),
+                verification_key=request.user['verification_key'])))
+
+
+    # TODO: For now, we use the successful registration page until we get a 
+    # proper messaging system.
+
+    template = request.template_env.get_template(
+        'mediagoblin/auth/register_success.html')
+    return exc.HTTPFound(
+        location=request.urlgen('mediagoblin.auth.register_success'))
+
index 3da97a4911bf641cfd67331a75886f51cd565c99..0b85430adfaa95e13bb32dd98232f943bd2b4cb8 100644 (file)
@@ -64,6 +64,14 @@ class User(Document):
         return auth_lib.bcrypt_check_password(
             password, self['pw_hash'])
 
+    def generate_new_verification_key(self):
+        """
+        Create a new verification key, overwriting the old one.
+        """
+
+        self['verification_key'] = unicode(uuid.uuid4())
+        self.save(validate=False)
+
 
 class MediaEntry(Document):
     __collection__ = 'media_entries'
index ff3f0b5e67dfe6ec60a6f7308fdd2e3b207ee332..bc12d61c2e28a7644ef83e3264dcb334cf22490d 100644 (file)
@@ -36,9 +36,10 @@ def require_active_login(controller):
     Require an active login from the user.
     """
     def new_controller_func(request, *args, **kwargs):
-        if not request.user or not request.user.get('status') == u'active':
-            # TODO: Indicate to the user that they were redirected
-            # here because an *active* user is required.
+        if request.user and request.user.get('status') == u'needs_email_verification':
+            return exc.HTTPFound(
+                location = request.urlgen('mediagoblin.auth.verify_email_notice'))
+        elif not request.user or request.user.get('status') != u'active':
             return exc.HTTPFound(
                 location="%s?next=%s" % (
                     request.urlgen("mediagoblin.auth.login"),
diff --git a/mediagoblin/templates/mediagoblin/auth/verification_needed.html b/mediagoblin/templates/mediagoblin/auth/verification_needed.html
new file mode 100644 (file)
index 0000000..4104da1
--- /dev/null
@@ -0,0 +1,29 @@
+{#
+# 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/>.
+#}
+{% extends "mediagoblin/base.html" %}
+
+{% block mediagoblin_content %}
+  <p>
+    Verfication needed!<br />
+    Please check your email to verify your account.
+  </p>
+
+  <p>
+    Still haven't received an email? <a href="{{ request.urlgen('mediagoblin.auth.resend_verification') }}">Click here to resend it.</a>
+  </p>
+{% endblock %}