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