Commit | Line | Data |
---|---|---|
6f8d521e | 1 | # -*- coding: utf-8 -*- |
cbae0173 | 2 | from django.db import models |
6f8d521e | 3 | from django.db.models import Q |
cbae0173 | 4 | from django.contrib import admin |
55ef8558 EMS |
5 | from django.core.urlresolvers import reverse as url |
6 | from django.forms.models import BaseInlineFormSet | |
7 | from django.http import HttpResponseRedirect | |
cbae0173 | 8 | |
6f8d521e EMS |
9 | from chercheurs.models import Chercheur, Publication, Groupe, ChercheurGroupe, ChercheurQuerySet |
10 | ||
55ef8558 | 11 | class 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 | ||
47 | class 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 | 70 | admin.site.register(Chercheur, ChercheurAdmin) |
cbae0173 AJ |
71 | admin.site.register(Publication) |
72 | admin.site.register(Groupe) | |
73 |