[#3091] Réparé les list filters dans l'admin des chercheurs
authorEric Mc Sween <eric.mcsween@auf.org>
Tue, 15 May 2012 21:28:16 +0000 (17:28 -0400)
committerEric Mc Sween <eric.mcsween@auf.org>
Tue, 15 May 2012 21:28:16 +0000 (17:28 -0400)
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
versions.cfg

index 7ad941a..9efa226 100644 (file)
@@ -1,4 +1,5 @@
 # -*- coding: utf-8 -*-
+from auf.django.references import models as ref
 from django.db.models import Q
 from django.contrib import admin
 from django.core.urlresolvers import reverse as url
@@ -10,13 +11,143 @@ from chercheurs.models import Chercheur, ChercheurVoir, Publication, \
                               AdhesionGroupe, ChercheurQuerySet, \
                               AdhesionCommunaute, AdhesionDomaineRecherche, \
                               Groupe, Message
-
 from chercheurs.utils import export
 from savoirs.models import Search
 
 
+class PaysListFilter(admin.SimpleListFilter):
+    title = 'pays'
+    parameter_name = 'pays'
+
+    def lookups(self, request, model_admin):
+        region = request.GET.get('region')
+        nord_sud = request.GET.get('nord_sud')
+        pays = ref.Pays.objects.all()
+        if region is not None:
+            pays = pays.filter(region=region)
+        if nord_sud is not None:
+            pays = pays.filter(nord_sud=nord_sud)
+        return pays.values_list('code', 'nom')
+
+    def queryset(self, request, queryset):
+        if self.value() is not None:
+            return queryset.filter(
+                Q(etablissement__pays=self.value()) |
+                Q(etablissement=None,
+                  etablissement_autre_pays=self.value())
+            )
+
+
+class ParamRemovingListFilter(admin.SimpleListFilter):
+    remove_params = []
+
+    def choices(self, cl):
+        yield {
+            'selected': self.value() is None,
+            'query_string': cl.get_query_string(
+                {}, [self.parameter_name] + self.remove_params
+            ),
+            'display': 'Tout',
+        }
+        for lookup, title in self.lookup_choices:
+            yield {
+                'selected': self.value() == lookup,
+                'query_string': cl.get_query_string({
+                    self.parameter_name: lookup,
+                }, self.remove_params),
+                'display': title,
+            }
+
+
+class RegionListFilter(ParamRemovingListFilter):
+    title = 'région'
+    parameter_name = 'region'
+    remove_params = ['pays']
+
+    def lookups(self, request, model_admin):
+        return (
+            (str(id), nom)
+            for id, nom in ref.Region.objects.values_list('id', 'nom')
+        )
+
+    def queryset(self, request, queryset):
+        if self.value() is not None:
+            return queryset.filter(
+                Q(etablissement__pays__region=self.value()) |
+                Q(etablissement=None,
+                  etablissement_autre_pays__region=self.value())
+            )
+
+
+class NordSudListFilter(ParamRemovingListFilter):
+    title = 'nord/sud'
+    parameter_name = 'nord_sud'
+    remove_params = ['pays']
+
+    def lookups(self, request, model_admin):
+        return ref.Pays.NORD_SUD_CHOICES
+
+    def queryset(self, request, queryset):
+        if self.value() is not None:
+            return queryset.filter(
+                Q(etablissement__pays__nord_sud=self.value()) |
+                Q(etablissement=None,
+                  etablissement_autre_pays__nord_sud=self.value())
+            )
+
+
+class ExpertListFilter(admin.SimpleListFilter):
+    title = 'expert'
+    parameter_name = 'expert'
+
+    def lookups(self, request, model_admin):
+        return (
+            ('1', 'Oui'),
+            ('0', 'Non'),
+        )
+
+    def queryset(self, request, queryset):
+        if self.value() in ['1', 1, True]:
+            return queryset.exclude(expertises=None)
+        elif self.value() in ['0', 0, False]:
+            return queryset.filter(expertises=None)
+
+
+class GroupeChercheursListFilter(admin.SimpleListFilter):
+    title = 'groupe de chercheurs'
+    parameter_name = 'groupe_chercheurs'
+
+    def lookups(self, request, model_admin):
+        return (
+            (str(id), nom)
+            for id, nom in GroupeChercheur.objects.values_list('id', 'nom')
+        )
+
+    def queryset(self, request, queryset):
+        return queryset.filter(groupes=self.value())
+
+
+class DomaineRechercheListFilter(admin.SimpleListFilter):
+    title = 'domaine de recherche'
+    parameter_name = 'domaine_recherche'
+
+    def lookups(self, request, model_admin):
+        return (
+            (str(id), nom)
+            for id, nom in DomaineRecherche.objects.values_list('id', 'nom')
+        )
+
+    def queryset(self, request, queryset):
+        return queryset.filter(groupes=self.value())
+
+
 class ChercheurAdmin(admin.ModelAdmin):
-    list_filter = ['genre']
+    list_filter = (
+        'genre', 'statut', 'membre_reseau_institutionnel',
+        'membre_instance_auf', 'discipline', RegionListFilter,
+        NordSudListFilter, PaysListFilter, GroupeChercheursListFilter,
+        DomaineRechercheListFilter, ExpertListFilter
+    )
     alphabet_filter = 'nom'
     alphabet_filter_table = 'chercheurs_personne'
     DEFAULT_ALPHABET = ''
@@ -121,41 +252,6 @@ class ChercheurAdminQuerySet(ChercheurQuerySet):
     def delete(self):
         self.update(actif=False)
 
-    def filter(self, *args, **kwargs):
-        """Gère des filtres supplémentaires pour l'admin.
-
-        C'est la seule façon que j'ai trouvée de contourner les mécanismes
-        de recherche de l'admin."""
-        pays = kwargs.pop('pays', None)
-        region = kwargs.pop('region', None)
-        nord_sud = kwargs.pop('nord_sud', None)
-        expert = kwargs.pop('expert', None)
-        qs = self
-        if pays is not None:
-            qs = qs.filter(
-                Q(etablissement__pays=pays) |
-                (Q(etablissement=None) & Q(etablissement_autre_pays=pays))
-            )
-        elif region is not None:
-            qs = qs.filter(
-                Q(etablissement__pays__region=region) |
-                (Q(etablissement=None) &
-                 Q(etablissement_autre_pays__region=region))
-            )
-        elif nord_sud is not None:
-            qs = qs.filter(
-                Q(etablissement__pays__nord_sud=nord_sud) |
-                (Q(etablissement=None) &
-                 Q(etablissement_autre_pays__nord_sud=nord_sud))
-            )
-        if expert is not None:
-            if expert in ['1', 1, True]:
-                qs = qs.exclude(expertises=None)
-            else:
-                qs = qs.filter(expertises=None)
-
-        return super(ChercheurAdminQuerySet, qs).filter(*args, **kwargs)
-
 
 class AdhesionGroupeAdmin(admin.ModelAdmin):
     list_filter = ('groupe', 'statut')
index 0cbc6cb..b2e33e6 100644 (file)
@@ -47,19 +47,6 @@ def filter_nord_sud(context):
             'choices': prepare_choices([('Nord', 'Nord'), ('Sud', 'Sud')], 'nord_sud', context, remove=['pays', 'region'])}
 
 @register.inclusion_tag('admin/filter.html', takes_context=True)
-def filter_pays(context):
-    request = context['request']
-    region = request.GET.get('region')
-    nord_sud = request.GET.get('nord_sud')
-    choices = Pays.objects
-    if region is not None:
-        choices = choices.filter(region=region)
-    elif nord_sud is not None:
-        choices = choices.filter(nord_sud=nord_sud)
-    return {'title': u"pays",
-            'choices': prepare_choices(choices.values_list('code', 'nom'), 'pays', context)}
-
-@register.inclusion_tag('admin/filter.html', takes_context=True)
 def filter_groupe_chercheurs(context):
     return {'title': u"communautés de chercheurs",
             'choices': prepare_choices(GroupeChercheur.objects.values_list('id', 'nom'), 'groupes', context)}
index 20d3a06..3ced140 100644 (file)
@@ -7,21 +7,3 @@
 ul.alphabetfilter li.first,.change-list ul.alphabetfilter li.first{width:2em!important;}
 </style>
 {% endblock %}
-
-{% block filters %}
-<div id="changelist-filter">
-    <h2>{% trans 'Filter' %}</h2>
-    {% filter_genre %}
-    {% filter_statut %}
-    {% filter_membre_reseau_institutionnel %}
-    {% filter_membre_instance_auf %}
-    {% filter_discipline %}
-    {% filter_region %}
-    {% filter_nord_sud %}
-    {% filter_pays %}
-    {% filter_groupe_chercheurs %}
-    {% filter_domaine_recherche %}
-    {% filter_expert %}
-</div>
-{% endblock %}
-
index d3f1d46..a336654 100644 (file)
@@ -85,5 +85,5 @@ zc.recipe.egg = 1.3.2
 # Added by Buildout Versions at 2012-04-17 18:07:32.342631
 django-admin-tools = 0.4.1
 
-# Added by Buildout Versions at 2012-05-14 14:12:13.933248
-auf.django.references = 0.16
+# Added by Buildout Versions at 2012-05-15 17:27:59.816025
+auf.django.references = 0.17