Implement simple media detail page

This patch creates a "homepage" for each media. The URL is
/u/<username>/m/<objID>.

On it we display the media and some details. It is ugly and lacking some
stuff but it works. The only thing left to do is to throw an 404 error
if the <username> and the media uploader don't correspond.

- Also create a user "home page" while at it. It is merely a place
  holder for now though.

- Link from the entries on the homepage, to the media pages, so we
actually find them.

Signed-off-by: Sebastian Spaeth <Sebastian@SSpaeth.de>
This commit is contained in:
Sebastian Spaeth 2011-05-08 20:35:54 +02:00 committed by Christopher Allan Webber
parent 9d97145fe4
commit 9a16e16ffa
9 changed files with 185 additions and 5 deletions

View File

@ -18,7 +18,7 @@ from routes import Mapper
from mediagoblin.auth.routing import auth_routes
from mediagoblin.submit.routing import submit_routes
from mediagoblin.user_pages.routing import user_routes
def get_mapper():
mapping = Mapper()
@ -30,5 +30,6 @@ def get_mapper():
mapping.extend(auth_routes, '/auth')
mapping.extend(submit_routes, '/submit')
mapping.extend(user_routes, '/u')
return mapping

View File

@ -0,0 +1,34 @@
{#
# 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 %}
{# temporarily, an "image gallery" that isn't one really ;) #}
{% if media %}
<h2>Media details for {{media.title}}</h2>
<div>
<img src="{{ request.app.public_store.file_url(
media.media_files.main) }}" />
<br/>Uploaded: {{ media.created}}
<br/>Description: {{media.description}}
</div>
{% else %}
<p>Sorry, no such media found.<p/>
{% endif %}
{% endblock %}

View File

@ -43,8 +43,10 @@
<ul>
{% for entry in media_entries %}
<li>
<a href="{{ request.urlgen('mediagoblin.user_pages.media_home',
user= entry.uploader.username, m_id= entry._id) }}">
<img src="{{ request.app.public_store.file_url(
entry['media_files']['thumb']) }}" />
entry['media_files']['thumb']) }}" /></a>
</li>
{% endfor %}
</ul>

View File

@ -0,0 +1,41 @@
{#
# 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 %}
{# temporarily, an "image gallery" that isn't one really ;) #}
{% if media %}
<h2>Media details for <a
href="{{ request.urlgen('mediagoblin.user_pages.user_home',
user= media.uploader.username) }}">{{media.uploader.username}}</a>
/ {{media.title}}
</h2>
<div>
<img src="{{ request.app.public_store.file_url(
media.media_files.main) }}" />
<br/>Uploaded on {{ "%4d-%02d-%02d"|format(media.created.year,
media.created.month,media.created.day)}} by <a
href="{{ request.urlgen('mediagoblin.user_pages.user_home',
user= media.uploader.username) }}">{{media.uploader.username}}</a>
<br/>Description: {{media.description}}
</div>
{% else %}
<p>Sorry, no such media found.<p/>
{% endif %}
{% endblock %}

View File

@ -0,0 +1,26 @@
{#
# 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 -%}
{% if user %}
<h2>User page for '{{user.username}}'</h2>
{{user}}
{% else %}
<p>Sorry, no such user found.<p/>
{% endif %}
{% endblock %}

View File

View File

@ -0,0 +1,24 @@
1# 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/>.
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', r'/{user}/m/{m_id}',
requirements=dict(m_id="[0-9a-fA-F]{24}"),
controller="mediagoblin.user_pages.views:media_home")]

View File

@ -0,0 +1,52 @@
# 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/>.
from webob import Response
from mongokit import ObjectId
import wtforms
#from mongokit import ObjectId
def user_home(request):
"""'Homepage' of a User()"""
user = request.db.User.find_one(
{'username': request.matchdict['user']})
medias = request.db.MediaEntry.find()
template = request.template_env.get_template(
'mediagoblin/user_pages/user.html')
return Response(
template.render(
{'request': request,
'user': user,
'medias': medias}))
def media_home(request):
"""'Homepage' of a MediaEntry()"""
media = request.db.MediaEntry.find_one(
ObjectId(request.matchdict['m_id']))
#check that media uploader and user correspondent
if media['uploader'].get('username') != request.matchdict['user']:
#TODO: How do I throw an error 404?
pass
template = request.template_env.get_template(
'mediagoblin/user_pages/media.html')
return Response(
template.render(
{'request': request,
'media': media}))

View File

@ -18,7 +18,7 @@ import datetime
from webob import Response, exc
import wtforms
from mongokit import ObjectId
from mediagoblin import models
def root_view(request):