attribute values should be quoted :)
[mediagoblin.git] / mediagoblin / decorators.py
index 8f107b6feb331c4b8d3aa287ef6bc2d88bfec735..a5bede54c4439d23eaeec7bfbef2d366740e6cf8 100644 (file)
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 
+from bson.errors import InvalidId
 from webob import exc
 
+from mediagoblin.db.util import ObjectId
+
 
 def _make_safe(decorator, original):
     """
@@ -33,9 +36,12 @@ 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"),
@@ -58,6 +64,41 @@ def uses_pagination(controller):
         except ValueError:
             return exc.HTTPNotFound()
 
-        return controller(request, page, *args, **kwargs)    
+        return controller(request, page=page, *args, **kwargs)
+
+    return _make_safe(wrapper, controller)
+
+
+def get_user_media_entry(controller):
+    """
+    Pass in a MediaEntry based off of a url component
+    """
+    def wrapper(request, *args, **kwargs):
+        user = request.db.User.find_one(
+            {'username': request.matchdict['user']})
+
+        if not user:
+            return exc.HTTPNotFound()
+
+        media = request.db.MediaEntry.find_one(
+            {'slug': request.matchdict['media'],
+             'state': 'processed',
+             'uploader': user['_id']})
+
+        # no media via slug?  Grab it via ObjectId
+        if not media:
+            try:
+                media = request.db.MediaEntry.find_one(
+                    {'_id': ObjectId(request.matchdict['media']),
+                     'state': 'processed',
+                     'uploader': user['_id']})
+            except InvalidId:
+                return exc.HTTPNotFound()
+
+            # Still no media?  Okay, 404.
+            if not media:
+                return exc.HTTPNotFound()
+
+        return controller(request, media=media, *args, **kwargs)
 
-    return _make_safe(wrapper,controller)
+    return _make_safe(wrapper, controller)