[#3091] Utiliser django.contrib.messages
[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
7b0b2f96 8from django.contrib.auth.models import User
cbae0173 9
81fe476e
PP
10from chercheurs.models import Chercheur, ChercheurVoir, Publication, \
11 GroupeChercheur, DomaineRecherche, \
dca3ff65
PP
12 AdhesionGroupe, ChercheurQuerySet, \
13 AdhesionCommunaute, AdhesionDomaineRecherche, \
549417d6
PP
14 Groupe, Message
15
66386d77 16from chercheurs.utils import export
2094c7e5 17from savoirs.models import Search
6f8d521e 18
55ef8558 19class ChercheurAdmin(admin.ModelAdmin):
6f8d521e 20 list_filter = ['genre']
b1d4c7ac
PP
21 alphabet_filter = 'nom'
22 alphabet_filter_table = 'chercheurs_personne'
23 DEFAULT_ALPHABET = ''
24
d264c787 25 actions = ('remove_from_group', 'export_as_ods', 'export_as_csv')
62354bdb 26 search_fields = ('nom', 'prenom')
cbae0173 27
8afac00d
PP
28 exclude = ('user',)
29
afc30c28 30 def lookup_allowed(self, lookup, value):
6f8d521e
EMS
31 return lookup in ['genre', 'statut', 'membre_reseau_institutionnel',
32 'membre_instance_auf', 'discipline', 'region', 'pays',
b1d4c7ac 33 'groupes', 'nord_sud'] or \
afc30c28 34 admin.ModelAdmin.lookup_allowed(self, lookup, value)
c0d2903e 35
55ef8558
EMS
36 def remove_from_group(self, request, queryset):
37 groupe_id = request.GET.get('groupes__id__exact')
38 chercheur_ids = queryset.values_list('id', flat=True)
18407f73 39 matches = AdhesionGroupe.objects.filter(groupe=groupe_id, chercheur__in=chercheur_ids)
55ef8558
EMS
40 matches.delete()
41 return HttpResponseRedirect(url('admin:chercheurs_chercheur_changelist') + '?groupes__id__exact=' + groupe_id)
42
43 def get_actions(self, request):
44 actions = super(ChercheurAdmin, self).get_actions(request)
45
35b0778c 46 # Si on filtre par groupes, offrir d'en retirer les
55ef8558
EMS
47 # chercheurs sélectionnés.
48 groupe_id = request.GET.get('groupes__id__exact')
49 if groupe_id:
50 groupe = Groupe.objects.get(id=groupe_id)
51 action_desc = actions['remove_from_group']
e7b9234a 52 actions['remove_from_group'] = (action_desc[0], action_desc[1], u'Retirer du domaine de recherche « %s »' % groupe.nom)
55ef8558
EMS
53 else:
54 del actions['remove_from_group']
55 return actions
56
6f8d521e 57 def queryset(self, request):
120891b9 58 return ChercheurAdminQuerySet(Chercheur).filter(actif=True)
6f8d521e 59
ee2ef0e8
EMS
60 def get_object(self, request, object_id):
61 """On doit réimplémenter cette méthode à cause de ce qu'on fait avec "initial" dans la méthode queryset()."""
62 try:
63 return Chercheur.objects.get(id=object_id)
64 except Chercheur.DoesNotExist:
65 return None
66
a5891f39
PP
67 def has_add_permission(self, request, obj=None):
68 return False
d264c787
EMS
69
70 def export_as_csv(self, request, queryset):
66386d77 71 return export(queryset, 'csv')
d264c787
EMS
72 export_as_csv.short_description = 'Export CSV'
73
74 def export_as_ods(self, request, queryset):
66386d77 75 return export(queryset, 'ods')
d264c787
EMS
76 export_as_ods.short_description = 'Export ODS'
77
81fe476e
PP
78
79class ChercheurVoirAdmin(ChercheurAdmin):
80
81 list_editable = []
82 fields = ['salutation', 'nom', 'prenom', 'courriel', 'afficher_courriel',
83 'fonction', 'date_naissance', 'sousfonction', 'telephone',
84 'adresse_postale', 'genre', 'commentaire',
85
86 'nationalite', 'statut', 'diplome', 'etablissement',
87 'etablissement_autre_nom', 'etablissement_autre_pays',
88 'attestation', 'thematique', 'mots_cles', 'discipline',
35b0778c 89 'theme_recherche', 'equipe_recherche', 'url_site_web',
81fe476e
PP
90 'url_blog', 'url_reseau_social',
91 'membre_instance_auf', 'membre_instance_auf_nom',
92 'membre_instance_auf_fonction', 'membre_instance_auf_dates',
93 'expert_oif', 'expert_oif_details', 'expert_oif_dates',
94 'membre_association_francophone', 'membre_association_francophone_details',
95 'membre_reseau_institutionnel', 'membre_reseau_institutionnel_nom',
96 'membre_reseau_institutionnel_fonction', 'membre_reseau_institutionnel_dates',
97 'expertises_auf']
98
99 def __init__(self, model, admin_site):
100 super(ChercheurVoirAdmin, self).__init__(model, admin_site)
101 self.readonly_fields = self.fields
102
103
104admin.site.register(ChercheurVoir, ChercheurVoirAdmin)
105
6f8d521e
EMS
106class ChercheurAdminQuerySet(ChercheurQuerySet):
107
120891b9
PP
108 def delete(self):
109 self.update(actif=False)
110
6f8d521e
EMS
111 def filter(self, *args, **kwargs):
112 """Gère des filtres supplémentaires pour l'admin.
113
114 C'est la seule façon que j'ai trouvée de contourner les mécanismes
115 de recherche de l'admin."""
6f8d521e
EMS
116 pays = kwargs.pop('pays', None)
117 region = kwargs.pop('region', None)
15ceabe6 118 nord_sud = kwargs.pop('nord_sud', None)
6f8d521e 119 expert = kwargs.pop('expert', None)
b1d4c7ac 120 qs = self
6f8d521e 121 if pays is not None:
15ceabe6
EMS
122 qs = qs.filter(Q(etablissement__pays=pays) |
123 (Q(etablissement=None) & Q(etablissement_autre_pays=pays)))
6f8d521e 124 elif region is not None:
15ceabe6
EMS
125 qs = qs.filter(Q(etablissement__pays__region=region) |
126 (Q(etablissement=None) & Q(etablissement_autre_pays__region=region)))
127 elif nord_sud is not None:
128 qs = qs.filter(Q(etablissement__pays__nord_sud=nord_sud) |
129 (Q(etablissement=None) & Q(etablissement_autre_pays__nord_sud=nord_sud)))
6f8d521e
EMS
130 if expert is not None:
131 if expert in ['1', 1, True]:
132 qs = qs.exclude(expertises=None)
133 else:
134 qs = qs.filter(expertises=None)
135
136 return super(ChercheurAdminQuerySet, qs).filter(*args, **kwargs)
137
cec3f8db 138
18407f73 139class AdhesionGroupeAdmin(admin.ModelAdmin):
e92dbca5 140 list_filter = ('groupe','statut')
61c05759
PP
141 list_display = ('groupe', 'chercheur', 'statut')
142 list_editable = ('statut',)
5cba4157 143 search_fields = ('chercheur__nom', 'chercheur__prenom')
4ef9751d 144
b0db5c3e
PP
145 alphabet_filter = 'chercheur__nom'
146 DEFAULT_ALPHABET = ''
147
1fd4a630
PP
148 actions = ['assigner_cgstatut']
149
b0db5c3e
PP
150
151 def lookup_allowed(self, lookup, value):
152 return lookup in ['chercheur__nom__istartswith'] or \
153 admin.ModelAdmin.lookup_allowed(self, lookup, value)
154
4ef9751d 155 def queryset(self, request):
18407f73 156 qs = super(AdhesionGroupeAdmin, self).queryset(request)
4ef9751d 157
18407f73 158 if not request.user.is_superuser and not request.user.has_perm('chercheurs.change_adhesiongroupe'):
4ef9751d
PP
159 qs = qs.filter(groupe__responsables=request.user)
160
161 return qs
162
163 def has_change_permission(self, request, obj=None):
164
165 if not obj:
166 if request.user.responsable_groupe.count():
167 return True
168 else:
169 if request.user in obj.groupe.responsables.all():
170 return True
171
18407f73 172 return super(AdhesionGroupeAdmin, self).has_change_permission(request, obj)
4ef9751d 173
1fd4a630
PP
174 def assigner_cgstatut(self, request, queryset):
175 selected = request.POST.getlist(admin.ACTION_CHECKBOX_NAME)
176 return HttpResponseRedirect("/admin/assigner_%s?ids=%s" % ('cgstatut', ",".join(selected)))
177 assigner_cgstatut.short_description = u'Assigner un statut'
178
6d5279ff 179
dca3ff65
PP
180class AdhesionCommunauteAdmin(AdhesionGroupeAdmin):
181 pass
182
183
184class AdhesionDomaineRechercheAdmin(AdhesionGroupeAdmin):
185 pass
186
44e07248 187class BaseGroupeAdmin(admin.ModelAdmin):
b803eb99 188 search_fields = ['nom']
6d5279ff 189 fieldsets = (
0c0d997c
PP
190 (('Options générales'), {'fields': ('nom', 'url', 'liste_diffusion',
191 'bulletin', 'page_accueil')}),
34d0147e 192 (('Gestionnaire de communauté'), {'fields': ('responsables',)}),
2094c7e5 193 (('Recherches prédéfinies'), {'fields': ('recherches',)}),
6d5279ff 194 )
cec3f8db 195
0c0d997c
PP
196 class Media:
197 js = ['js/tiny_mce/tiny_mce.js', 'js/tiny_mce_textareas.js']
198
734b288c
PP
199 def save_model(self, request, obj, form, change):
200 responsables = form.cleaned_data['responsables']
201 for user in responsables:
202 user.is_staff = True
203 user.save()
204
2094c7e5 205 if not request.user.is_superuser:
a26d89c9
EMS
206 recherches = obj.recherches.exclude(user=request.user)
207 form.cleaned_data['recherches'] = set(form.cleaned_data['recherches']) | set(recherches)
2094c7e5 208
734b288c
PP
209 super(BaseGroupeAdmin, self).save_model(request, obj, form, change)
210
4a7399ee
PP
211 def queryset(self, request):
212 qs = super(BaseGroupeAdmin, self).queryset(request)
213
f522cbdf 214 if not request.user.is_superuser and not request.user.has_perm('chercheurs.change_groupechercheur'):
85f53a92
PP
215 qs = qs.filter(responsables=request.user)
216
217 return qs
4a7399ee
PP
218
219 def has_change_permission(self, request, obj=None, groupe_chercheur=False):
220
221 if not obj:
222 if request.user.responsable_groupe.filter(groupe_chercheur=groupe_chercheur).count():
223 return True
224 else:
225 if request.user in obj.responsables.all():
226 return True
227
228 return super(BaseGroupeAdmin, self).has_change_permission(request, obj)
734b288c 229
2094c7e5
PP
230 def formfield_for_manytomany(self, db_field, request, **kwargs):
231 if db_field.name == "recherches" and not request.user.is_superuser:
232 kwargs["queryset"] = Search.objects.filter(user=request.user)
233 return db_field.formfield(**kwargs)
7b0b2f96
PP
234
235 if db_field.name == "responsables":
236 kwargs["queryset"] = User.objects.all().order_by('username')
237 return db_field.formfield(**kwargs)
238
2094c7e5
PP
239 return super(BaseGroupeAdmin, self).formfield_for_manytomany(db_field, request, **kwargs)
240
241
44e07248 242class GroupeChercheurAdmin(BaseGroupeAdmin):
4a7399ee
PP
243
244 def has_change_permission(self, request, obj=None):
245 return super(GroupeChercheurAdmin, self).has_change_permission(request, obj, groupe_chercheur=True)
246
44e07248
PP
247
248class DomaineRechercheAdmin(BaseGroupeAdmin):
4a7399ee
PP
249
250 def has_change_permission(self, request, obj=None):
251 return super(DomaineRechercheAdmin, self).has_change_permission(request, obj, groupe_chercheur=False)
cec3f8db 252
549417d6
PP
253
254class MessageAdmin(admin.ModelAdmin):
255 list_filter = ('groupe',)
256
257
78399ad5
PP
258class PublicationAdmin(admin.ModelAdmin):
259 search_fields = ('auteurs', 'titre', 'revue', 'editeur')
260
261
55ef8558 262admin.site.register(Chercheur, ChercheurAdmin)
78399ad5 263admin.site.register(Publication, PublicationAdmin)
cec3f8db
PP
264admin.site.register(GroupeChercheur, GroupeChercheurAdmin)
265admin.site.register(DomaineRecherche, DomaineRechercheAdmin)
dca3ff65
PP
266admin.site.register(AdhesionCommunaute, AdhesionCommunauteAdmin)
267admin.site.register(AdhesionDomaineRecherche, AdhesionDomaineRechercheAdmin)
549417d6 268admin.site.register(Message, MessageAdmin)
cbae0173 269