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 | |
d264c787 EMS |
8 | from django.utils.encoding import smart_str |
9 | from django_exportateur.exportateur import exportateur | |
cbae0173 | 10 | |
d264c787 | 11 | from chercheurs.models import Chercheur, Publication, Groupe, ChercheurGroupe, ChercheurQuerySet, These |
6f8d521e | 12 | |
55ef8558 | 13 | class ChercheurAdmin(admin.ModelAdmin): |
6f8d521e | 14 | list_filter = ['genre'] |
b1d4c7ac PP |
15 | alphabet_filter = 'nom' |
16 | alphabet_filter_table = 'chercheurs_personne' | |
17 | DEFAULT_ALPHABET = '' | |
18 | ||
d264c787 | 19 | actions = ('remove_from_group', 'export_as_ods', 'export_as_csv') |
62354bdb | 20 | search_fields = ('nom', 'prenom') |
cbae0173 | 21 | |
afc30c28 | 22 | def lookup_allowed(self, lookup, value): |
6f8d521e EMS |
23 | return lookup in ['genre', 'statut', 'membre_reseau_institutionnel', |
24 | 'membre_instance_auf', 'discipline', 'region', 'pays', | |
b1d4c7ac | 25 | 'groupes', 'nord_sud'] or \ |
afc30c28 | 26 | admin.ModelAdmin.lookup_allowed(self, lookup, value) |
c0d2903e | 27 | |
55ef8558 EMS |
28 | def remove_from_group(self, request, queryset): |
29 | groupe_id = request.GET.get('groupes__id__exact') | |
30 | chercheur_ids = queryset.values_list('id', flat=True) | |
31 | matches = ChercheurGroupe.objects.filter(groupe=groupe_id, chercheur__in=chercheur_ids) | |
32 | matches.delete() | |
33 | return HttpResponseRedirect(url('admin:chercheurs_chercheur_changelist') + '?groupes__id__exact=' + groupe_id) | |
34 | ||
35 | def get_actions(self, request): | |
36 | actions = super(ChercheurAdmin, self).get_actions(request) | |
37 | ||
38 | # Si on filtre par groupe de recherche, offrir d'en retirer les | |
39 | # chercheurs sélectionnés. | |
40 | groupe_id = request.GET.get('groupes__id__exact') | |
41 | if groupe_id: | |
42 | groupe = Groupe.objects.get(id=groupe_id) | |
43 | action_desc = actions['remove_from_group'] | |
e7b9234a | 44 | actions['remove_from_group'] = (action_desc[0], action_desc[1], u'Retirer du domaine de recherche « %s »' % groupe.nom) |
55ef8558 EMS |
45 | else: |
46 | del actions['remove_from_group'] | |
47 | return actions | |
48 | ||
6f8d521e EMS |
49 | def queryset(self, request): |
50 | return ChercheurAdminQuerySet(Chercheur) | |
51 | ||
ee2ef0e8 EMS |
52 | def get_object(self, request, object_id): |
53 | """On doit réimplémenter cette méthode à cause de ce qu'on fait avec "initial" dans la méthode queryset().""" | |
54 | try: | |
55 | return Chercheur.objects.get(id=object_id) | |
56 | except Chercheur.DoesNotExist: | |
57 | return None | |
58 | ||
d264c787 EMS |
59 | def export(self, queryset, type): |
60 | if queryset.count() == 0: | |
61 | return None | |
62 | obj = queryset[0] | |
63 | headers = ['Nom', 'Prénom', 'Genre', 'Courriel', 'Téléphone', 'Adresse postale', | |
64 | 'Statut', 'Diplôme', 'Établissement', 'Pays', 'Domaines de recherche', | |
65 | 'Thèse', 'Directeur', 'Discipline', 'Thèmes de recherche', 'Groupe de recherche', 'Mots-clés', | |
66 | 'Site web', 'Blog', 'Réseau social', | |
67 | 'Membre instance AUF', "Sollicité par l'OIF", 'Membre société francophone', | |
68 | 'Membre instance réseau institutionnel AUF', 'Expertises', 'Solliciter pour expertises', | |
69 | 'Publications'] | |
70 | data = [] | |
71 | for c in queryset: | |
72 | row = [] | |
73 | row.append(c.nom) | |
74 | row.append(c.prenom) | |
75 | row.append(c.get_genre_display()) | |
76 | row.append(c.courriel) | |
77 | row.append(c.telephone) | |
78 | row.append(c.adresse_postale) | |
79 | row.append(c.get_statut_display()) | |
80 | row.append(c.diplome) | |
81 | row.append(c.nom_etablissement) | |
82 | row.append(c.pays) | |
83 | row.append(', '.join(g.nom for g in c.groupes.all())) | |
84 | try: | |
85 | t = c.these | |
86 | row.append('%s, %s, %s, %s pages.' % (t.titre, t.etablissement, t.annee, t.nb_pages)) | |
87 | row.append(t.directeur) | |
88 | except These.DoesNotExist: | |
89 | row.append('') | |
90 | row.append('') | |
91 | row.append(c.discipline.nom if c.discipline else '') | |
92 | row.append(c.theme_recherche) | |
93 | row.append(c.groupe_recherche) | |
94 | row.append(c.mots_cles) | |
95 | row.append(c.url_site_web) | |
96 | row.append(c.url_blog) | |
97 | row.append(c.url_reseau_social) | |
98 | if c.membre_instance_auf: | |
99 | row.append(', '.join([c.membre_instance_auf_nom, c.membre_instance_auf_fonction, c.membre_instance_auf_dates])) | |
100 | else: | |
101 | row.append('') | |
102 | if c.expert_oif: | |
103 | row.append(', '.join([c.expert_oif_details, c.expert_oif_dates])) | |
104 | else: | |
105 | row.append('') | |
106 | if c.membre_association_francophone: | |
107 | row.append(c.membre_association_francophone_details) | |
108 | else: | |
109 | row.append('') | |
110 | if c.membre_reseau_institutionnel: | |
111 | row.append(', '.join([c.membre_reseau_institutionnel_nom, c.membre_reseau_institutionnel_fonction, c.membre_reseau_institutionnel_dates])) | |
112 | else: | |
113 | row.append('') | |
114 | row.append('; '.join(', '.join([e.nom, e.date, e.organisme_demandeur]) for e in c.expertises.all())) | |
115 | if c.expertises_auf is None: | |
116 | row.append('') | |
117 | else: | |
118 | row.append('Oui' if c.expertises_auf else 'Non') | |
119 | row.append('; '.join(p.publication_affichage if p.publication_affichage else | |
120 | '%s, %s, %s, %s, %s, %s, %s pages.' % | |
121 | (p.auteurs, p.titre, p.revue, p.annee, p.editeur, p.lieu_edition, p.nb_pages) | |
122 | for p in c.publications.all())) | |
123 | data.append([smart_str(x) if x else '' for x in row]) | |
124 | return exportateur(headers, data, type, filename='chercheurs.%s' % type) | |
125 | ||
126 | def export_as_csv(self, request, queryset): | |
127 | return self.export(queryset, 'csv') | |
128 | export_as_csv.short_description = 'Export CSV' | |
129 | ||
130 | def export_as_ods(self, request, queryset): | |
131 | return self.export(queryset, 'ods') | |
132 | export_as_ods.short_description = 'Export ODS' | |
133 | ||
6f8d521e EMS |
134 | class ChercheurAdminQuerySet(ChercheurQuerySet): |
135 | ||
136 | def filter(self, *args, **kwargs): | |
137 | """Gère des filtres supplémentaires pour l'admin. | |
138 | ||
139 | C'est la seule façon que j'ai trouvée de contourner les mécanismes | |
140 | de recherche de l'admin.""" | |
6f8d521e EMS |
141 | pays = kwargs.pop('pays', None) |
142 | region = kwargs.pop('region', None) | |
15ceabe6 | 143 | nord_sud = kwargs.pop('nord_sud', None) |
6f8d521e | 144 | expert = kwargs.pop('expert', None) |
b1d4c7ac | 145 | qs = self |
6f8d521e | 146 | if pays is not None: |
15ceabe6 EMS |
147 | qs = qs.filter(Q(etablissement__pays=pays) | |
148 | (Q(etablissement=None) & Q(etablissement_autre_pays=pays))) | |
6f8d521e | 149 | elif region is not None: |
15ceabe6 EMS |
150 | qs = qs.filter(Q(etablissement__pays__region=region) | |
151 | (Q(etablissement=None) & Q(etablissement_autre_pays__region=region))) | |
152 | elif nord_sud is not None: | |
153 | qs = qs.filter(Q(etablissement__pays__nord_sud=nord_sud) | | |
154 | (Q(etablissement=None) & Q(etablissement_autre_pays__nord_sud=nord_sud))) | |
6f8d521e EMS |
155 | if expert is not None: |
156 | if expert in ['1', 1, True]: | |
157 | qs = qs.exclude(expertises=None) | |
158 | else: | |
159 | qs = qs.filter(expertises=None) | |
160 | ||
161 | return super(ChercheurAdminQuerySet, qs).filter(*args, **kwargs) | |
162 | ||
55ef8558 | 163 | admin.site.register(Chercheur, ChercheurAdmin) |
cbae0173 AJ |
164 | admin.site.register(Publication) |
165 | admin.site.register(Groupe) | |
166 |