Fix slug lookup regression (#587)
authorSebastian Spaeth <Sebastian@SSpaeth.de>
Tue, 8 Jan 2013 07:59:32 +0000 (08:59 +0100)
committerSebastian Spaeth <Sebastian@SSpaeth.de>
Tue, 8 Jan 2013 07:59:32 +0000 (08:59 +0100)
Removing the Mongo InvalidID legacy code removed an explicit check for
"int" for the id lookup. This led the @get_user_media_entry decorator to
fail if we looked up a nonexisting non-numerical slug (it tried to query
the id with a string, which failed). Cast id to int and return 404 in
case it is non-numeric which fixes the regression. It does not fix the
underlying problem of slug_or_id lookups that were discussed.

Signed-off-by: Sebastian Spaeth <Sebastian@SSpaeth.de>
mediagoblin/decorators.py

index 4ae1b86714b8658030b4083ad11e48233112a916..5533e81d8baec767895f1851a2e63bdb4f0a0b59 100644 (file)
@@ -17,7 +17,7 @@
 from functools import wraps
 
 from urlparse import urljoin
-from werkzeug.exceptions import Forbidden
+from werkzeug.exceptions import Forbidden, NotFound
 from werkzeug.urls import url_quote
 
 from mediagoblin.db.models import MediaEntry, User
@@ -120,25 +120,29 @@ def get_user_media_entry(controller):
     """
     @wraps(controller)
     def wrapper(request, *args, **kwargs):
-        user = request.db.User.find_one(
-            {'username': request.matchdict['user']})
-
+        user = User.query.filter_by(username=request.matchdict['user']).first()
         if not user:
-            return render_404(request)
-        media = request.db.MediaEntry.find_one(
-            {'slug': request.matchdict['media'],
-             'state': u'processed',
-             'uploader': user.id})
+            raise NotFound()
+
+        media = MediaEntry.query.filter_by(
+            slug = request.matchdict['media'],
+            state = u'processed',
+            uploader = user.id).first()
 
-        # no media via slug?  Grab it via object id
         if not media:
-            media = MediaEntry.query.filter_by(
-                    id=request.matchdict['media'],
-                    state=u'processed',
-                    uploader=user.id).first()
-            # Still no media?  Okay, 404.
-            if not media:
-                return render_404(request)
+            # no media via slug?  Grab it via object id
+            try:
+                media = MediaEntry.query.filter_by(
+                    id = int(request.matchdict['media']),
+                    state = u'processed',
+                    uploader = user.id).first()
+            except ValueError:
+                # media "id" was no int
+                raise NotFound()
+
+        if not media:
+            # no media by that id? Okay, 404.
+            raise NotFound()
 
         return controller(request, media=media, *args, **kwargs)