1 # -*- coding: utf-8 -*-
2 from django
.db
import models
3 from django
.db
.models
import Q
4 from django
.contrib
import admin
5 from django
.core
.urlresolvers
import reverse
as url
6 from django
.forms
.models
import BaseInlineFormSet
7 from django
.http
import HttpResponseRedirect
9 from chercheurs
.models
import Chercheur
, Publication
, Groupe
, ChercheurGroupe
, ChercheurQuerySet
11 class ChercheurAdmin(admin
.ModelAdmin
):
12 list_filter
= ['genre']
14 actions
= ('remove_from_group',)
15 search_fields
= ('nom', 'prenom')
17 def lookup_allowed(self
, lookup
):
18 return lookup
in ['genre', 'statut', 'membre_reseau_institutionnel',
19 'membre_instance_auf', 'discipline', 'region', 'pays',
21 admin
.ModelAdmin
.lookup_allowed(self
, lookup
)
23 def remove_from_group(self
, request
, queryset
):
24 groupe_id
= request
.GET
.get('groupes__id__exact')
25 chercheur_ids
= queryset
.values_list('id', flat
=True)
26 matches
= ChercheurGroupe
.objects
.filter(groupe
=groupe_id
, chercheur__in
=chercheur_ids
)
28 return HttpResponseRedirect(url('admin:chercheurs_chercheur_changelist') + '?groupes__id__exact=' + groupe_id
)
30 def get_actions(self
, request
):
31 actions
= super(ChercheurAdmin
, self
).get_actions(request
)
33 # Si on filtre par groupe de recherche, offrir d'en retirer les
34 # chercheurs sélectionnés.
35 groupe_id
= request
.GET
.get('groupes__id__exact')
37 groupe
= Groupe
.objects
.get(id=groupe_id
)
38 action_desc
= actions
['remove_from_group']
39 actions
['remove_from_group'] = (action_desc
[0], action_desc
[1], u
'Retirer du domaine de recherche « %s »' % groupe
.nom
)
41 del actions
['remove_from_group']
44 def queryset(self
, request
):
45 return ChercheurAdminQuerySet(Chercheur
)
47 class ChercheurAdminQuerySet(ChercheurQuerySet
):
49 def filter(self
, *args
, **kwargs
):
50 """Gère des filtres supplémentaires pour l'admin.
52 C'est la seule façon que j'ai trouvée de contourner les mécanismes
53 de recherche de l'admin."""
55 pays
= kwargs
.pop('pays', None)
56 region
= kwargs
.pop('region', None)
57 expert
= kwargs
.pop('expert', None)
59 qs
= qs
.filter(Q(etablissement__pays
=pays
) |
(Q(etablissement
=None) & Q(etablissement_autre_pays
=pays
)))
60 elif region
is not None:
61 qs
= qs
.filter(Q(etablissement__pays__region
=region
) |
(Q(etablissement
=None) & Q(etablissement_autre_pays__region
=region
)))
62 if expert
is not None:
63 if expert
in ['1', 1, True]:
64 qs
= qs
.exclude(expertises
=None)
66 qs
= qs
.filter(expertises
=None)
68 return super(ChercheurAdminQuerySet
, qs
).filter(*args
, **kwargs
)
70 admin
.site
.register(Chercheur
, ChercheurAdmin
)
71 admin
.site
.register(Publication
)
72 admin
.site
.register(Groupe
)