MediaEntry slugs usable in URLs, & decorator that grabs media from the request

This commit is contained in:
Christopher Allan Webber 2011-05-20 17:47:36 -05:00
parent 3c2567ac76
commit 724933b154
3 changed files with 31 additions and 10 deletions

View File

@ -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)

View File

@ -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")]

View File

@ -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}))