From 9a16e16ffa9c0477bec6ea0bf1db7efd6f988638 Mon Sep 17 00:00:00 2001 From: Sebastian Spaeth Date: Sun, 8 May 2011 20:35:54 +0200 Subject: [PATCH] Implement simple media detail page This patch creates a "homepage" for each media. The URL is /u//m/. 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 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 --- mediagoblin/routing.py | 3 +- .../templates/mediagoblin/media_details.html | 34 ++++++++++++ mediagoblin/templates/mediagoblin/root.html | 6 ++- .../mediagoblin/user_pages/media.html | 41 +++++++++++++++ .../mediagoblin/user_pages/user.html | 26 ++++++++++ mediagoblin/user_pages/__init__.py | 0 mediagoblin/user_pages/routing.py | 24 +++++++++ mediagoblin/user_pages/views.py | 52 +++++++++++++++++++ mediagoblin/views.py | 4 +- 9 files changed, 185 insertions(+), 5 deletions(-) create mode 100644 mediagoblin/templates/mediagoblin/media_details.html create mode 100644 mediagoblin/templates/mediagoblin/user_pages/media.html create mode 100644 mediagoblin/templates/mediagoblin/user_pages/user.html create mode 100644 mediagoblin/user_pages/__init__.py create mode 100644 mediagoblin/user_pages/routing.py create mode 100644 mediagoblin/user_pages/views.py diff --git a/mediagoblin/routing.py b/mediagoblin/routing.py index b47bec8d..356ef678 100644 --- a/mediagoblin/routing.py +++ b/mediagoblin/routing.py @@ -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 diff --git a/mediagoblin/templates/mediagoblin/media_details.html b/mediagoblin/templates/mediagoblin/media_details.html new file mode 100644 index 00000000..a00354bc --- /dev/null +++ b/mediagoblin/templates/mediagoblin/media_details.html @@ -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 . +#} +{% extends "mediagoblin/base.html" %} +{% block mediagoblin_content %} + + {# temporarily, an "image gallery" that isn't one really ;) #} + {% if media %} +

Media details for {{media.title}}

+
+ + +
Uploaded: {{ media.created}} +
Description: {{media.description}} +
+ {% else %} +

Sorry, no such media found.

+ {% endif %} +{% endblock %} diff --git a/mediagoblin/templates/mediagoblin/root.html b/mediagoblin/templates/mediagoblin/root.html index 06a89f3f..2cb0a9c0 100644 --- a/mediagoblin/templates/mediagoblin/root.html +++ b/mediagoblin/templates/mediagoblin/root.html @@ -43,8 +43,10 @@

    {% for entry in media_entries %}
  • - + +
  • {% endfor %}
diff --git a/mediagoblin/templates/mediagoblin/user_pages/media.html b/mediagoblin/templates/mediagoblin/user_pages/media.html new file mode 100644 index 00000000..08cc9251 --- /dev/null +++ b/mediagoblin/templates/mediagoblin/user_pages/media.html @@ -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 . +#} +{% extends "mediagoblin/base.html" %} +{% block mediagoblin_content %} + + {# temporarily, an "image gallery" that isn't one really ;) #} + {% if media %} +

Media details for {{media.uploader.username}} + / {{media.title}} +

+
+ + +
Uploaded on {{ "%4d-%02d-%02d"|format(media.created.year, + media.created.month,media.created.day)}} by {{media.uploader.username}} +
Description: {{media.description}} +
+ {% else %} +

Sorry, no such media found.

+ {% endif %} +{% endblock %} diff --git a/mediagoblin/templates/mediagoblin/user_pages/user.html b/mediagoblin/templates/mediagoblin/user_pages/user.html new file mode 100644 index 00000000..4ad34f51 --- /dev/null +++ b/mediagoblin/templates/mediagoblin/user_pages/user.html @@ -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 . +#} +{% extends "mediagoblin/base.html" %} +{% block mediagoblin_content -%} + {% if user %} +

User page for '{{user.username}}'

+ {{user}} + {% else %} +

Sorry, no such user found.

+ {% endif %} +{% endblock %} diff --git a/mediagoblin/user_pages/__init__.py b/mediagoblin/user_pages/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/mediagoblin/user_pages/routing.py b/mediagoblin/user_pages/routing.py new file mode 100644 index 00000000..10ecd4fd --- /dev/null +++ b/mediagoblin/user_pages/routing.py @@ -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 . + +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")] diff --git a/mediagoblin/user_pages/views.py b/mediagoblin/user_pages/views.py new file mode 100644 index 00000000..b1a301d4 --- /dev/null +++ b/mediagoblin/user_pages/views.py @@ -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 . + +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})) diff --git a/mediagoblin/views.py b/mediagoblin/views.py index 3728d4aa..f4c0598a 100644 --- a/mediagoblin/views.py +++ b/mediagoblin/views.py @@ -18,13 +18,13 @@ import datetime from webob import Response, exc import wtforms - +from mongokit import ObjectId from mediagoblin import models def root_view(request): media_entries = request.db.MediaEntry.find( {u'state': u'processed'}) - + template = request.template_env.get_template( 'mediagoblin/root.html') return Response(