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 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 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):
 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):
     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):
                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
 
             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)
 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 %}