Enleve duplication de code
[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
d264c787
EMS
8from django.utils.encoding import smart_str
9from django_exportateur.exportateur import exportateur
cbae0173 10
5b55252d 11from chercheurs.models import Chercheur, Publication, GroupeChercheur, DomaineRecherche, ChercheurGroupe, ChercheurQuerySet, These
6f8d521e 12
55ef8558 13class 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
147class 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
177class MemberInline(admin.TabularInline):
178 model = ChercheurGroupe
179
180
44e07248 181class BaseGroupeAdmin(admin.ModelAdmin):
cec3f8db 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 190
44e07248
PP
191class GroupeChercheurAdmin(BaseGroupeAdmin):
192 pass
193
194class DomaineRechercheAdmin(BaseGroupeAdmin):
195 pass
cec3f8db 196
55ef8558 197admin.site.register(Chercheur, ChercheurAdmin)
cbae0173 198admin.site.register(Publication)
cec3f8db
PP
199admin.site.register(GroupeChercheur, GroupeChercheurAdmin)
200admin.site.register(DomaineRecherche, DomaineRechercheAdmin)
cbae0173 201