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