Garder les chercheurs inactifs à l'inscription, jusqu'à ce qu'ils passent
[auf_savoirs_en_partage_django.git] / auf_savoirs_en_partage / chercheurs / admin.py
CommitLineData
6f8d521e 1# -*- coding: utf-8 -*-
cbae0173 2from django.db import models
6f8d521e 3from django.db.models import Q
cbae0173 4from django.contrib import admin
55ef8558
EMS
5from django.core.urlresolvers import reverse as url
6from django.forms.models import BaseInlineFormSet
7from django.http import HttpResponseRedirect
cbae0173 8
6f8d521e
EMS
9from chercheurs.models import Chercheur, Publication, Groupe, ChercheurGroupe, ChercheurQuerySet
10
55ef8558 11class ChercheurAdmin(admin.ModelAdmin):
6f8d521e 12 list_filter = ['genre']
55ef8558
EMS
13 list_per_page = 25
14 actions = ('remove_from_group',)
62354bdb 15 search_fields = ('nom', 'prenom')
cbae0173 16
c0d2903e 17 def lookup_allowed(self, lookup):
6f8d521e
EMS
18 return lookup in ['genre', 'statut', 'membre_reseau_institutionnel',
19 'membre_instance_auf', 'discipline', 'region', 'pays',
20 'groupes'] or \
c0d2903e
EMS
21 admin.ModelAdmin.lookup_allowed(self, lookup)
22
55ef8558
EMS
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)
27 matches.delete()
28 return HttpResponseRedirect(url('admin:chercheurs_chercheur_changelist') + '?groupes__id__exact=' + groupe_id)
29
30 def get_actions(self, request):
31 actions = super(ChercheurAdmin, self).get_actions(request)
32
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')
36 if groupe_id:
37 groupe = Groupe.objects.get(id=groupe_id)
38 action_desc = actions['remove_from_group']
e7b9234a 39 actions['remove_from_group'] = (action_desc[0], action_desc[1], u'Retirer du domaine de recherche « %s »' % groupe.nom)
55ef8558
EMS
40 else:
41 del actions['remove_from_group']
42 return actions
43
6f8d521e
EMS
44 def queryset(self, request):
45 return ChercheurAdminQuerySet(Chercheur)
46
47class ChercheurAdminQuerySet(ChercheurQuerySet):
48
49 def filter(self, *args, **kwargs):
50 """Gère des filtres supplémentaires pour l'admin.
51
52 C'est la seule façon que j'ai trouvée de contourner les mécanismes
53 de recherche de l'admin."""
54 qs = self
55 pays = kwargs.pop('pays', None)
56 region = kwargs.pop('region', None)
57 expert = kwargs.pop('expert', None)
58 if pays is not 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)
65 else:
66 qs = qs.filter(expertises=None)
67
68 return super(ChercheurAdminQuerySet, qs).filter(*args, **kwargs)
69
55ef8558 70admin.site.register(Chercheur, ChercheurAdmin)
cbae0173
AJ
71admin.site.register(Publication)
72admin.site.register(Groupe)
73