All pictures view with intelligent pagination. Css need to be improved.
authorcavaliet
Tue, 05 Feb 2013 13:16:57 +0100
changeset 24 d65e05154aec
parent 23 bb7819c8d7c2
child 25 48614929b87a
All pictures view with intelligent pagination. Css need to be improved.
.pydevproject
src/egonomy/static/egonomy/css/egonomy.css
src/egonomy/templates/egonomy_all_pictures.html
src/egonomy/templates/partial/all_pictures_pagination.html
src/egonomy/templatetags/__init__.py
src/egonomy/templatetags/navigation.py
src/egonomy/urls.py
src/egonomy/views.py
--- a/.pydevproject	Tue Feb 05 11:56:59 2013 +0100
+++ b/.pydevproject	Tue Feb 05 13:16:57 2013 +0100
@@ -1,6 +1,8 @@
 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<?eclipse-pydev version="1.0"?><pydev_project>
-<pydev_property name="org.python.pydev.PYTHON_PROJECT_INTERPRETER">python_egonomy</pydev_property>
+<?eclipse-pydev version="1.0"?>
+
+<pydev_project>
+<pydev_property name="org.python.pydev.PYTHON_PROJECT_INTERPRETER">egonomy_python</pydev_property>
 <pydev_property name="org.python.pydev.PYTHON_PROJECT_VERSION">python 2.7</pydev_property>
 <pydev_pathproperty name="org.python.pydev.PROJECT_SOURCE_PATH">
 <path>/egonomy/src</path>
--- a/src/egonomy/static/egonomy/css/egonomy.css	Tue Feb 05 11:56:59 2013 +0100
+++ b/src/egonomy/static/egonomy/css/egonomy.css	Tue Feb 05 13:16:57 2013 +0100
@@ -169,6 +169,10 @@
     float: left; margin: 2px 0 4px 12px;
 }
 
+.subcol_all {
+    float: left; margin: 2px 0 4px 10px; width: 110px;
+}
+
 .column-third {
     float: left; width: 312px;
 }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/egonomy/templates/egonomy_all_pictures.html	Tue Feb 05 13:16:57 2013 +0100
@@ -0,0 +1,48 @@
+{% extends "egonomy_base.html" %}
+{% load static %}
+{% load i18n %}
+{% load thumbnail %}
+{% load navigation %}
+
+{% block title %}{% trans "All pictures" %}{% endblock %}
+
+{% block content %}
+                <div class="fullwidth">
+                    <div class="fullwidth">
+                        <h2>{% trans "All pictures" %} nb_pages = {{nb_pages}}</h2>
+						{% if nb_pages %}<p>{% build_pagination nb_pages page "contents_page clickable" %}</p>{% endif %}
+                        <ul class="fullwidth">
+                          {% for img in results %}
+                            <li class="subcol_all">
+                                <a href="{% url 'annotate_picture' image_id=img.id %}">
+                                <div class="center-image">
+                                 {% with img.info.image_file as image %}
+                                 {% if image %}
+                                  {% if image|is_portrait %}
+							 	    {% thumbnail image "x110" format="PNG" crop="center" as im %}
+	                                  <img src="{{ im.url }}" width="{{ im.width }}" height="{{ im.height }}"/>
+	                                {% empty %}
+	                                  <img src="{% static 'egonomy/img/empty.gif' %}" width="110" height="110" class="placeholder" />
+	                                {% endthumbnail %}
+	                              {% else %}
+                                    {% thumbnail image "110" format="PNG" crop="center" as im %}
+                                      <img src="{{ im.url }}" width="{{ im.width }}" height="{{ im.height }}"/>
+                                    {% empty %}
+                                      <img src="{% static 'egonomy/img/empty.gif' %}" width=110" height="110" class="placeholder" />
+                                    {% endthumbnail %}
+	                              {% endif %}
+	                             {% else %}
+	                                  <img src="{% static 'egonomy/img/empty.gif' %}" width=110" height="110" class="placeholder" />
+	                             {% endif %}
+	                             {% endwith %}
+                                </div>
+                                <h3>{{ img.metadata.titre }}</h3></a>
+                                <p>{% trans "Annotated by" %} <strong>{{ img.metadata.auteur }}</strong></p>
+                            </li>
+                          {% endfor %}
+                        </ul>
+                        {% if nb_pages %}<p>{% build_pagination nb_pages page "contents_page clickable" %}</p>{% endif %}
+                    </div>
+                </div>
+{% endblock %}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/egonomy/templates/partial/all_pictures_pagination.html	Tue Feb 05 13:16:57 2013 +0100
@@ -0,0 +1,21 @@
+{% if nb_pages %}
+	{% comment %}alors ? : {{begin}} - {{middle}} - {{end}} - nb_pages = {{nb_pages}}<br/>
+	alors ? : nb_pages = {{nb_pages}} - range = {{nb_pages}} - cur_page_nb = {{cur_page_nb}}<br/>{% endcomment %}
+	{% if 1 < cur_page_nb %}<a class="{{a_class}}" alt="prev">&lt;&lt;</a>&nbsp;{% endif %}
+	{% for i in begin %}
+	  {% if i == cur_page_nb %}{{i}}{% else %}<a class="{{a_class}}" alt="{{i}}" href="{% url 'all_pictures' %}?page={{i}}">{{i}}</a>{% endif %}&nbsp;
+	{% endfor %}
+	{% if middle %}
+	...
+	{% for i in middle %}
+	  {% if i == cur_page_nb %}{{i}}{% else %}<a class="{{a_class}}" alt="{{i}}" href="{% url 'all_pictures' %}?page={{i}}">{{i}}</a>{% endif %}&nbsp;
+	{% endfor %}
+	{% endif %}
+	{% if end %}
+    ...
+    {% for i in end %}
+      {% if i == cur_page_nb %}{{i}}{% else %}<a class="{{a_class}}" alt="{{i}}" href="{% url 'all_pictures' %}?page={{i}}">{{i}}</a>{% endif %}&nbsp;
+    {% endfor %}
+    {% endif %}
+	{% if cur_page_nb < nb_pages %}<a class="{{a_class}}" alt="next" href="{% url 'all_pictures' %}?page={{i|add:'1'}}">&gt;&gt;</a>{% endif %}
+{% endif %}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/egonomy/templatetags/__init__.py	Tue Feb 05 13:16:57 2013 +0100
@@ -0,0 +1,1 @@
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/egonomy/templatetags/navigation.py	Tue Feb 05 13:16:57 2013 +0100
@@ -0,0 +1,76 @@
+from django.template import Library
+import re
+
+register = Library()
+
+
+@register.simple_tag
+def active(request, css_class, pattern, exact=True):
+    """
+    a simple tag to test the current path and return a given css class.
+    Useful for navigation tabs
+    """
+    if pattern:
+        if exact:
+            pattern = "^%s$" % pattern.lstrip("^").rstrip("$")
+     
+        if re.search(pattern, request.path):
+            return css_class
+    return ''
+
+
+@register.inclusion_tag("partial/all_pictures_pagination.html", takes_context=True)
+def build_pagination(context, nb_pages, cur_page_nb, a_class, begin_pages=2, end_pages=2, before_current_pages=2, after_current_pages=2):
+    # Digg-like pagination. Adapted from http://djangosnippets.org/snippets/2199/
+    nb_pages = int(nb_pages)
+    cur_page_nb = int(cur_page_nb)
+    #assert False, str(nb_pages) + ', ' + str(cur_page_nb)
+    before = max(cur_page_nb - before_current_pages - 1, 0)
+    after = cur_page_nb + after_current_pages
+    #nb_pages = 5
+    page_range = range(nb_pages+1)[1:]
+    #assert False, str(nb_pages) + str(page_range) 
+    begin = page_range[:begin_pages]
+    #assert False, str(nb_pages) + ", " + str(page_range) + ", " + str(begin)
+    middle = page_range[before:after]
+    end = page_range[-end_pages:]
+    last_page_number = end[-1]
+    #assert False, "a - cur_page_nb = " + str(cur_page_nb) + ", before = " + str(before) + ", after = " + str(after) + ", begin = " + str(begin) + ", middle = " + str(middle) + ", end = " + str(end)
+    
+    def collides(firstlist, secondlist):
+        """ Returns true if lists collides (have same entries)
+        >>> collides([1,2,3,4],[3,4,5,6,7])
+        True
+        >>> collides([1,2,3,4],[5,6,7])
+        False
+        """
+        return any(item in secondlist for item in firstlist)
+    
+    # If middle and end has same entries, then end is what we want
+    if collides(middle, end):
+        end = range(max(cur_page_nb-before_current_pages, 1), last_page_number+1)
+        middle = []
+        
+    #assert False, "0, " + str(nb_pages) + ", " + str(page_range) + ", " + str(begin)
+    # If begin and middle ranges has same entries, then begin is what we want
+    if collides(begin, middle):
+        begin = range(1, min(cur_page_nb + after_current_pages - 1, last_page_number)+1)
+        middle = []
+        #assert False, "1 - cur_page_nb = " + str(cur_page_nb) + ", before = " + str(before) + ", after = " + str(after) + ", begin = " + str(begin) + ", middle = " + str(middle) + ", end = " + str(end)
+        
+    # If begin and end has same entries then begin is what we want
+    if collides(begin, end):
+        begin = range(1, last_page_number+1)
+        end = []
+        #assert False, "2 - " + str(nb_pages) + ", " + str(page_range) + ", " + str(begin)
+        
+    #assert False, str(nb_pages) + ", " + str(page_range) + ", " + str(begin)
+    
+    context.update({'begin' : begin,
+                    'middle' : middle,
+                    'end' : end,
+                    'nb_pages' : nb_pages,
+                    'cur_page_nb' : cur_page_nb,
+                    'a_class' : a_class})
+    #assert False, begin + middle + end
+    return context
--- a/src/egonomy/urls.py	Tue Feb 05 11:56:59 2013 +0100
+++ b/src/egonomy/urls.py	Tue Feb 05 13:16:57 2013 +0100
@@ -13,6 +13,7 @@
     url(r'^viewfragment/(?P<fragment_pk>.*)/$', 'egonomy.views.view_fragment', name='view_fragment'),
     url(r'^createfragment/(?P<image_id>.*)/$', 'egonomy.views.create_fragment', name='create_fragment'),
     url(r'^savefragment/$', 'egonomy.views.save_fragment', name='save_fragment'),
+    url(r'^all/$', 'egonomy.views.all_pictures', name='all_pictures'),
 
     # Uncomment the admin/doc line below to enable admin documentation:
     url(r'^admin/doc/', include('django.contrib.admindocs.urls')),
--- a/src/egonomy/views.py	Tue Feb 05 11:56:59 2013 +0100
+++ b/src/egonomy/views.py	Tue Feb 05 13:16:57 2013 +0100
@@ -1,8 +1,6 @@
 from django.conf import settings
 from django.contrib.auth.decorators import login_required
-#from django.contrib.auth.models import Group, User
-from django.core.files.storage import FileSystemStorage
-#from django.core.paginator import Paginator, InvalidPage, EmptyPage
+from django.core.paginator import Paginator, InvalidPage, EmptyPage
 from django.shortcuts import get_object_or_404, render_to_response, redirect
 from django.template import RequestContext
 from sorl.thumbnail.images import ImageFile
@@ -26,7 +24,7 @@
     #img_list = Image.objects.all()[i:i+12]
     img_list = Image.objects.all()[:12]
     
-    frg_list = Fragment.objects.all()[:12]
+    frg_list = Fragment.objects.all().order_by('-date_saved')[:12]
     
     return render_to_response("egonomy_home.html",
                               {'img_list':img_list, 'fragment_list':frg_list, "search":search, "nb_results":nb_results},
@@ -62,7 +60,7 @@
                               {'fragment': frg, 'fragment_list': frg_list},
                               context_instance=RequestContext(request))
 
-#@login_required
+@login_required
 def create_fragment(request, image_id):
     
     img = get_object_or_404(Image, id=image_id)
@@ -78,7 +76,7 @@
                               {'img': img, 'fragment_list': frg_list},
                               context_instance=RequestContext(request))
 
-#@login_required
+@login_required
 def save_fragment(request):
     
     frg_title = request.POST["fragment_title"]
@@ -101,4 +99,23 @@
     return redirect("view_fragment", fragment_pk=frg.pk)
 
 
+def all_pictures(request):
+    
+    # Get the page number parameter if possible
+    page = request.GET.get("page") or 1
+    page = int(page)
+    
+    img_list = Image.objects.all()
+    nb = 32
+    paginator = Paginator(img_list, nb)
+    try:
+        results = paginator.page(page)
+    except (EmptyPage, InvalidPage):
+        results = paginator.page(paginator.num_pages)
 
+    return render_to_response("egonomy_all_pictures.html",
+                              {'results':results, 'nb_pages':paginator.num_pages, 'page':page},
+                              context_instance=RequestContext(request))
+
+
+