migration
[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):
f1ea8529 230 search_fields = ('nom', 'prenom' )
7d0ae1ba 231 exclude = ('actif', )
940c9dd8
OL
232 list_editable = ('statut', )
233 list_display = ('nom', 'prenom', 'offre_emploi',
234 'voir_offre_emploi', 'calculer_moyenne',
235 'afficher_candidat', '_date_creation', 'statut', )
236 list_filter = ('offre_emploi', 'offre_emploi__region', 'statut', )
7d0ae1ba 237
7f9e891e 238 fieldsets = (
4896b661 239 ("Offre d'emploi", {
240 'fields': ('offre_emploi', )
241 }),
7f9e891e 242 ('Informations personnelles', {
4fd0c4a2 243 'fields': ('prenom','nom','genre', 'nationalite',
7f9e891e 244 'situation_famille', 'nombre_dependant',)
245 }),
ec517164 246 ('Coordonnées', {
247 'fields': ('telephone', 'email', 'adresse', 'ville',
248 'etat_province', 'code_postal', 'pays', )
7f9e891e 249 }),
250 ('Informations professionnelles', {
4896b661 251 'fields': ('niveau_diplome','employeur_actuel',
8ea41642 252 'poste_actuel', 'domaine_professionnel',)
7f9e891e 253 }),
65c4cbd9
NBV
254 ('Traitement', {
255 'fields': ('statut', )
7f9e891e 256 }),
257 )
170c9aa2 258 inlines = [
259 CandidatPieceInline,
572c8d08 260 CandidatEvaluationInline,
170c9aa2 261 ]
f9983b5a 262
540dfae4 263 actions = ['envoyer_courriel_candidats']
a029f641 264
940c9dd8
OL
265 def _date_creation(self, obj):
266 return obj.date_creation
267 _date_creation.order_field = "date_creation"
268 _date_creation.short_description = "Date de création"
269
7d9736ba 270 ### Actions à afficher
a029f641
NBV
271 def get_actions(self, request):
272 actions = super(CandidatAdmin, self).get_actions(request)
273 del actions['delete_selected']
540dfae4 274 return actions
362a3534 275
7d9736ba 276 ### Envoyer un courriel à des candidats
52765380 277 def envoyer_courriel_candidats(modeladmin, obj, candidats):
278 selected = obj.POST.getlist(admin.ACTION_CHECKBOX_NAME)
279
32834000 280 return HttpResponseRedirect(reverse('selectionner_template')+
52765380 281 "?ids=%s" % (",".join(selected)))
282 envoyer_courriel_candidats.short_description = u'Envoyer courriel'
283
7d9736ba 284 ### Évaluer un candidat
596fe324 285 def evaluer_candidat(self, obj):
dc7faf2b 286 return "<a href='%s?candidat__id__exact=%s'>Évaluer le candidat</a>" % \
beef7690
NBV
287 (reverse('admin:recrutement_candidatevaluation_changelist'),
288 obj.id)
596fe324 289 evaluer_candidat.allow_tags = True
beef7690 290 evaluer_candidat.short_description = 'Évaluation'
596fe324 291
7d9736ba 292 ### Afficher un candidat
7d82fd33 293 def afficher_candidat(self, obj):
382501c1
NBV
294 return "<a href='%s'>Voir le candidat</a>" % \
295 (reverse('admin:recrutement_proxycandidat_change', args=(obj.id,)))
7d82fd33 296 afficher_candidat.allow_tags = True
8e0d552d 297 afficher_candidat.short_description = u'Détails du candidat'
7d82fd33 298
7d9736ba 299 ### Voir l'offre d'emploi
8941aee7 300 def voir_offre_emploi(self, obj):
720c3ad5
NBV
301 return "<a href='%s'>Voir l'offre d'emploi</a>" % \
302 (reverse('admin:recrutement_proxyoffreemploi_change',
303 args=(obj.offre_emploi.id,)))
8941aee7 304 voir_offre_emploi.allow_tags = True
305 voir_offre_emploi.short_description = "Afficher l'offre d'emploi"
306
7d9736ba 307 ### Calculer la moyenne des notes
8941aee7 308 def calculer_moyenne(self, obj):
309 evaluations = CandidatEvaluation.objects.filter(candidat=obj)
8941aee7 310
940c9dd8 311 notes = [evaluation.note for evaluation in evaluations \
f6724c20 312 if evaluation.note is not None]
8941aee7 313
7d0ae1ba 314 if len(notes) > 0:
8941aee7 315 moyenne_votes = float(sum(notes)) / len(notes)
316 else:
317 moyenne_votes = "Non disponible"
940c9dd8
OL
318
319 totales = len(evaluations)
320 faites = len(notes)
321
322 if obj.statut == 'REC':
323 if totales == faites:
324 color = "green"
325 elif faites > 0 and float(totales) / float(faites) >= 2:
326 color = "orange"
327 else:
328 color = "red"
329 else:
330 color = "black"
331
332 return """<span style="color: %s;">%s (%s/%s)</span>""" % (color, moyenne_votes, faites, totales)
8941aee7 333 calculer_moyenne.allow_tags = True
940c9dd8 334 calculer_moyenne.short_description = "Notation"
8941aee7 335
7d9736ba 336 ### Permissions add, delete, change
3a542b85 337 def has_add_permission(self, request):
f6724c20 338 user_groupes = request.user.groups.all()
26add0fd
OL
339 if request.user.is_superuser is True or \
340 grp_drh_recrutement in user_groupes or \
3a542b85 341 grp_directeurs_bureau_recrutement in user_groupes or \
7d9736ba 342 grp_administrateurs_recrutement in user_groupes:
f6724c20 343 return True
3a542b85 344 return False
4896b661 345
f6724c20 346 def has_delete_permission(self, request, obj=None):
3a542b85 347 user_groupes = request.user.groups.all()
26add0fd
OL
348 if request.user.is_superuser is True or \
349 grp_drh_recrutement in user_groupes or \
3a542b85 350 grp_directeurs_bureau_recrutement in user_groupes or \
7d9736ba 351 grp_administrateurs_recrutement in user_groupes:
3a542b85
NBV
352 return True
353 return False
f6724c20
NBV
354
355 def has_change_permission(self, request, obj=None):
356 user_groupes = request.user.groups.all()
26add0fd 357 if request.user.is_superuser is True or \
940c9dd8 358 grp_correspondants_rh_recrutement in user_groupes or \
26add0fd 359 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 \
940c9dd8 381 grp_correspondants_rh_recrutement in user_groupes or \
7d9736ba
NBV
382 grp_administrateurs_recrutement in user_groupes:
383 employe = get_emp(request.user)
384 return qs.select_related('candidats').\
940c9dd8 385 filter(offre_emploi__region=employe.implantation.region)
7d9736ba
NBV
386
387 if grp_evaluateurs_recrutement in user_groupes:
940c9dd8
OL
388 evaluateur = Evaluateur.objects.get(user=request.user)
389 candidat_ids = [e.candidat.id for e in
390 CandidatEvaluation.objects.filter(evaluateur=evaluateur)]
7d9736ba
NBV
391 return qs.select_related('candidats').filter(id__in=candidat_ids)
392 return qs.none()
f6724c20 393
613e8dfe 394
f6724c20 395class ProxyCandidatAdmin(CandidatAdmin):
940c9dd8 396 list_editable = ()
f6724c20 397 readonly_fields = ('statut', 'offre_emploi', 'prenom', 'nom',
4fd0c4a2
NBV
398 'genre', 'nationalite', 'situation_famille',
399 'nombre_dependant', 'telephone', 'email', 'adresse',
400 'ville', 'etat_province', 'code_postal', 'pays',
401 'niveau_diplome', 'employeur_actuel', 'poste_actuel',
8e0d552d 402 'domaine_professionnel', 'pieces_jointes',)
2d083449
NBV
403 fieldsets = (
404 ("Offre d'emploi", {
405 'fields': ('offre_emploi', )
406 }),
407 ('Informations personnelles', {
4fd0c4a2 408 'fields': ('prenom','nom','genre', 'nationalite',
2d083449
NBV
409 'situation_famille', 'nombre_dependant',)
410 }),
411 ('Coordonnées', {
412 'fields': ('telephone', 'email', 'adresse', 'ville',
413 'etat_province', 'code_postal', 'pays', )
414 }),
415 ('Informations professionnelles', {
416 'fields': ('niveau_diplome','employeur_actuel',
417 'poste_actuel', 'domaine_professionnel',)
8e0d552d 418 }),
2d083449 419 )
44a4689c 420 inlines = ()
2d083449 421
7d9736ba 422 ### Lieu de redirection après le change
a029f641
NBV
423 def response_change(self, request, obj):
424 response = super(ProxyCandidatAdmin, self).response_change(request, obj)
425 user_groupes = request.user.groups.all()
464e5825
NBV
426 return HttpResponseRedirect(reverse\
427 ('admin:recrutement_proxycandidat_changelist'))
a029f641 428
7d9736ba 429 ### Permissions add, delete, change
f6724c20
NBV
430 def has_add_permission(self, request):
431 return False
432
433 def has_delete_permission(self, request, obj=None):
434 return False
2adf9e0c 435
2d083449
NBV
436 def has_change_permission(self, request, obj=None):
437 user_groupes = request.user.groups.all()
26add0fd
OL
438 if request.user.is_superuser is True or \
439 grp_drh_recrutement in user_groupes or \
d46075cb 440 grp_evaluateurs_recrutement in user_groupes or \
3a542b85 441 grp_directeurs_bureau_recrutement in user_groupes or \
7d9736ba 442 grp_administrateurs_recrutement in user_groupes:
2d083449
NBV
443 return True
444 return False
445
2e9ee615 446class CandidatPieceAdmin(admin.ModelAdmin):
170c9aa2 447 list_display = ('nom', 'candidat', )
448
7d9736ba 449 ### Queryset
170c9aa2 450 def queryset(self, request):
451 """
452 Spécifie un queryset limité, autrement Django exécute un
453 select_related() sans paramètre, ce qui a pour effet de charger tous
454 les objets FK, sans limite de profondeur. Dès qu'on arrive, dans les
455 modèles de Region, il existe plusieurs boucles, ce qui conduit à la
456 génération d'une requête infinie.
d835c9f3 457 Affiche la liste de candidats que si le user connecté
27c81d11 458 possède un Evaluateur
170c9aa2 459 """
460 qs = self.model._default_manager.get_query_set()
461 return qs.select_related('candidat')
2e9ee615 462
d2b30f5f 463class EvaluateurAdmin(VersionAdmin):
eb579d40 464 fieldsets = (
540dfae4
NBV
465 ("Utilisateur", {
466 'fields': ('user',)
467 }),
eb579d40 468 )
4418c732 469
7d9736ba 470 ### Actions à afficher
a029f641
NBV
471 def get_actions(self, request):
472 actions = super(EvaluateurAdmin, self).get_actions(request)
473 del actions['delete_selected']
540dfae4 474 return actions
a029f641 475
7d9736ba
NBV
476 ### Permissions add, delete, change
477 def has_add_permission(self, request):
478 user_groupes = request.user.groups.all()
26add0fd
OL
479 if request.user.is_superuser is True or \
480 grp_drh_recrutement in user_groupes or \
7d9736ba
NBV
481 grp_directeurs_bureau_recrutement in user_groupes or \
482 grp_administrateurs_recrutement in user_groupes:
483 return True
484 return False
485
486 def has_delete_permission(self, request, obj=None):
487 user_groupes = request.user.groups.all()
26add0fd
OL
488 if request.user.is_superuser is True or \
489 grp_drh_recrutement in user_groupes or \
7d9736ba
NBV
490 grp_directeurs_bureau_recrutement in user_groupes or \
491 grp_administrateurs_recrutement in user_groupes:
492 return True
493 return False
494
495 def has_change_permission(self, request, obj=None):
496 user_groupes = request.user.groups.all()
26add0fd
OL
497 if request.user.is_superuser is True or \
498 grp_drh_recrutement in user_groupes or \
7d9736ba
NBV
499 grp_directeurs_bureau_recrutement in user_groupes or \
500 grp_administrateurs_recrutement in user_groupes:
501 return True
502 return False
27c81d11 503
940c9dd8
OL
504class CandidatEvaluationAdmin(admin.ModelAdmin):
505 search_fields = ('candidat__nom', 'candidat__prenom' )
506 list_display = ('_candidat', '_statut', '_offre_emploi', 'evaluateur', '_note',
b903198b 507 '_commentaire', )
940c9dd8
OL
508 readonly_fields = ('candidat', 'evaluateur')
509 list_filter = ('candidat__statut', 'candidat__offre_emploi',)
beef7690
NBV
510 fieldsets = (
511 ('Évaluation du candidat', {
512 'fields': ('candidat', 'evaluateur', 'note', 'commentaire', )
513 }),
514 )
515
7d9736ba 516 ### Actions à afficher
a029f641
NBV
517 def get_actions(self, request):
518 actions = super(CandidatEvaluationAdmin, self).get_actions(request)
519 del actions['delete_selected']
540dfae4 520 return actions
a029f641 521
7d9736ba 522 ### Afficher la note
beef7690
NBV
523 def _note(self, obj):
524 """
525 Si l'évaluateur n'a pas encore donné de note au candidat, indiquer
526 un lien pour Évaluer le candidat.
527 Sinon afficher la note.
528 """
529 if obj.note is None:
b903198b 530 return "<a href='%s'>Candidat non évalué</a>" % \
beef7690 531 (reverse('admin:recrutement_candidatevaluation_change',
7d0ae1ba 532 args=(obj.id,)))
b903198b
NBV
533 return "<a href='%s'>%s</a>" % \
534 (reverse('admin:recrutement_candidatevaluation_change',
e34ba098 535 args=(obj.id,)), obj.note)
beef7690 536 _note.allow_tags = True
7d0ae1ba 537 _note.short_description = "Note"
beef7690
NBV
538 _note.admin_order_field = 'note'
539
940c9dd8
OL
540 def _statut(self, obj):
541 return obj.candidat.get_statut_display()
542 _statut.order_field = 'candidat__statut'
543 _statut.short_description = 'Statut'
544
545
7d9736ba 546 ### Lien en lecture seule vers le candidat
beef7690
NBV
547 def _candidat(self, obj):
548 return "<a href='%s'>%s</a>" \
549 % (reverse('admin:recrutement_proxycandidat_change',
550 args=(obj.candidat.id,)), obj.candidat)
551 _candidat.allow_tags = True
552 _candidat.short_description = 'Candidat'
553
7d9736ba 554 ### Afficher commentaire
beef7690
NBV
555 def _commentaire(self, obj):
556 """
557 Si l'évaluateur n'a pas encore donné de note au candidat, indiquer
558 dans le champ commentaire, Aucun au lieu de (None)
559 Sinon afficher la note.
560 """
561 if obj.commentaire is None:
562 return "Aucun"
563 return obj.commentaire
564 _commentaire.allow_tags = True
565 _commentaire.short_description = "Commentaire"
720c3ad5 566
7d9736ba 567 ### Afficher offre d'emploi
beef7690
NBV
568 def _offre_emploi(self, obj):
569 return "<a href='%s'>%s</a>" % \
570 (reverse('admin:recrutement_proxyoffreemploi_change',
dc7faf2b 571 args=(obj.candidat.offre_emploi.id,)), obj.candidat.offre_emploi)
beef7690
NBV
572 _offre_emploi.allow_tags = True
573 _offre_emploi.short_description = "Voir offre d'emploi"
beef7690 574
7d9736ba 575 def has_add_permission(self, request):
940c9dd8
OL
576 return False
577
578 def has_delete_permission(self, request, obj=None):
579 return False
7d9736ba 580
21b02da5
NBV
581 def has_change_permission(self, request, obj=None):
582 """
583 Permettre la visualisation dans la changelist
584 mais interdire l'accès à modifier l'objet si l'évaluateur n'est pas
585 le request.user
586 """
f133459f
OL
587 user_groupes = request.user.groups.all()
588
589 if grp_drh_recrutement in user_groupes or \
590 grp_correspondants_rh_recrutement in user_groupes or \
591 grp_directeurs_bureau_recrutement in user_groupes or \
592 grp_administrateurs_recrutement in user_groupes:
593 is_recrutement = True
594 else:
595 is_recrutement = False
596
597 try:
598 Evaluateur.objects.get(user=request.user)
599 is_evaluateur = True
600 except:
601 is_evaluateur = False
602
603 if obj is None and (is_recrutement or is_evaluateur):
940c9dd8
OL
604 return True
605
26add0fd
OL
606 if request.user.is_superuser is True:
607 return True
940c9dd8 608
f133459f
OL
609 try:
610 return request.user == obj.evaluateur.user
611 except:
612 return False
21b02da5 613
7d9736ba 614 ### Queryset
720c3ad5 615 def queryset(self, request):
beef7690
NBV
616 """
617 Afficher uniquement les évaluations de l'évaluateur, sauf si
7d9736ba 618 l'utilisateur est dans les groupes suivants.
beef7690 619 """
940c9dd8 620 qs = self.model._default_manager.get_query_set().select_related('offre_emploi')
beef7690 621 user_groupes = request.user.groups.all()
940c9dd8 622
3a542b85 623 if grp_drh_recrutement in user_groupes or \
940c9dd8 624 grp_correspondants_rh_recrutement in user_groupes or \
3a542b85 625 grp_directeurs_bureau_recrutement in user_groupes or \
7d9736ba 626 grp_administrateurs_recrutement in user_groupes:
940c9dd8
OL
627 return qs
628
629 evaluateur = Evaluateur.objects.get(user=request.user)
630 candidats_evaluations = \
631 CandidatEvaluation.objects.filter(evaluateur=evaluateur,
632 candidat__statut__in=('REC', ))
633 candidats_evaluations_ids = [ce.id for ce in candidats_evaluations]
634 return qs.filter(id__in=candidats_evaluations_ids)
596fe324 635
4e8340cf 636class CourrielTemplateAdmin(VersionAdmin):
7d9736ba 637 ### Actions à afficher
a029f641
NBV
638 def get_actions(self, request):
639 actions = super(CourrielTemplateAdmin, self).get_actions(request)
640 del actions['delete_selected']
540dfae4 641 return actions
4e8340cf 642
df59fcab 643admin.site.register(OffreEmploi, OffreEmploiAdmin)
382501c1 644admin.site.register(ProxyOffreEmploi, ProxyOffreEmploiAdmin)
df59fcab 645admin.site.register(Candidat, CandidatAdmin)
382501c1 646admin.site.register(ProxyCandidat, ProxyCandidatAdmin)
720c3ad5 647admin.site.register(CandidatEvaluation, CandidatEvaluationAdmin)
27c81d11 648admin.site.register(Evaluateur, EvaluateurAdmin)
32834000 649admin.site.register(CourrielTemplate, CourrielTemplateAdmin)