Ajouté des filtres à la liste de chercheurs dans l'admin.
authorEric Mc Sween <eric.mcsween@gmail.com>
Wed, 16 Feb 2011 18:39:55 +0000 (13:39 -0500)
committerEric Mc Sween <eric.mcsween@gmail.com>
Wed, 16 Feb 2011 18:39:55 +0000 (13:39 -0500)
Demande #1166

auf_savoirs_en_partage/chercheurs/admin.py
auf_savoirs_en_partage/chercheurs/templatetags/__init__.py [new file with mode: 0644]
auf_savoirs_en_partage/chercheurs/templatetags/chercheurs_admin.py [new file with mode: 0644]
auf_savoirs_en_partage/templates/admin/chercheurs/chercheur/change_list.html [new file with mode: 0644]

index 10263eb..1994c79 100644 (file)
@@ -1,19 +1,23 @@
-# -*- encoding: utf-8 -*-
-from chercheurs.models import Chercheur, Publication, Groupe, ChercheurGroupe
+# -*- coding: utf-8 -*-
 from django.db import models
+from django.db.models import Q
 from django.contrib import admin
 from django.core.urlresolvers import reverse as url
 from django.forms.models import BaseInlineFormSet
 from django.http import HttpResponseRedirect
 
+from chercheurs.models import Chercheur, Publication, Groupe, ChercheurGroupe, ChercheurQuerySet
+
 class ChercheurAdmin(admin.ModelAdmin):
-    list_filter = ('genre', 'statut', 'membre_reseau_institutionnel', 'membre_instance_auf', 'discipline', 'groupes')
+    list_filter = ['genre']
     list_per_page = 25
     actions = ('remove_from_group',)
     search_fields = ('nom', 'prenom')
 
     def lookup_allowed(self, lookup):
-        return lookup in ['groupes__id__exact', 'discipline__id__exact'] or \
+        return lookup in ['genre', 'statut', 'membre_reseau_institutionnel', 
+                          'membre_instance_auf', 'discipline', 'region', 'pays', 
+                          'groupes'] or \
                admin.ModelAdmin.lookup_allowed(self, lookup)
 
     def remove_from_group(self, request, queryset):
@@ -37,6 +41,32 @@ class ChercheurAdmin(admin.ModelAdmin):
             del actions['remove_from_group']
         return actions
 
+    def queryset(self, request):
+        return ChercheurAdminQuerySet(Chercheur)
+
+class ChercheurAdminQuerySet(ChercheurQuerySet):
+
+    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."""
+        qs = self
+        pays = kwargs.pop('pays', None)
+        region = kwargs.pop('region', None)
+        expert = kwargs.pop('expert', None)
+        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)))
+        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)
+
 admin.site.register(Chercheur, ChercheurAdmin)
 admin.site.register(Publication)
 admin.site.register(Groupe)
diff --git a/auf_savoirs_en_partage/chercheurs/templatetags/__init__.py b/auf_savoirs_en_partage/chercheurs/templatetags/__init__.py
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/auf_savoirs_en_partage/chercheurs/templatetags/chercheurs_admin.py b/auf_savoirs_en_partage/chercheurs/templatetags/chercheurs_admin.py
new file mode 100644 (file)
index 0000000..1b68c47
--- /dev/null
@@ -0,0 +1,75 @@
+# coding: utf-8
+
+from django import template
+from django.utils.encoding import smart_unicode
+
+from chercheurs.models import Chercheur, Groupe, GENRE_CHOICES, STATUT_CHOICES
+from datamaster_modeles.models import Region, Pays
+from savoirs.models import Discipline
+
+register = template.Library()
+
+OUI_NON_CHOICES = [(1, 'Oui'), (0, 'Non')]
+
+@register.inclusion_tag('admin/filter.html', takes_context=True)
+def filter_genre(context):
+    return {'title': 'genre',
+            'choices': prepare_choices(GENRE_CHOICES, 'genre', context)}
+
+@register.inclusion_tag('admin/filter.html', takes_context=True)
+def filter_statut(context):
+    return {'title': 'statut',
+            'choices': prepare_choices(STATUT_CHOICES, 'statut', context)}
+
+@register.inclusion_tag('admin/filter.html', takes_context=True)
+def filter_membre_reseau_institutionnel(context):
+    return {'title': u"appartenance aux instances d'un réseau institutionnel de l'AUF",
+            'choices': prepare_choices(OUI_NON_CHOICES, 'membre_reseau_institutionnel', context)}
+
+@register.inclusion_tag('admin/filter.html', takes_context=True)
+def filter_membre_instance_auf(context):
+    return {'title': u"appartenance à une instance de l'AUF",
+            'choices': prepare_choices(OUI_NON_CHOICES, 'membre_instance_auf', context)}
+
+@register.inclusion_tag('admin/filter.html', takes_context=True)
+def filter_discipline(context):
+    return {'title': u"discipline",
+            'choices': prepare_choices(Discipline.objects.values_list('id', 'nom'), 'discipline', context)}
+
+@register.inclusion_tag('admin/filter.html', takes_context=True)
+def filter_region(context):
+    return {'title': u"région",
+            'choices': prepare_choices(Region.objects.values_list('id', 'nom'), 'region', context, remove=['pays'])}
+
+@register.inclusion_tag('admin/filter.html', takes_context=True)
+def filter_pays(context):
+    request = context['request']
+    region = request.GET.get('region')
+    choices = Pays.objects
+    if region is not None:
+        choices = choices.filter(region=region)
+    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(context):
+    return {'title': u"domaine de recherche",
+            'choices': prepare_choices(Groupe.objects.values_list('id', 'nom'), 'groupes', context)}
+
+@register.inclusion_tag('admin/filter.html', takes_context=True)
+def filter_expert(context):
+    return {'title': u"expert",
+            'choices': prepare_choices(OUI_NON_CHOICES, 'expert', context)}
+
+def prepare_choices(choices, query_param, context, remove=[]):
+    request = context['request']
+    cl = context['cl']
+    query_val = request.GET.get(query_param)
+    result = [{'selected': query_val is None,
+               'query_string': cl.get_query_string({}, [query_param] + remove),
+               'display': 'Tout'}]
+    for k, v in choices:
+        result.append({'selected': smart_unicode(k) == query_val,
+                       'query_string': cl.get_query_string({query_param: k}, remove),
+                       'display': v})
+    return result
diff --git a/auf_savoirs_en_partage/templates/admin/chercheurs/chercheur/change_list.html b/auf_savoirs_en_partage/templates/admin/chercheurs/chercheur/change_list.html
new file mode 100644 (file)
index 0000000..41662bf
--- /dev/null
@@ -0,0 +1,17 @@
+{% extends "admin/change_list.html" %}
+{% load i18n admin_list chercheurs_admin %}
+
+{% 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_pays %}
+    {% filter_groupe %}
+    {% filter_expert %}
+</div>
+{% endblock %}