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 | |
cbae0173 | 8 | |
81fe476e PP |
9 | from chercheurs.models import Chercheur, ChercheurVoir, Publication, \ |
10 | GroupeChercheur, DomaineRecherche, \ | |
66386d77 PP |
11 | AdhesionGroupe, ChercheurQuerySet |
12 | from chercheurs.utils import export | |
2094c7e5 | 13 | from savoirs.models import Search |
6f8d521e | 14 | |
55ef8558 | 15 | class 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 | |
71 | class 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 | ||
96 | admin.site.register(ChercheurVoir, ChercheurVoirAdmin) | |
97 | ||
6f8d521e EMS |
98 | class 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 | 128 | class 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 | 169 | class 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 | 218 | class 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 | |
224 | class 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 |
229 | class PublicationAdmin(admin.ModelAdmin): |
230 | search_fields = ('auteurs', 'titre', 'revue', 'editeur') | |
231 | ||
232 | ||
55ef8558 | 233 | admin.site.register(Chercheur, ChercheurAdmin) |
78399ad5 | 234 | admin.site.register(Publication, PublicationAdmin) |
cec3f8db PP |
235 | admin.site.register(GroupeChercheur, GroupeChercheurAdmin) |
236 | admin.site.register(DomaineRecherche, DomaineRechercheAdmin) | |
18407f73 | 237 | admin.site.register(AdhesionGroupe, AdhesionGroupeAdmin) |
cbae0173 | 238 |