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