adds previous and next links in the sidebar
authorCaleb Forbes Davis V <caldavis@gmail.com>
Sat, 2 Jul 2011 11:15:58 +0000 (06:15 -0500)
committerCaleb Forbes Davis V <caldavis@gmail.com>
Sat, 2 Jul 2011 11:15:58 +0000 (06:15 -0500)
Feature #401 - previous/next navigation on media pages
* media.html includes a new prev_next.html template containing the links
* prev_next.html calls functions added to the media model to retrieve
  the appropriate objects from the database, formatted with urlgen
* a small change to util.py brings ASCENDING into the mix

mediagoblin/db/models.py
mediagoblin/db/util.py
mediagoblin/templates/mediagoblin/user_pages/media.html
mediagoblin/templates/mediagoblin/utils/prev_next.html [new file with mode: 0644]

index bf825a2391bc82b20b7bb4989b92d76c325b6e66..cfd834301d251412bd729979de1f950e76705e45 100644 (file)
@@ -22,7 +22,7 @@ from mediagoblin import util
 from mediagoblin.auth import lib as auth_lib
 from mediagoblin import mg_globals
 from mediagoblin.db import migrations
-from mediagoblin.db.util import DESCENDING, ObjectId
+from mediagoblin.db.util import ASCENDING, DESCENDING, ObjectId
 from mediagoblin.util import Pagination
 
 ###################
@@ -154,6 +154,32 @@ class MediaEntry(Document):
                 'mediagoblin.user_pages.media_home',
                 user=uploader['username'],
                 media=unicode(self['_id']))
+            
+    def url_to_prev(self, urlgen):
+        """
+        Provide a url to the previous entry from this user, if there is one
+        """
+        cursor = self.db.MediaEntry.find({'_id' : {"$lt": self['_id']}, 
+                                          'uploader': self['uploader']}).sort(
+                                                    '_id', DESCENDING).limit(1)
+                                                    
+        if cursor.count():
+            return urlgen('mediagoblin.user_pages.media_home',
+                          user=self.uploader()['username'],
+                          media=unicode(cursor[0]['_id']))
+        
+    def url_to_next(self, urlgen):
+        """
+        Provide a url to the next entry from this user, if there is one
+        """
+        cursor = self.db.MediaEntry.find({'_id' : {"$gt": self['_id']}, 
+                                          'uploader': self['uploader']}).sort(
+                                                    '_id', ASCENDING).limit(1)
+
+        if cursor.count():
+            return urlgen('mediagoblin.user_pages.media_home',
+                          user=self.uploader()['username'],
+                          media=unicode(cursor[0]['_id']))
 
     def uploader(self):
         return self.db.User.find_one({'_id': self['uploader']})
index 46f899f7a6883f973186ab707b0d84fafffb4e82..70c37945d06f0a0c75e51fcc091a1f6349424373 100644 (file)
@@ -30,7 +30,7 @@ document relevant to here:
 import copy
 
 # Imports that other modules might use
-from pymongo import DESCENDING
+from pymongo import ASCENDING, DESCENDING
 from pymongo.errors import InvalidId
 from mongokit import ObjectId
 
index 3cebe2f9a27a4a9acf6373d2e959c6d400646b8a..6159a853c5e4e1a9e41bf643d88c75c6d9b9126b 100644 (file)
@@ -96,6 +96,7 @@
 
     <div class="grid_4 omega media_sidebar">
       <p>This is a sidebar! Yay!</p>
+      {% include "mediagoblin/utils/prev_next.html" %}
     </div>
   {% else %}
   <p>Sorry, no such media found.<p/>
diff --git a/mediagoblin/templates/mediagoblin/utils/prev_next.html b/mediagoblin/templates/mediagoblin/utils/prev_next.html
new file mode 100644 (file)
index 0000000..e054ed2
--- /dev/null
@@ -0,0 +1,45 @@
+{#
+# 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/>.
+#}
+
+{# Provide navigation links to neighboring media entries, if possible #}
+{% set prev_entry_url = media.url_to_prev(request.urlgen) %}
+{% set next_entry_url = media.url_to_next(request.urlgen) %}
+
+<div>
+  {# There are no previous entries for the very first media entry #}
+  {% if prev_entry_url %}
+    <a href="{{ prev_entry_url }}">
+      {# TODO - insert 'Previous' and 'X' image sources #}
+      Previous 
+    </a>
+  {% else %}
+    {# This is the first entry. display greyed-out 'previous' image #}
+    X 
+  {% endif %}
+
+  {# Likewise, this could be the very last media entry #}
+  {% if next_entry_url %}
+    <a href="{{ next_entry_url }}">
+      {# TODO - insert 'Next' and 'X' image sources #}
+       Next
+    </a>
+  {% else %}
+    {# This is the last entry. display greyed-out 'next' image #}
+     X
+  {% endif %}
+</div>