aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--mediagoblin/decorators.py26
-rw-r--r--mediagoblin/user_pages/routing.py2
-rw-r--r--mediagoblin/user_pages/views.py13
3 files changed, 31 insertions, 10 deletions
diff --git a/mediagoblin/decorators.py b/mediagoblin/decorators.py
index 156a745f..07140831 100644
--- a/mediagoblin/decorators.py
+++ b/mediagoblin/decorators.py
@@ -17,6 +17,8 @@
from webob import exc
+from mediagoblin.db.util import ObjectId
+
def _make_safe(decorator, original):
"""
@@ -61,3 +63,27 @@ def uses_pagination(controller):
return controller(request, page=page, *args, **kwargs)
return _make_safe(wrapper, controller)
+
+
+def get_media_entry(controller):
+ """
+ Pass in a MediaEntry based off of a url component
+ """
+ def wrapper(request, *args, **kwargs):
+ media = request.db.MediaEntry.find_one(
+ {'slug': request.matchdict['media'],
+ 'state': 'processed'})
+
+ # no media via slug? Grab it via ObjectId
+ if not media:
+ media = request.db.MediaEntry.find_one(
+ {'_id': ObjectId(request.matchdict['media']),
+ 'state': 'processed'})
+
+ # Still no media? Okay, 404.
+ if not media:
+ return exc.HTTPNotFound()
+
+ return controller(request, media=media, *args, **kwargs)
+
+ return _make_safe(wrapper, controller)
diff --git a/mediagoblin/user_pages/routing.py b/mediagoblin/user_pages/routing.py
index 304f805f..8b535d13 100644
--- a/mediagoblin/user_pages/routing.py
+++ b/mediagoblin/user_pages/routing.py
@@ -19,6 +19,6 @@ from routes.route import Route
user_routes = [
Route('mediagoblin.user_pages.user_home', "/{user}/",
controller="mediagoblin.user_pages.views:user_home"),
- Route('mediagoblin.user_pages.media_home', '/{user}/m/{m_id}/',
+ Route('mediagoblin.user_pages.media_home', '/{user}/m/{media}/',
requirements=dict(m_id="[0-9a-fA-F]{24}"),
controller="mediagoblin.user_pages.views:media_home")]
diff --git a/mediagoblin/user_pages/views.py b/mediagoblin/user_pages/views.py
index 03f9907d..87fd2ce9 100644
--- a/mediagoblin/user_pages/views.py
+++ b/mediagoblin/user_pages/views.py
@@ -18,7 +18,7 @@ from webob import Response, exc
from mediagoblin.db.util import ObjectId, DESCENDING
from mediagoblin.util import Pagination
-from mediagoblin.decorators import uses_pagination
+from mediagoblin.decorators import uses_pagination, get_media_entry
@uses_pagination
@@ -52,15 +52,11 @@ def user_home(request, page):
'pagination': pagination}))
-def media_home(request):
+@get_media_entry
+def media_home(request, media):
"""'Homepage' of a MediaEntry()"""
- media = request.db.MediaEntry.find_one({
- '_id': ObjectId(request.matchdict['m_id']),
- 'state': 'processed'})
-
# Check that media uploader and user correspond.
- if not media or \
- media['uploader'].get('username') != request.matchdict['user']:
+ if media['uploader'].get('username') != request.matchdict['user']:
return exc.HTTPNotFound()
template = request.template_env.get_template(
@@ -69,4 +65,3 @@ def media_home(request):
template.render(
{'request': request,
'media': media}))
-