Paginer les chercheurs par leur initiale.
authorEric Mc Sween <eric.mcsween@gmail.com>
Wed, 16 Mar 2011 17:15:27 +0000 (13:15 -0400)
committerEric Mc Sween <eric.mcsween@gmail.com>
Wed, 16 Mar 2011 17:15:27 +0000 (13:15 -0400)
Demande #1196

auf_savoirs_en_partage/chercheurs/admin.py
auf_savoirs_en_partage/chercheurs/templatetags/chercheurs_admin.py
auf_savoirs_en_partage/templates/admin/chercheurs/chercheur/change_list.html

index eaf36af..48e9e46 100644 (file)
@@ -12,14 +12,14 @@ from chercheurs.models import Chercheur, Publication, Groupe, ChercheurGroupe, C
 
 class ChercheurAdmin(admin.ModelAdmin):
     list_filter = ['genre']
-    list_per_page = 25
+    list_per_page = 9999
     actions = ('remove_from_group', 'export_as_ods', 'export_as_csv')
     search_fields = ('nom', 'prenom')
 
     def lookup_allowed(self, lookup, value):
         return lookup in ['genre', 'statut', 'membre_reseau_institutionnel', 
                           'membre_instance_auf', 'discipline', 'region', 'pays', 
-                          'groupes', 'nord_sud'] or \
+                          'groupes', 'nord_sud', 'initial'] or \
                admin.ModelAdmin.lookup_allowed(self, lookup, value)
 
     def remove_from_group(self, request, queryset):
@@ -46,6 +46,14 @@ class ChercheurAdmin(admin.ModelAdmin):
     def queryset(self, request):
         return ChercheurAdminQuerySet(Chercheur)
 
+    def changelist_view(self, request, extra_context=None):
+        initials = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+        current_initial = request.GET.get('initial', 'A')
+        return super(ChercheurAdmin, self).changelist_view(request, extra_context={
+            'initials': initials,
+            'current_initial': current_initial
+        })
+
     def export(self, queryset, type):
         if queryset.count() == 0:
             return None
@@ -128,11 +136,12 @@ class ChercheurAdminQuerySet(ChercheurQuerySet):
            
         C'est la seule façon que j'ai trouvée de contourner les mécanismes
         de recherche de l'admin."""
-        qs = self
         pays = kwargs.pop('pays', None)
         region = kwargs.pop('region', None)
         nord_sud = kwargs.pop('nord_sud', None)
         expert = kwargs.pop('expert', None)
+        initial = kwargs.pop('initial', 'A')
+        qs = super(ChercheurAdminQuerySet, self).filter(nom__istartswith=initial)
         if pays is not None:
             qs = qs.filter(Q(etablissement__pays=pays) | 
                            (Q(etablissement=None) & Q(etablissement_autre_pays=pays)))
index 5125b7f..9fe3535 100644 (file)
@@ -1,5 +1,7 @@
 # coding: utf-8
 
+from urllib import urlencode
+
 from django import template
 from django.utils.encoding import smart_unicode
 
@@ -81,3 +83,9 @@ def prepare_choices(choices, query_param, context, remove=[]):
                        'query_string': cl.get_query_string({query_param: k}, remove),
                        'display': v})
     return result
+
+@register.simple_tag
+def query_string_with_initial(request, initial):
+    qs = request.GET.copy()
+    qs['initial'] = initial
+    return urlencode(qs)
index 9e9a8b7..5f9bfc4 100644 (file)
     {% filter_expert %}
 </div>
 {% endblock %}
+
+{% block pagination %}
+<p class="paginator">
+    {% for initial in initials %}
+    {% if initial == current_initial %}
+    <span class="this-page">{{ initial }}</span>
+    {% else %}
+    <a href="?{% query_string_with_initial request initial %}">{{ initial }}</a>
+    {% endif %}
+    {% endfor %}
+</p>
+{% endblock %}