From 6f8d521e451cca25267de2b4a0de54f3f841b5c0 Mon Sep 17 00:00:00 2001 From: Eric Mc Sween Date: Wed, 16 Feb 2011 13:39:55 -0500 Subject: [PATCH 1/1] =?utf8?q?Ajout=C3=A9=20des=20filtres=20=C3=A0=20la=20li?= =?utf8?q?ste=20de=20chercheurs=20dans=20l'admin.?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Demande #1166 --- auf_savoirs_en_partage/chercheurs/admin.py | 38 ++++++++-- .../chercheurs/templatetags/chercheurs_admin.py | 75 ++++++++++++++++++++ .../admin/chercheurs/chercheur/change_list.html | 17 +++++ 3 files changed, 126 insertions(+), 4 deletions(-) create mode 100644 auf_savoirs_en_partage/chercheurs/templatetags/__init__.py create mode 100644 auf_savoirs_en_partage/chercheurs/templatetags/chercheurs_admin.py create mode 100644 auf_savoirs_en_partage/templates/admin/chercheurs/chercheur/change_list.html diff --git a/auf_savoirs_en_partage/chercheurs/admin.py b/auf_savoirs_en_partage/chercheurs/admin.py index 10263eb..1994c79 100644 --- a/auf_savoirs_en_partage/chercheurs/admin.py +++ b/auf_savoirs_en_partage/chercheurs/admin.py @@ -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 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 index 0000000..1b68c47 --- /dev/null +++ b/auf_savoirs_en_partage/chercheurs/templatetags/chercheurs_admin.py @@ -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 index 0000000..41662bf --- /dev/null +++ b/auf_savoirs_en_partage/templates/admin/chercheurs/chercheur/change_list.html @@ -0,0 +1,17 @@ +{% extends "admin/change_list.html" %} +{% load i18n admin_list chercheurs_admin %} + +{% block filters %} +
+

{% trans 'Filter' %}

+ {% filter_genre %} + {% filter_statut %} + {% filter_membre_reseau_institutionnel %} + {% filter_membre_instance_auf %} + {% filter_discipline %} + {% filter_region %} + {% filter_pays %} + {% filter_groupe %} + {% filter_expert %} +
+{% endblock %} -- 1.7.10.4