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