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