maposmatic-dev
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Maposmatic-dev] [PATCH 1/2] Add a pagination system "a la" digg.


From: Maxime Hadjinlian
Subject: [Maposmatic-dev] [PATCH 1/2] Add a pagination system "a la" digg.
Date: Mon, 21 Jun 2010 17:35:40 +0200

The pagination allow the users to navigate quickly through
a big list of pages. It's available in Jobs and Maps pages.
We display : [1, 2, (...), n-1, n, n+1, (...), t-1, t ]

The letter pagination is to disappear in the next commit.
Signed-off-by: Maxime Hadjinlian <address@hidden>
---
 www/maposmatic/helpers.py               |   22 +++++++++++++++++
 www/maposmatic/views.py                 |   10 ++++---
 www/media/style.css                     |    5 ++++
 www/templates/maposmatic/all_jobs.html  |   16 +-----------
 www/templates/maposmatic/all_maps.html  |   16 +-----------
 www/templates/maposmatic/paginator.html |   40 +++++++++++++++++++++++++++++++
 6 files changed, 77 insertions(+), 32 deletions(-)
 create mode 100644 www/templates/maposmatic/paginator.html

diff --git a/www/maposmatic/helpers.py b/www/maposmatic/helpers.py
index 0a70e26..45b96d4 100644
--- a/www/maposmatic/helpers.py
+++ b/www/maposmatic/helpers.py
@@ -155,3 +155,25 @@ def get_letters():
     # who don't?
     return [chr(i) for i in xrange(ord('A'), ord('Z')+1)]
 
+def get_pages_list(page, paginator):
+    """Returns a list of number.
+    It contains the id of the pages to display for a page given."""
+
+    # Navigation pages
+    nav = {}
+    page_list = []
+    last = False
+
+    for i in [1, 2,
+              page.number-1, page.number, page.number+1,
+              paginator.num_pages-1, paginator.num_pages]:
+        nav[i] = True
+
+    for i in xrange(1, paginator.num_pages+1):
+        if nav.has_key(i):
+            if last and i - last > 1:
+                page_list.append('...')
+            page_list.append(i)
+            last = i
+    return page_list
+
diff --git a/www/maposmatic/views.py b/www/maposmatic/views.py
index 3dc8d81..4e899df 100644
--- a/www/maposmatic/views.py
+++ b/www/maposmatic/views.py
@@ -108,8 +108,8 @@ def job(request, job_id):
         refresh = www.settings.REFRESH_JOB_RENDERING
 
     return render_to_response('maposmatic/job-page.html',
-                              { 'job' : job, 'single': True,
-                                'redirected' : isredirected,
+                              { 'job': job, 'single': True,
+                                'redirected': isredirected,
                                 'refresh': refresh, 'refresh_ms': 
(refresh*1000) },
                               
context_instance=MapOSMaticRequestContext(request))
 
@@ -133,7 +133,8 @@ def all_jobs(request):
         jobs = paginator.page(paginator.num_pages)
 
     return render_to_response('maposmatic/all_jobs.html',
-                              { 'jobs' : jobs },
+                              { 'jobs': jobs,
+                                'pages': helpers.get_pages_list(jobs, 
paginator) },
                               
context_instance=MapOSMaticRequestContext(request))
 
 def all_maps(request):
@@ -172,7 +173,8 @@ def all_maps(request):
 
     return render_to_response('maposmatic/all_maps.html',
                               { 'maps': maps, 'letters': helpers.get_letters(),
-                                'form': form, 'is_search': form.is_valid() },
+                                'form': form, 'is_search': form.is_valid(),
+                                'pages': helpers.get_pages_list(maps, 
paginator) },
                               
context_instance=MapOSMaticRequestContext(request))
 
 def all_maps_by_letter(request, letter):
diff --git a/www/media/style.css b/www/media/style.css
index 77a80c3..794f6ce 100644
--- a/www/media/style.css
+++ b/www/media/style.css
@@ -39,6 +39,11 @@ a img {
   border: none;
 }
 
+a.current {
+  font-weight: bold;
+  font-size: larger;
+}
+
 img {
   -ms-interpolation-mode: bicubic;
 }
diff --git a/www/templates/maposmatic/all_jobs.html 
b/www/templates/maposmatic/all_jobs.html
index 0fb97ff..28bcd05 100644
--- a/www/templates/maposmatic/all_jobs.html
+++ b/www/templates/maposmatic/all_jobs.html
@@ -41,13 +41,7 @@ requests received during the last 24 hours, starting from 
the most
 recent one.{% endblocktrans %}
 </p>
 
-{% ifnotequal jobs.paginator.num_pages 1 %}
-<div class="pagination">
-  {% if jobs.has_previous %}<a class="prevlink" href="?page={{ 
jobs.previous_page_number }}">&laquo; {% trans "Previous" %}</a>{% endif %}
-  <span class="current">{% trans "Page" %} {{ jobs.number }} {% trans "of" %} 
{{ jobs.paginator.num_pages }}</span>
-  {% if jobs.has_next %}<a class="nextlink" href="?page={{ 
jobs.next_page_number }}">{% trans "Next" %} &raquo;</a>{% endif %}
-</div>
-{% endifnotequal %}
+{% with jobs as data %}{% include "maposmatic/paginator.html" %}{% endwith %}
 
 {% for job in jobs.object_list %}
 <div class="job {% cycle jobodd,jobeven %}">
@@ -55,13 +49,7 @@ recent one.{% endblocktrans %}
 </div>
 {% endfor %}
 
-{% ifnotequal jobs.paginator.num_pages 1 %}
-<div class="pagination">
-  {% if jobs.has_previous %}<a class="prevlink" href="?page={{ 
jobs.previous_page_number }}">&laquo; {% trans "Previous" %}</a>{% endif %}
-  <span class="current">{% trans "Page" %} {{ jobs.number }} {% trans "of" %} 
{{ jobs.paginator.num_pages }}</span>
-  {% if jobs.has_next %}<a class="nextlink" href="?page={{ 
jobs.next_page_number }}">{% trans "Next" %} &raquo;</a>{% endif %}
-</div>
-{% endifnotequal %}
+{% with jobs as data %}{% include "maposmatic/paginator.html" %}{% endwith %}
 
 {% else %}
 <p>
diff --git a/www/templates/maposmatic/all_maps.html 
b/www/templates/maposmatic/all_maps.html
index e64a5c6..f713511 100644
--- a/www/templates/maposmatic/all_maps.html
+++ b/www/templates/maposmatic/all_maps.html
@@ -40,13 +40,7 @@
   <a href="{% url maps %}"{% if not current_letter %} class="selectedletter"{% 
endif %}>{% trans "All" %}</a> - {% for l in letters %}<a href="{% url 
maps-by-letter l %}"{% ifequal l current_letter %} class="selectedletter"{% 
endifequal %}>{{ l }}</a>{% if not forloop.last %} - {% endif %}{% endfor %}
 </p>
 
-{% ifnotequal maps.paginator.num_pages 1 %}
-<div class="pagination">
-  {% if maps.has_previous %}<a href="?{% if is_search %}query={{ 
form.cleaned_data.query|urlencode }}&{% endif %}page={{ 
maps.previous_page_number }}">&laquo; {% trans "Previous" %}</a>{% endif %}
-  <span class="current">{% trans "Page" %} {{ maps.number }} {% trans "of" %} 
{{ maps.paginator.num_pages }}</span>
-  {% if maps.has_next %}<a href="?{% if is_search %}query={{ 
form.cleaned_data.query|urlencode }}&{% endif %}page={{ maps.next_page_number 
}}">{% trans "Next" %} &raquo;</a>{% endif %}
-</div>
-{% endifnotequal %}
+{% with maps as data %}{% with form.cleaned_data.query as query %}{% include 
"maposmatic/paginator.html" %}{% endwith %}{% endwith %}
 
 {% comment %}For Django 1.0.x compatibility. With Django >= 1.1 we should use 
the empty tag.{% endcomment %}
 {% if maps.object_list|length %}
@@ -65,12 +59,6 @@
 </p>
 {% endif %}
 
-{% ifnotequal maps.paginator.num_pages 1 %}
-<div class="pagination">
-  {% if maps.has_previous %}<a href="?{% if is_search %}query={{ 
form.cleaned_data.query|urlencode }}&{% endif %}page={{ 
maps.previous_page_number }}">&laquo; {% trans "Previous" %}</a>{% endif %}
-  <span class="current">{% trans "Page" %} {{ maps.number }} {% trans "of" %} 
{{ maps.paginator.num_pages }}</span>
-  {% if maps.has_next %}<a href="?{% if is_search %}query={{ 
form.cleaned_data.query|urlencode }}&{% endif %}page={{ maps.next_page_number 
}}">{% trans "Next" %} &raquo;</a>{% endif %}
-</div>
-{% endifnotequal %}
+{% with maps as data %}{% with form.cleaned_data.query as query %}{% include 
"maposmatic/paginator.html" %}{% endwith %}{% endwith %}
 
 {% endblock %}
diff --git a/www/templates/maposmatic/paginator.html 
b/www/templates/maposmatic/paginator.html
new file mode 100644
index 0000000..ad09c12
--- /dev/null
+++ b/www/templates/maposmatic/paginator.html
@@ -0,0 +1,40 @@
+{% comment %}
+ coding: utf-8
+
+ maposmatic, the web front-end of the MapOSMatic city map generation system
+ Copyright (C) 2009  David Decotigny
+ Copyright (C) 2009  Frédéric Lehobey
+ Copyright (C) 2009  David Mentré
+ Copyright (C) 2009  Maxime Petazzoni
+ Copyright (C) 2009  Thomas Petazzoni
+ Copyright (C) 2009  Gaël Utard
+
+ 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 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/>.
+{% endcomment %}
+
+
+{% load i18n %}
+
+{% load extratags %}
+
+{% ifnotequal data.paginator.num_pages 1 %}
+<div class="pagination">
+  {% if data.has_previous %}<a href="?{% if is_search %}query={{ 
query|urlencode }}&{% endif %}page={{ data.previous_page_number }}">&laquo; {% 
trans "Previous" %}</a> &middot;{% endif %}
+  {% for num in pages %}
+    {% ifequal num "..." %}{{ num }}{% else %}<a href="?{% if is_search 
%}query={{ query|urlencode }}&{% endif %}page={{ num }}"{% ifequal num 
data.number %} class="current"{% endifequal %}>{{ num }}</a>{% endifequal %}
+  {% endfor %}
+  {% if data.has_next %}&middot; <a href="?{% if is_search %}query={{ 
query|urlencode }}&{% endif %}page={{ data.next_page_number }}">{% trans "Next" 
%} &raquo;</a>{% endif %}
+</div>
+{% endifnotequal %}
+
-- 
1.7.1




reply via email to

[Prev in Thread] Current Thread [Next in Thread]