From 4e3160f0a3106165d3fd721499155d0e9ad20732 Mon Sep 17 00:00:00 2001
From: Sebastian Spaeth <Sebastian@SSpaeth.de>
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/<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                             |    3 +-
 .../templates/mediagoblin/media_details.html       |   34 +++++++++++++
 mediagoblin/templates/mediagoblin/root.html        |    6 ++-
 .../templates/mediagoblin/user_pages/media.html    |   41 +++++++++++++++
 .../templates/mediagoblin/user_pages/user.html     |   26 ++++++++++
 mediagoblin/user_pages/routing.py                  |   24 +++++++++
 mediagoblin/user_pages/views.py                    |   52 ++++++++++++++++++++
 mediagoblin/views.py                               |    4 +-
 8 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 b47bec8..356ef67 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 0000000..a00354b
--- /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 <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 %}    
diff --git a/mediagoblin/templates/mediagoblin/root.html b/mediagoblin/templates/mediagoblin/root.html
index 06a89f3..2cb0a9c 100644
--- a/mediagoblin/templates/mediagoblin/root.html
+++ b/mediagoblin/templates/mediagoblin/root.html
@@ -43,8 +43,10 @@
     <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
index 0000000..08cc925
--- /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 <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
index 0000000..4ad34f5
--- /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 <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
index 0000000..e69de29
diff --git a/mediagoblin/user_pages/routing.py b/mediagoblin/user_pages/routing.py
new file mode 100644
index 0000000..10ecd4f
--- /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 <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
index 0000000..b1a301d
--- /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 <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}))
diff --git a/mediagoblin/views.py b/mediagoblin/views.py
index 3728d4a..f4c0598 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(
-- 
1.7.4.1

