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