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