Implement simple media detail page
authorSebastian Spaeth <Sebastian@SSpaeth.de>
Sun, 8 May 2011 18:35:54 +0000 (20:35 +0200)
committerChristopher Allan Webber <cwebber@dustycloud.org>
Tue, 10 May 2011 21:01:43 +0000 (16:01 -0500)
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>
mediagoblin/routing.py
mediagoblin/templates/mediagoblin/media_details.html [new file with mode: 0644]
mediagoblin/templates/mediagoblin/root.html
mediagoblin/templates/mediagoblin/user_pages/media.html [new file with mode: 0644]
mediagoblin/templates/mediagoblin/user_pages/user.html [new file with mode: 0644]
mediagoblin/user_pages/__init__.py [new file with mode: 0644]
mediagoblin/user_pages/routing.py [new file with mode: 0644]
mediagoblin/user_pages/views.py [new file with mode: 0644]
mediagoblin/views.py

index b47bec8d4fe45c42080bd408783927f6f1b8a4d6..356ef678853f2ded12374793dfcfadb131669465 100644 (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
diff --git a/mediagoblin/templates/mediagoblin/media_details.html b/mediagoblin/templates/mediagoblin/media_details.html
new file mode 100644 (file)
index 0000000..a00354b
--- /dev/null
@@ -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 %}    
index 06a89f3fd537c311655a0c208945324cbf139767..2cb0a9c07c2e58bc8b23c033d18275fcbd84aa87 100644 (file)
     <ul>
       {% for entry in media_entries %}
         <li>
-          <img src="{{ request.app.public_store.file_url(
-                           entry['media_files']['thumb']) }}" />
+          <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']) }}" /></a>
         </li>
       {% endfor %}
     </ul>
diff --git a/mediagoblin/templates/mediagoblin/user_pages/media.html b/mediagoblin/templates/mediagoblin/user_pages/media.html
new file mode 100644 (file)
index 0000000..08cc925
--- /dev/null
@@ -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 %}    
diff --git a/mediagoblin/templates/mediagoblin/user_pages/user.html b/mediagoblin/templates/mediagoblin/user_pages/user.html
new file mode 100644 (file)
index 0000000..4ad34f5
--- /dev/null
@@ -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 %}    
diff --git a/mediagoblin/user_pages/__init__.py b/mediagoblin/user_pages/__init__.py
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/mediagoblin/user_pages/routing.py b/mediagoblin/user_pages/routing.py
new file mode 100644 (file)
index 0000000..10ecd4f
--- /dev/null
@@ -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")]
diff --git a/mediagoblin/user_pages/views.py b/mediagoblin/user_pages/views.py
new file mode 100644 (file)
index 0000000..b1a301d
--- /dev/null
@@ -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}))
index 3728d4aaacba0077a662aa3986d84ae6aae7d72a..f4c0598a4def2fa5adb0c2c66f8f20c4a0aa9cfa 100644 (file)
@@ -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(