Commit | Line | Data |
---|---|---|
df59fcab | 1 | # -*- encoding: utf-8 -*- |
2 | ||
6067184b | 3 | from django.core.urlresolvers import reverse |
4 | from django.http import HttpResponseRedirect | |
df59fcab | 5 | from django.contrib import admin |
38df74bb | 6 | from django.shortcuts import get_object_or_404 |
8e0d552d | 7 | from django.core.files.storage import default_storage |
3a542b85 | 8 | from django.forms.models import BaseInlineFormSet |
38df74bb | 9 | |
6067184b | 10 | from reversion.admin import VersionAdmin |
d333c690 | 11 | from datamaster_modeles.models import Implantation, Region, Bureau |
6067184b | 12 | |
e2968e84 | 13 | from project.rh import models as rh |
df59fcab | 14 | from recrutement.models import * |
3a542b85 NBV |
15 | from recrutement.workflow import grp_evaluateurs_recrutement, \ |
16 | grp_drh_recrutement, grp_directeurs_bureau_recrutement, \ | |
17 | grp_administrateurs_recrutement | |
a084e988 | 18 | from recrutement.forms import * |
df59fcab | 19 | |
30945e50 | 20 | from project.dae.utils import get_employe_from_user as get_emp |
3a542b85 | 21 | |
d333c690 NBV |
22 | IMPLANTATIONS_CENTRALES = [15, 19] |
23 | ||
b8b74dee NBV |
24 | class ProxyEvaluateur(Evaluateur.offres_emploi.through): |
25 | """ | |
26 | Ce proxy sert uniquement dans l'admin à disposer d'un libellé | |
27 | plus ergonomique. | |
28 | """ | |
29 | class Meta: | |
30 | proxy = True | |
31 | verbose_name = "évaluateur" | |
32 | ||
33 | class EvaluateurInline(admin.TabularInline): | |
34 | model = ProxyEvaluateur | |
35 | fields = ('evaluateur',) | |
36 | extra = 1 | |
37 | ||
d2b30f5f | 38 | class OffreEmploiAdmin(VersionAdmin): |
7f9e891e | 39 | date_hierarchy = 'date_creation' |
c281435b | 40 | list_display = ('nom', 'date_limite', 'region', 'statut', |
e2968e84 | 41 | 'est_affiche', '_candidatsList', ) |
7d0ae1ba NBV |
42 | exclude = ('actif', 'poste_nom', 'resume',) |
43 | list_filter = ('statut',) | |
c4874d66 | 44 | actions = ['affecter_evaluateurs_offre_emploi', ] |
a084e988 | 45 | form = OffreEmploiForm |
b8b74dee | 46 | inlines = [EvaluateurInline, ] |
2c3c54ee | 47 | |
a029f641 NBV |
48 | def get_actions(self, request): |
49 | actions = super(OffreEmploiAdmin, self).get_actions(request) | |
50 | del actions['delete_selected'] | |
540dfae4 | 51 | return actions |
a029f641 | 52 | |
c4874d66 NBV |
53 | # Affecter un évaluateurs à des offres d'emploi |
54 | def affecter_evaluateurs_offre_emploi(modeladmin, obj, candidats): | |
55 | selected = obj.POST.getlist(admin.ACTION_CHECKBOX_NAME) | |
56 | ||
57 | return HttpResponseRedirect(reverse('affecter_evaluateurs_offre_emploi')+ | |
58 | "?ids=%s" % (",".join(selected))) | |
59 | affecter_evaluateurs_offre_emploi.short_description = u'Affecter évaluateur(s)' | |
60 | ||
8941aee7 | 61 | # Afficher la liste des candidats pour l'offre d'emploi |
596fe324 | 62 | def _candidatsList(self, obj): |
8ea41642 | 63 | return "<a href='%s?offre_emploi__id__exact=%s'>Voir les candidats \ |
64 | </a>" % (reverse('admin:recrutement_candidat_changelist'), obj.id) | |
2f78949d | 65 | _candidatsList.allow_tags = True |
f6724c20 | 66 | _candidatsList.short_description = "Afficher la liste des candidats" |
362a3534 | 67 | |
3a542b85 NBV |
68 | def get_form(self, request, obj=None, **kwargs): |
69 | form = super(OffreEmploiAdmin, self).get_form(request, obj, **kwargs) | |
70 | employe = get_emp(request.user) | |
3a542b85 | 71 | user_groupes = request.user.groups.all() |
d333c690 NBV |
72 | |
73 | ### Region ### | |
74 | if form.declared_fields.has_key('region'): | |
75 | region_field = form.declared_fields['region'] | |
76 | else: | |
77 | region_field = form.base_fields['region'] | |
78 | ||
79 | if grp_drh_recrutement in user_groupes: | |
80 | region_field.queryset = Region.objects.all() | |
81 | else: | |
82 | region_field.queryset = Region.objects.\ | |
83 | filter(id=employe.implantation.region.id) | |
84 | ||
85 | ### Poste ### | |
86 | if form.declared_fields.has_key('poste'): | |
87 | poste_field = form.declared_fields['poste'] | |
88 | else: | |
89 | poste_field = form.base_fields['poste'] | |
90 | ||
91 | import pdb;pdb.set_trace() | |
92 | if grp_drh_recrutement in user_groupes: | |
93 | poste_field.queryset = rh.Poste.objects.all() | |
94 | else: | |
95 | poste_field.queryset = rh.Poste.objects.filter(implantation__region=employe.implantation.region).exclude(implantation__in=IMPLANTATIONS_CENTRALES) | |
96 | ||
97 | ### Bureau ### | |
98 | if form.declared_fields.has_key('bureau'): | |
99 | bureau_field = form.declared_fields['bureau'] | |
100 | else: | |
101 | bureau_field = form.base_fields['bureau'] | |
102 | ||
103 | if grp_drh_recrutement in user_groupes: | |
104 | bureau_field.queryset = Bureau.objects.all() | |
105 | else: | |
106 | bureau_field.queryset = Bureau.objects.filter(region=employe.implantation.region) | |
107 | ||
3a542b85 NBV |
108 | return form |
109 | ||
2f78949d | 110 | def queryset(self, request): |
382501c1 | 111 | qs = self.model._default_manager.get_query_set() |
f6724c20 NBV |
112 | # Si user est superuser afficher toutes les offres d'emploi |
113 | user_groupes = request.user.groups.all() | |
d46075cb | 114 | if not grp_drh_recrutement in user_groupes and \ |
3a542b85 NBV |
115 | not grp_directeurs_bureau_recrutement in user_groupes and \ |
116 | not grp_administrateurs_recrutement in user_groupes and \ | |
d46075cb | 117 | not request.user.is_superuser: |
beef7690 | 118 | """ |
beef7690 NBV |
119 | Si le user n'est ni un évaluateur ni un administrateur régional, |
120 | retourner none | |
121 | Vérifier groupes | |
122 | """ | |
f6724c20 | 123 | if grp_evaluateurs_recrutement in user_groupes: |
ca73c3c6 NBV |
124 | try: |
125 | user = Evaluateur.objects.get(user=request.user) | |
126 | except Evaluateur.DoesNotExist: | |
3a542b85 | 127 | return qs.none() |
f6724c20 NBV |
128 | else: |
129 | return qs.none() | |
130 | ||
beef7690 | 131 | if type(user) is Evaluateur: |
f6724c20 | 132 | candidats = [g for g in user.candidats.all()] |
beef7690 | 133 | offre_emploi_ids = [c.offre_emploi.id for c in candidats] |
f6724c20 | 134 | return qs.select_related('offre_emploi').\ |
beef7690 | 135 | filter(id__in=offre_emploi_ids) |
3bcef02d | 136 | return qs.none() |
382501c1 | 137 | return qs.select_related('offre_emploi') |
f6724c20 | 138 | |
3a542b85 NBV |
139 | def has_add_permission(self, request): |
140 | user_groupes = request.user.groups.all() | |
141 | if grp_drh_recrutement in user_groupes or \ | |
142 | grp_directeurs_bureau_recrutement in user_groupes or \ | |
143 | grp_administrateurs_recrutement in user_groupes or \ | |
144 | request.user.is_superuser: | |
145 | return True | |
146 | return False | |
147 | ||
f6724c20 NBV |
148 | def has_change_permission(self, request, obj=None): |
149 | user_groupes = request.user.groups.all() | |
150 | if grp_drh_recrutement in user_groupes or \ | |
3a542b85 | 151 | grp_directeurs_bureau_recrutement in user_groupes or \ |
d46075cb NBV |
152 | grp_administrateurs_recrutement in user_groupes or \ |
153 | request.user.is_superuser: | |
f6724c20 NBV |
154 | return True |
155 | return False | |
156 | ||
157 | class ProxyOffreEmploiAdmin(OffreEmploiAdmin): | |
4fd0c4a2 NBV |
158 | list_display = ('nom', 'resume', 'date_limite', 'region', 'statut', |
159 | 'est_affiche') | |
7d0ae1ba NBV |
160 | readonly_fields = ('description', 'bureau', 'duree_affectation', |
161 | 'renumeration', 'debut_affectation', 'lieu_affectation', | |
162 | 'nom', 'resume', 'date_limite', 'region') | |
f6724c20 | 163 | fieldsets = ( |
720c3ad5 | 164 | ('Nom', { |
f6724c20 NBV |
165 | 'fields': ('nom', ) |
166 | }), | |
720c3ad5 | 167 | ('Description générale', { |
14e06ff6 | 168 | 'fields': ('resume','description', 'date_limite', ) |
f6724c20 | 169 | }), |
720c3ad5 | 170 | ('Coordonnées', { |
f6724c20 NBV |
171 | 'fields': ('lieu_affectation', 'bureau', 'region', ) |
172 | }), | |
720c3ad5 | 173 | ('Autre', { |
f6724c20 NBV |
174 | 'fields': ('debut_affectation', 'duree_affectation', |
175 | 'renumeration', ) | |
176 | }), | |
177 | ) | |
464e5825 | 178 | inlines = [] |
b8778e64 NBV |
179 | def get_actions(self, request): |
180 | actions = super(ProxyOffreEmploiAdmin, self).get_actions(request) | |
181 | del actions['affecter_evaluateurs_offre_emploi'] | |
182 | return actions | |
183 | ||
a029f641 | 184 | def response_change(self, request, obj): |
464e5825 NBV |
185 | response = super(ProxyOffreEmploiAdmin, self).response_change(request, |
186 | obj) | |
a029f641 NBV |
187 | user_groupes = request.user.groups.all() |
188 | if grp_drh_recrutement in user_groupes or \ | |
3a542b85 NBV |
189 | grp_directeurs_bureau_recrutement in user_groupes or \ |
190 | grp_administrateurs_recrutement in user_groupes or \ | |
a029f641 | 191 | request.user.is_superuser: |
464e5825 NBV |
192 | return HttpResponseRedirect(reverse\ |
193 | ('admin:recrutement_offreemploi_changelist')) | |
194 | return HttpResponseRedirect(reverse\ | |
195 | ('admin:recrutement_proxyoffreemploi_changelist')) | |
a029f641 | 196 | |
f6724c20 NBV |
197 | def has_add_permission(self, request): |
198 | return False | |
199 | ||
200 | def has_delete_permission(self, request, obj=None): | |
201 | return False | |
202 | ||
2d083449 NBV |
203 | def has_change_permission(self, request, obj=None): |
204 | user_groupes = request.user.groups.all() | |
beef7690 | 205 | if grp_evaluateurs_recrutement in user_groupes or \ |
d46075cb | 206 | grp_drh_recrutement in user_groupes or \ |
3a542b85 NBV |
207 | grp_directeurs_bureau_recrutement in user_groupes or \ |
208 | grp_administrateurs_recrutement in user_groupes or \ | |
d46075cb | 209 | request.user.is_superuser: |
2d083449 NBV |
210 | return True |
211 | return False | |
212 | ||
572c8d08 NBV |
213 | class CandidatPieceInline(admin.TabularInline): |
214 | model = CandidatPiece | |
215 | fields = ('candidat', 'nom', 'path',) | |
216 | extra = 1 | |
217 | max_num = 3 | |
218 | ||
572c8d08 NBV |
219 | class CandidatEvaluationInlineFormSet(BaseInlineFormSet): |
220 | """ | |
221 | Empêche la suppression d'une évaluation pour le CandidatEvaluationInline | |
222 | """ | |
223 | def __init__(self, *args, **kwargs): | |
224 | super(CandidatEvaluationInlineFormSet, self).__init__(*args, **kwargs) | |
225 | self.can_delete = False | |
226 | ||
227 | class CandidatEvaluationInline(admin.TabularInline): | |
228 | model = CandidatEvaluation | |
229 | fields = ('evaluateur', 'note', 'commentaire') | |
230 | max_num = 0 | |
231 | extra = 0 | |
232 | formset = CandidatEvaluationInlineFormSet | |
233 | ||
234 | def get_readonly_fields(self, request, obj=None): | |
235 | """ | |
236 | Empêche la modification des évaluations | |
237 | """ | |
238 | if obj: | |
239 | return self.readonly_fields+('evaluateur', 'note', 'commentaire') | |
240 | return self.readonly_fields | |
241 | ||
d2b30f5f | 242 | class CandidatAdmin(VersionAdmin): |
7d0ae1ba | 243 | exclude = ('actif', ) |
7f9e891e | 244 | date_hierarchy = 'date_creation' |
0fd8a26d | 245 | list_display = ('nom', 'prenom', 'offre_emploi','statut', |
dc7faf2b NBV |
246 | 'voir_offre_emploi', 'calculer_moyenne', |
247 | 'afficher_candidat',) | |
8ea41642 | 248 | list_filter = ('offre_emploi', ) |
7d0ae1ba | 249 | |
7f9e891e | 250 | fieldsets = ( |
4896b661 | 251 | ("Offre d'emploi", { |
252 | 'fields': ('offre_emploi', ) | |
253 | }), | |
7f9e891e | 254 | ('Informations personnelles', { |
4fd0c4a2 | 255 | 'fields': ('prenom','nom','genre', 'nationalite', |
7f9e891e | 256 | 'situation_famille', 'nombre_dependant',) |
257 | }), | |
ec517164 | 258 | ('Coordonnées', { |
259 | 'fields': ('telephone', 'email', 'adresse', 'ville', | |
260 | 'etat_province', 'code_postal', 'pays', ) | |
7f9e891e | 261 | }), |
262 | ('Informations professionnelles', { | |
4896b661 | 263 | 'fields': ('niveau_diplome','employeur_actuel', |
8ea41642 | 264 | 'poste_actuel', 'domaine_professionnel',) |
7f9e891e | 265 | }), |
65c4cbd9 NBV |
266 | ('Traitement', { |
267 | 'fields': ('statut', ) | |
7f9e891e | 268 | }), |
269 | ) | |
170c9aa2 | 270 | inlines = [ |
271 | CandidatPieceInline, | |
572c8d08 | 272 | CandidatEvaluationInline, |
170c9aa2 | 273 | ] |
f9983b5a | 274 | |
540dfae4 | 275 | actions = ['envoyer_courriel_candidats'] |
a029f641 NBV |
276 | |
277 | def get_actions(self, request): | |
278 | actions = super(CandidatAdmin, self).get_actions(request) | |
279 | del actions['delete_selected'] | |
540dfae4 | 280 | return actions |
362a3534 | 281 | |
4e8340cf | 282 | # Envoyer un courriel à des candidats |
52765380 | 283 | def envoyer_courriel_candidats(modeladmin, obj, candidats): |
284 | selected = obj.POST.getlist(admin.ACTION_CHECKBOX_NAME) | |
285 | ||
32834000 | 286 | return HttpResponseRedirect(reverse('selectionner_template')+ |
52765380 | 287 | "?ids=%s" % (",".join(selected))) |
288 | envoyer_courriel_candidats.short_description = u'Envoyer courriel' | |
289 | ||
05503d56 | 290 | # Évaluer un candidat |
596fe324 | 291 | def evaluer_candidat(self, obj): |
dc7faf2b | 292 | return "<a href='%s?candidat__id__exact=%s'>Évaluer le candidat</a>" % \ |
beef7690 NBV |
293 | (reverse('admin:recrutement_candidatevaluation_changelist'), |
294 | obj.id) | |
596fe324 | 295 | evaluer_candidat.allow_tags = True |
beef7690 | 296 | evaluer_candidat.short_description = 'Évaluation' |
596fe324 | 297 | |
7d82fd33 | 298 | # Afficher un candidat |
299 | def afficher_candidat(self, obj): | |
382501c1 NBV |
300 | return "<a href='%s'>Voir le candidat</a>" % \ |
301 | (reverse('admin:recrutement_proxycandidat_change', args=(obj.id,))) | |
7d82fd33 | 302 | afficher_candidat.allow_tags = True |
8e0d552d | 303 | afficher_candidat.short_description = u'Détails du candidat' |
7d82fd33 | 304 | |
8941aee7 | 305 | # Voir l'offre d'emploi |
306 | def voir_offre_emploi(self, obj): | |
720c3ad5 NBV |
307 | return "<a href='%s'>Voir l'offre d'emploi</a>" % \ |
308 | (reverse('admin:recrutement_proxyoffreemploi_change', | |
309 | args=(obj.offre_emploi.id,))) | |
8941aee7 | 310 | voir_offre_emploi.allow_tags = True |
311 | voir_offre_emploi.short_description = "Afficher l'offre d'emploi" | |
312 | ||
8941aee7 | 313 | # Calculer la moyenne des notes |
314 | def calculer_moyenne(self, obj): | |
315 | evaluations = CandidatEvaluation.objects.filter(candidat=obj) | |
316 | offre_emploi = obj.offre_emploi | |
317 | ||
f6724c20 NBV |
318 | notes = [evaluation.note for evaluation in evaluations.all() \ |
319 | if evaluation.note is not None] | |
8941aee7 | 320 | |
7d0ae1ba | 321 | if len(notes) > 0: |
8941aee7 | 322 | moyenne_votes = float(sum(notes)) / len(notes) |
323 | else: | |
324 | moyenne_votes = "Non disponible" | |
325 | return moyenne_votes | |
326 | calculer_moyenne.allow_tags = True | |
327 | calculer_moyenne.short_description = "Moyenne des notes" | |
328 | ||
3a542b85 | 329 | def has_add_permission(self, request): |
f6724c20 NBV |
330 | user_groupes = request.user.groups.all() |
331 | if grp_drh_recrutement in user_groupes or \ | |
3a542b85 | 332 | grp_directeurs_bureau_recrutement in user_groupes or \ |
d46075cb NBV |
333 | grp_administrateurs_recrutement in user_groupes or \ |
334 | request.user.is_superuser: | |
f6724c20 | 335 | return True |
3a542b85 | 336 | return False |
4896b661 | 337 | |
f6724c20 | 338 | def has_delete_permission(self, request, obj=None): |
3a542b85 NBV |
339 | user_groupes = request.user.groups.all() |
340 | if grp_drh_recrutement in user_groupes or \ | |
341 | grp_directeurs_bureau_recrutement in user_groupes or \ | |
342 | grp_administrateurs_recrutement in user_groupes or \ | |
343 | request.user.is_superuser: | |
344 | return True | |
345 | return False | |
f6724c20 NBV |
346 | |
347 | def has_change_permission(self, request, obj=None): | |
348 | user_groupes = request.user.groups.all() | |
349 | if grp_drh_recrutement in user_groupes or \ | |
3a542b85 | 350 | grp_directeurs_bureau_recrutement in user_groupes or \ |
d46075cb NBV |
351 | grp_administrateurs_recrutement in user_groupes or \ |
352 | request.user.is_superuser: | |
f6724c20 NBV |
353 | return True |
354 | return False | |
4896b661 | 355 | |
d46075cb | 356 | def queryset(self, request): |
f9983b5a | 357 | """ |
8ea41642 | 358 | Spécifie un queryset limité, autrement Django exécute un |
359 | select_related() sans paramètre, ce qui a pour effet de charger tous | |
360 | les objets FK, sans limite de profondeur. Dès qu'on arrive, dans les | |
361 | modèles de Region, il existe plusieurs boucles, ce qui conduit à la | |
362 | génération d'une requête infinie. | |
d835c9f3 | 363 | |
f9983b5a | 364 | """ |
f6724c20 NBV |
365 | qs = self.model._default_manager.get_query_set() |
366 | # Si user est superuser afficher tous les candidats | |
d46075cb NBV |
367 | user_groupes = request.user.groups.all() |
368 | if not grp_drh_recrutement in user_groupes and \ | |
3a542b85 NBV |
369 | not grp_directeurs_bureau_recrutement in user_groupes and \ |
370 | not grp_administrateurs_recrutement in user_groupes and \ | |
d46075cb | 371 | not request.user.is_superuser: |
f6724c20 NBV |
372 | # Si le user n'est ni un évaluateur ni un administrateur régional, |
373 | # retourner none | |
374 | ||
375 | # Vérifier groupes | |
376 | if grp_evaluateurs_recrutement in user_groupes: | |
ca73c3c6 | 377 | try: |
2c3c54ee | 378 | user = Evaluateur.objects.get(user=request.user) |
ca73c3c6 NBV |
379 | except Evaluateur.DoesNotExist: |
380 | return qs.none() | |
f6724c20 NBV |
381 | else: |
382 | return qs.none() | |
f6724c20 NBV |
383 | ids = [c.id for c in user.candidats.all()] |
384 | return qs.select_related('candidats').filter(id__in=ids) | |
385 | return qs.select_related('candidats') | |
386 | ||
387 | class ProxyCandidatAdmin(CandidatAdmin): | |
f6724c20 | 388 | readonly_fields = ('statut', 'offre_emploi', 'prenom', 'nom', |
4fd0c4a2 NBV |
389 | 'genre', 'nationalite', 'situation_famille', |
390 | 'nombre_dependant', 'telephone', 'email', 'adresse', | |
391 | 'ville', 'etat_province', 'code_postal', 'pays', | |
392 | 'niveau_diplome', 'employeur_actuel', 'poste_actuel', | |
8e0d552d | 393 | 'domaine_professionnel', 'pieces_jointes',) |
2d083449 NBV |
394 | fieldsets = ( |
395 | ("Offre d'emploi", { | |
396 | 'fields': ('offre_emploi', ) | |
397 | }), | |
398 | ('Informations personnelles', { | |
4fd0c4a2 | 399 | 'fields': ('prenom','nom','genre', 'nationalite', |
2d083449 NBV |
400 | 'situation_famille', 'nombre_dependant',) |
401 | }), | |
402 | ('Coordonnées', { | |
403 | 'fields': ('telephone', 'email', 'adresse', 'ville', | |
404 | 'etat_province', 'code_postal', 'pays', ) | |
405 | }), | |
406 | ('Informations professionnelles', { | |
407 | 'fields': ('niveau_diplome','employeur_actuel', | |
408 | 'poste_actuel', 'domaine_professionnel',) | |
8e0d552d | 409 | }), |
2d083449 | 410 | ) |
f6724c20 | 411 | inlines = [] |
2d083449 | 412 | |
a029f641 NBV |
413 | def response_change(self, request, obj): |
414 | response = super(ProxyCandidatAdmin, self).response_change(request, obj) | |
415 | user_groupes = request.user.groups.all() | |
416 | if grp_drh_recrutement in user_groupes or \ | |
3a542b85 NBV |
417 | grp_directeurs_bureau_recrutement in user_groupes or \ |
418 | grp_administrateurs_recrutement in user_groupes or \ | |
a029f641 | 419 | request.user.is_superuser: |
464e5825 NBV |
420 | return HttpResponseRedirect(reverse\ |
421 | ('admin:recrutement_candidat_changelist')) | |
422 | return HttpResponseRedirect(reverse\ | |
423 | ('admin:recrutement_proxycandidat_changelist')) | |
a029f641 | 424 | |
f6724c20 NBV |
425 | def has_add_permission(self, request): |
426 | return False | |
427 | ||
428 | def has_delete_permission(self, request, obj=None): | |
429 | return False | |
2adf9e0c | 430 | |
2d083449 NBV |
431 | def has_change_permission(self, request, obj=None): |
432 | user_groupes = request.user.groups.all() | |
beef7690 | 433 | if grp_drh_recrutement in user_groupes or \ |
d46075cb | 434 | grp_evaluateurs_recrutement in user_groupes or \ |
3a542b85 NBV |
435 | grp_directeurs_bureau_recrutement in user_groupes or \ |
436 | grp_administrateurs_recrutement in user_groupes or \ | |
d46075cb | 437 | request.user.is_superuser: |
2d083449 NBV |
438 | return True |
439 | return False | |
440 | ||
2e9ee615 | 441 | class CandidatPieceAdmin(admin.ModelAdmin): |
170c9aa2 | 442 | list_display = ('nom', 'candidat', ) |
443 | ||
444 | def queryset(self, request): | |
445 | """ | |
446 | Spécifie un queryset limité, autrement Django exécute un | |
447 | select_related() sans paramètre, ce qui a pour effet de charger tous | |
448 | les objets FK, sans limite de profondeur. Dès qu'on arrive, dans les | |
449 | modèles de Region, il existe plusieurs boucles, ce qui conduit à la | |
450 | génération d'une requête infinie. | |
d835c9f3 | 451 | Affiche la liste de candidats que si le user connecté |
27c81d11 | 452 | possède un Evaluateur |
170c9aa2 | 453 | """ |
454 | qs = self.model._default_manager.get_query_set() | |
455 | return qs.select_related('candidat') | |
2e9ee615 | 456 | |
d2b30f5f | 457 | class EvaluateurAdmin(VersionAdmin): |
eb579d40 | 458 | fieldsets = ( |
540dfae4 NBV |
459 | ("Utilisateur", { |
460 | 'fields': ('user',) | |
461 | }), | |
462 | ("Offres d'emploi à évaluer", { | |
463 | 'fields': ('offres_emploi',) | |
464 | }), | |
eb579d40 | 465 | ) |
4418c732 | 466 | |
a029f641 NBV |
467 | def get_actions(self, request): |
468 | actions = super(EvaluateurAdmin, self).get_actions(request) | |
469 | del actions['delete_selected'] | |
540dfae4 | 470 | return actions |
a029f641 | 471 | |
b89fef74 | 472 | class AdministrateurRegionalAdmin(VersionAdmin): |
27c81d11 | 473 | pass |
474 | ||
d2b30f5f | 475 | class CandidatEvaluationAdmin(VersionAdmin): |
2c3c54ee | 476 | list_display = ('_candidat', '_offre_emploi', 'evaluateur', '_note', |
b903198b | 477 | '_commentaire', ) |
beef7690 NBV |
478 | readonly_fields = ('candidat', 'evaluateur') |
479 | fieldsets = ( | |
480 | ('Évaluation du candidat', { | |
481 | 'fields': ('candidat', 'evaluateur', 'note', 'commentaire', ) | |
482 | }), | |
483 | ) | |
484 | ||
a029f641 NBV |
485 | def get_actions(self, request): |
486 | actions = super(CandidatEvaluationAdmin, self).get_actions(request) | |
487 | del actions['delete_selected'] | |
540dfae4 | 488 | return actions |
a029f641 | 489 | |
beef7690 NBV |
490 | def _note(self, obj): |
491 | """ | |
492 | Si l'évaluateur n'a pas encore donné de note au candidat, indiquer | |
493 | un lien pour Évaluer le candidat. | |
494 | Sinon afficher la note. | |
495 | """ | |
496 | if obj.note is None: | |
b903198b | 497 | return "<a href='%s'>Candidat non évalué</a>" % \ |
beef7690 | 498 | (reverse('admin:recrutement_candidatevaluation_change', |
7d0ae1ba | 499 | args=(obj.id,))) |
b903198b NBV |
500 | return "<a href='%s'>%s</a>" % \ |
501 | (reverse('admin:recrutement_candidatevaluation_change', | |
502 | args=(candidat_evaluation.id,)), obj.note) | |
beef7690 | 503 | _note.allow_tags = True |
7d0ae1ba | 504 | _note.short_description = "Note" |
beef7690 NBV |
505 | _note.admin_order_field = 'note' |
506 | ||
507 | def _candidat(self, obj): | |
508 | return "<a href='%s'>%s</a>" \ | |
509 | % (reverse('admin:recrutement_proxycandidat_change', | |
510 | args=(obj.candidat.id,)), obj.candidat) | |
511 | _candidat.allow_tags = True | |
512 | _candidat.short_description = 'Candidat' | |
513 | ||
514 | def _commentaire(self, obj): | |
515 | """ | |
516 | Si l'évaluateur n'a pas encore donné de note au candidat, indiquer | |
517 | dans le champ commentaire, Aucun au lieu de (None) | |
518 | Sinon afficher la note. | |
519 | """ | |
520 | if obj.commentaire is None: | |
521 | return "Aucun" | |
522 | return obj.commentaire | |
523 | _commentaire.allow_tags = True | |
524 | _commentaire.short_description = "Commentaire" | |
720c3ad5 | 525 | |
720c3ad5 | 526 | |
beef7690 NBV |
527 | def _offre_emploi(self, obj): |
528 | return "<a href='%s'>%s</a>" % \ | |
529 | (reverse('admin:recrutement_proxyoffreemploi_change', | |
dc7faf2b | 530 | args=(obj.candidat.offre_emploi.id,)), obj.candidat.offre_emploi) |
beef7690 NBV |
531 | _offre_emploi.allow_tags = True |
532 | _offre_emploi.short_description = "Voir offre d'emploi" | |
beef7690 | 533 | |
21b02da5 NBV |
534 | def has_change_permission(self, request, obj=None): |
535 | """ | |
536 | Permettre la visualisation dans la changelist | |
537 | mais interdire l'accès à modifier l'objet si l'évaluateur n'est pas | |
538 | le request.user | |
539 | """ | |
540 | return obj is None or request.user == obj.evaluateur.user | |
541 | ||
720c3ad5 | 542 | def queryset(self, request): |
beef7690 NBV |
543 | """ |
544 | Afficher uniquement les évaluations de l'évaluateur, sauf si | |
545 | l'utilisateur est super admin. | |
546 | """ | |
720c3ad5 | 547 | qs = self.model._default_manager.get_query_set() |
beef7690 | 548 | user_groupes = request.user.groups.all() |
3a542b85 NBV |
549 | if grp_drh_recrutement in user_groupes or \ |
550 | grp_directeurs_bureau_recrutement in user_groupes or \ | |
551 | grp_administrateurs_recrutement in user_groupes or \ | |
d46075cb | 552 | request.user.is_superuser: |
beef7690 NBV |
553 | return qs.select_related('offre_emploi') |
554 | ||
ca73c3c6 | 555 | try: |
d069cdf1 | 556 | evaluateur = Evaluateur.objects.get(user=request.user) |
ca73c3c6 NBV |
557 | except Evaluateur.DoesNotExist: |
558 | return qs.none() | |
559 | ||
560 | candidats_evaluations = CandidatEvaluation.objects.\ | |
561 | filter(evaluateur=evaluateur) | |
562 | candidats_evaluations_ids = [ce.id for ce in \ | |
563 | candidats_evaluations.all()] | |
564 | return qs.select_related('offre_emploi').\ | |
565 | filter(id__in=candidats_evaluations_ids) | |
596fe324 | 566 | |
4e8340cf | 567 | class CourrielTemplateAdmin(VersionAdmin): |
a029f641 NBV |
568 | def get_actions(self, request): |
569 | actions = super(CourrielTemplateAdmin, self).get_actions(request) | |
570 | del actions['delete_selected'] | |
540dfae4 | 571 | return actions |
4e8340cf | 572 | |
df59fcab | 573 | admin.site.register(OffreEmploi, OffreEmploiAdmin) |
382501c1 | 574 | admin.site.register(ProxyOffreEmploi, ProxyOffreEmploiAdmin) |
df59fcab | 575 | admin.site.register(Candidat, CandidatAdmin) |
382501c1 | 576 | admin.site.register(ProxyCandidat, ProxyCandidatAdmin) |
720c3ad5 | 577 | admin.site.register(CandidatEvaluation, CandidatEvaluationAdmin) |
27c81d11 | 578 | admin.site.register(Evaluateur, EvaluateurAdmin) |
beef7690 | 579 | #admin.site.register(AdministrateurRegional, AdministrateurRegionalAdmin) |
32834000 | 580 | admin.site.register(CourrielTemplate, CourrielTemplateAdmin) |