Régler les conflits
[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()
d333c690 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
NBV
109 return form
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
7d9736ba 201 ### Permissions add, delete, change
f6724c20
NBV
202 def has_add_permission(self, request):
203 return False
204
205 def has_delete_permission(self, request, obj=None):
206 return False
207
2d083449
NBV
208 def has_change_permission(self, request, obj=None):
209 user_groupes = request.user.groups.all()
beef7690 210 if grp_evaluateurs_recrutement in user_groupes or \
d46075cb 211 grp_drh_recrutement in user_groupes or \
3a542b85 212 grp_directeurs_bureau_recrutement in user_groupes or \
7d9736ba 213 grp_administrateurs_recrutement in user_groupes:
2d083449
NBV
214 return True
215 return False
216
572c8d08
NBV
217class CandidatPieceInline(admin.TabularInline):
218 model = CandidatPiece
219 fields = ('candidat', 'nom', 'path',)
220 extra = 1
221 max_num = 3
222
572c8d08
NBV
223class CandidatEvaluationInlineFormSet(BaseInlineFormSet):
224 """
225 Empêche la suppression d'une évaluation pour le CandidatEvaluationInline
226 """
227 def __init__(self, *args, **kwargs):
228 super(CandidatEvaluationInlineFormSet, self).__init__(*args, **kwargs)
229 self.can_delete = False
230
231class CandidatEvaluationInline(admin.TabularInline):
232 model = CandidatEvaluation
233 fields = ('evaluateur', 'note', 'commentaire')
234 max_num = 0
235 extra = 0
236 formset = CandidatEvaluationInlineFormSet
7d9736ba
NBV
237
238 ### Fields readonly
572c8d08
NBV
239 def get_readonly_fields(self, request, obj=None):
240 """
241 Empêche la modification des évaluations
242 """
243 if obj:
244 return self.readonly_fields+('evaluateur', 'note', 'commentaire')
245 return self.readonly_fields
246
d2b30f5f 247class CandidatAdmin(VersionAdmin):
7d0ae1ba 248 exclude = ('actif', )
7f9e891e 249 date_hierarchy = 'date_creation'
0fd8a26d 250 list_display = ('nom', 'prenom', 'offre_emploi','statut',
dc7faf2b
NBV
251 'voir_offre_emploi', 'calculer_moyenne',
252 'afficher_candidat',)
8ea41642 253 list_filter = ('offre_emploi', )
7d0ae1ba 254
7f9e891e 255 fieldsets = (
4896b661 256 ("Offre d'emploi", {
257 'fields': ('offre_emploi', )
258 }),
7f9e891e 259 ('Informations personnelles', {
4fd0c4a2 260 'fields': ('prenom','nom','genre', 'nationalite',
7f9e891e 261 'situation_famille', 'nombre_dependant',)
262 }),
ec517164 263 ('Coordonnées', {
264 'fields': ('telephone', 'email', 'adresse', 'ville',
265 'etat_province', 'code_postal', 'pays', )
7f9e891e 266 }),
267 ('Informations professionnelles', {
4896b661 268 'fields': ('niveau_diplome','employeur_actuel',
8ea41642 269 'poste_actuel', 'domaine_professionnel',)
7f9e891e 270 }),
65c4cbd9
NBV
271 ('Traitement', {
272 'fields': ('statut', )
7f9e891e 273 }),
274 )
170c9aa2 275 inlines = [
276 CandidatPieceInline,
572c8d08 277 CandidatEvaluationInline,
170c9aa2 278 ]
f9983b5a 279
540dfae4 280 actions = ['envoyer_courriel_candidats']
a029f641 281
7d9736ba 282 ### Actions à afficher
a029f641
NBV
283 def get_actions(self, request):
284 actions = super(CandidatAdmin, self).get_actions(request)
285 del actions['delete_selected']
540dfae4 286 return actions
362a3534 287
7d9736ba 288 ### Envoyer un courriel à des candidats
52765380 289 def envoyer_courriel_candidats(modeladmin, obj, candidats):
290 selected = obj.POST.getlist(admin.ACTION_CHECKBOX_NAME)
291
32834000 292 return HttpResponseRedirect(reverse('selectionner_template')+
52765380 293 "?ids=%s" % (",".join(selected)))
294 envoyer_courriel_candidats.short_description = u'Envoyer courriel'
295
7d9736ba 296 ### Évaluer un candidat
596fe324 297 def evaluer_candidat(self, obj):
dc7faf2b 298 return "<a href='%s?candidat__id__exact=%s'>Évaluer le candidat</a>" % \
beef7690
NBV
299 (reverse('admin:recrutement_candidatevaluation_changelist'),
300 obj.id)
596fe324 301 evaluer_candidat.allow_tags = True
beef7690 302 evaluer_candidat.short_description = 'Évaluation'
596fe324 303
7d9736ba 304 ### Afficher un candidat
7d82fd33 305 def afficher_candidat(self, obj):
382501c1
NBV
306 return "<a href='%s'>Voir le candidat</a>" % \
307 (reverse('admin:recrutement_proxycandidat_change', args=(obj.id,)))
7d82fd33 308 afficher_candidat.allow_tags = True
8e0d552d 309 afficher_candidat.short_description = u'Détails du candidat'
7d82fd33 310
7d9736ba 311 ### Voir l'offre d'emploi
8941aee7 312 def voir_offre_emploi(self, obj):
720c3ad5
NBV
313 return "<a href='%s'>Voir l'offre d'emploi</a>" % \
314 (reverse('admin:recrutement_proxyoffreemploi_change',
315 args=(obj.offre_emploi.id,)))
8941aee7 316 voir_offre_emploi.allow_tags = True
317 voir_offre_emploi.short_description = "Afficher l'offre d'emploi"
318
7d9736ba 319 ### Calculer la moyenne des notes
8941aee7 320 def calculer_moyenne(self, obj):
321 evaluations = CandidatEvaluation.objects.filter(candidat=obj)
322 offre_emploi = obj.offre_emploi
323
f6724c20
NBV
324 notes = [evaluation.note for evaluation in evaluations.all() \
325 if evaluation.note is not None]
8941aee7 326
7d0ae1ba 327 if len(notes) > 0:
8941aee7 328 moyenne_votes = float(sum(notes)) / len(notes)
329 else:
330 moyenne_votes = "Non disponible"
331 return moyenne_votes
332 calculer_moyenne.allow_tags = True
333 calculer_moyenne.short_description = "Moyenne des notes"
334
7d9736ba 335 ### Permissions add, delete, change
3a542b85 336 def has_add_permission(self, request):
f6724c20
NBV
337 user_groupes = request.user.groups.all()
338 if grp_drh_recrutement in user_groupes or \
3a542b85 339 grp_directeurs_bureau_recrutement in user_groupes or \
7d9736ba 340 grp_administrateurs_recrutement in user_groupes:
f6724c20 341 return True
3a542b85 342 return False
4896b661 343
f6724c20 344 def has_delete_permission(self, request, obj=None):
3a542b85
NBV
345 user_groupes = request.user.groups.all()
346 if grp_drh_recrutement in user_groupes or \
347 grp_directeurs_bureau_recrutement in user_groupes or \
7d9736ba 348 grp_administrateurs_recrutement in user_groupes:
3a542b85
NBV
349 return True
350 return False
f6724c20
NBV
351
352 def has_change_permission(self, request, obj=None):
353 user_groupes = request.user.groups.all()
354 if grp_drh_recrutement in user_groupes or \
3a542b85 355 grp_directeurs_bureau_recrutement in user_groupes or \
7d9736ba 356 grp_administrateurs_recrutement in user_groupes:
f6724c20
NBV
357 return True
358 return False
4896b661 359
7d9736ba 360 ### Queryset
d46075cb 361 def queryset(self, request):
f9983b5a 362 """
8ea41642 363 Spécifie un queryset limité, autrement Django exécute un
364 select_related() sans paramètre, ce qui a pour effet de charger tous
365 les objets FK, sans limite de profondeur. Dès qu'on arrive, dans les
366 modèles de Region, il existe plusieurs boucles, ce qui conduit à la
367 génération d'une requête infinie.
d835c9f3 368
f9983b5a 369 """
7d9736ba 370 qs = self.model._default_manager.get_query_set()
d46075cb 371 user_groupes = request.user.groups.all()
7d9736ba
NBV
372 if grp_drh_recrutement in user_groupes:
373 return qs.select_related('candidats')
374
375 if grp_directeurs_bureau_recrutement in user_groupes or \
376 grp_administrateurs_recrutement in user_groupes:
377 employe = get_emp(request.user)
378 return qs.select_related('candidats').\
379 filter(offre_emploi__region=employe.implantation.region)
380
381 if grp_evaluateurs_recrutement in user_groupes:
382 try:
383 user = Evaluateur.objects.get(user=request.user)
384 except Evaluateur.DoesNotExist:
f6724c20 385 return qs.none()
7d9736ba
NBV
386
387 offres_emploi = [o for o in user.offres_emploi.all()]
388 candidat_ids = [o.candidat.id for o in offres_emploi]
389 return qs.select_related('candidats').filter(id__in=candidat_ids)
390 return qs.none()
f6724c20
NBV
391
392class ProxyCandidatAdmin(CandidatAdmin):
f6724c20 393 readonly_fields = ('statut', 'offre_emploi', 'prenom', 'nom',
4fd0c4a2
NBV
394 'genre', 'nationalite', 'situation_famille',
395 'nombre_dependant', 'telephone', 'email', 'adresse',
396 'ville', 'etat_province', 'code_postal', 'pays',
397 'niveau_diplome', 'employeur_actuel', 'poste_actuel',
8e0d552d 398 'domaine_professionnel', 'pieces_jointes',)
2d083449
NBV
399 fieldsets = (
400 ("Offre d'emploi", {
401 'fields': ('offre_emploi', )
402 }),
403 ('Informations personnelles', {
4fd0c4a2 404 'fields': ('prenom','nom','genre', 'nationalite',
2d083449
NBV
405 'situation_famille', 'nombre_dependant',)
406 }),
407 ('Coordonnées', {
408 'fields': ('telephone', 'email', 'adresse', 'ville',
409 'etat_province', 'code_postal', 'pays', )
410 }),
411 ('Informations professionnelles', {
412 'fields': ('niveau_diplome','employeur_actuel',
413 'poste_actuel', 'domaine_professionnel',)
8e0d552d 414 }),
2d083449 415 )
f6724c20 416 inlines = []
2d083449 417
7d9736ba 418 ### Lieu de redirection après le change
a029f641
NBV
419 def response_change(self, request, obj):
420 response = super(ProxyCandidatAdmin, self).response_change(request, obj)
421 user_groupes = request.user.groups.all()
422 if grp_drh_recrutement in user_groupes or \
3a542b85 423 grp_directeurs_bureau_recrutement in user_groupes or \
7d9736ba 424 grp_administrateurs_recrutement in user_groupes:
464e5825
NBV
425 return HttpResponseRedirect(reverse\
426 ('admin:recrutement_candidat_changelist'))
427 return HttpResponseRedirect(reverse\
428 ('admin:recrutement_proxycandidat_changelist'))
a029f641 429
7d9736ba 430 ### Permissions add, delete, change
f6724c20
NBV
431 def has_add_permission(self, request):
432 return False
433
434 def has_delete_permission(self, request, obj=None):
435 return False
2adf9e0c 436
2d083449
NBV
437 def has_change_permission(self, request, obj=None):
438 user_groupes = request.user.groups.all()
beef7690 439 if 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 }),
468 ("Offres d'emploi à évaluer", {
469 'fields': ('offres_emploi',)
470 }),
eb579d40 471 )
4418c732 472
7d9736ba 473 ### Actions à afficher
a029f641
NBV
474 def get_actions(self, request):
475 actions = super(EvaluateurAdmin, self).get_actions(request)
476 del actions['delete_selected']
540dfae4 477 return actions
a029f641 478
7d9736ba
NBV
479 ### Permissions add, delete, change
480 def has_add_permission(self, request):
481 user_groupes = request.user.groups.all()
482 if grp_drh_recrutement in user_groupes or \
483 grp_directeurs_bureau_recrutement in user_groupes or \
484 grp_administrateurs_recrutement in user_groupes:
485 return True
486 return False
487
488 def has_delete_permission(self, request, obj=None):
489 user_groupes = request.user.groups.all()
490 if grp_drh_recrutement in user_groupes or \
491 grp_directeurs_bureau_recrutement in user_groupes or \
492 grp_administrateurs_recrutement in user_groupes:
493 return True
494 return False
495
496 def has_change_permission(self, request, obj=None):
497 user_groupes = request.user.groups.all()
498 if grp_drh_recrutement in user_groupes or \
499 grp_directeurs_bureau_recrutement in user_groupes or \
500 grp_administrateurs_recrutement in user_groupes:
501 return True
502 return False
27c81d11 503
d2b30f5f 504class CandidatEvaluationAdmin(VersionAdmin):
2c3c54ee 505 list_display = ('_candidat', '_offre_emploi', 'evaluateur', '_note',
b903198b 506 '_commentaire', )
beef7690
NBV
507 readonly_fields = ('candidat', 'evaluateur')
508 fieldsets = (
509 ('Évaluation du candidat', {
510 'fields': ('candidat', 'evaluateur', 'note', 'commentaire', )
511 }),
512 )
513
7d9736ba 514 ### Actions à afficher
a029f641
NBV
515 def get_actions(self, request):
516 actions = super(CandidatEvaluationAdmin, self).get_actions(request)
517 del actions['delete_selected']
540dfae4 518 return actions
a029f641 519
7d9736ba 520 ### Afficher la note
beef7690
NBV
521 def _note(self, obj):
522 """
523 Si l'évaluateur n'a pas encore donné de note au candidat, indiquer
524 un lien pour Évaluer le candidat.
525 Sinon afficher la note.
526 """
527 if obj.note is None:
b903198b 528 return "<a href='%s'>Candidat non évalué</a>" % \
beef7690 529 (reverse('admin:recrutement_candidatevaluation_change',
7d0ae1ba 530 args=(obj.id,)))
b903198b
NBV
531 return "<a href='%s'>%s</a>" % \
532 (reverse('admin:recrutement_candidatevaluation_change',
533 args=(candidat_evaluation.id,)), obj.note)
beef7690 534 _note.allow_tags = True
7d0ae1ba 535 _note.short_description = "Note"
beef7690
NBV
536 _note.admin_order_field = 'note'
537
7d9736ba 538 ### Lien en lecture seule vers le candidat
beef7690
NBV
539 def _candidat(self, obj):
540 return "<a href='%s'>%s</a>" \
541 % (reverse('admin:recrutement_proxycandidat_change',
542 args=(obj.candidat.id,)), obj.candidat)
543 _candidat.allow_tags = True
544 _candidat.short_description = 'Candidat'
545
7d9736ba 546 ### Afficher commentaire
beef7690
NBV
547 def _commentaire(self, obj):
548 """
549 Si l'évaluateur n'a pas encore donné de note au candidat, indiquer
550 dans le champ commentaire, Aucun au lieu de (None)
551 Sinon afficher la note.
552 """
553 if obj.commentaire is None:
554 return "Aucun"
555 return obj.commentaire
556 _commentaire.allow_tags = True
557 _commentaire.short_description = "Commentaire"
720c3ad5 558
7d9736ba 559 ### Afficher offre d'emploi
beef7690
NBV
560 def _offre_emploi(self, obj):
561 return "<a href='%s'>%s</a>" % \
562 (reverse('admin:recrutement_proxyoffreemploi_change',
dc7faf2b 563 args=(obj.candidat.offre_emploi.id,)), obj.candidat.offre_emploi)
beef7690
NBV
564 _offre_emploi.allow_tags = True
565 _offre_emploi.short_description = "Voir offre d'emploi"
beef7690 566
7d9736ba
NBV
567 ### Permissions add, delete, change
568 def has_add_permission(self, request):
569 user_groupes = request.user.groups.all()
570 if grp_drh_recrutement in user_groupes or \
571 grp_directeurs_bureau_recrutement in user_groupes or \
572 grp_administrateurs_recrutement in user_groupes:
573 return True
574 return False
575
21b02da5
NBV
576 def has_change_permission(self, request, obj=None):
577 """
578 Permettre la visualisation dans la changelist
579 mais interdire l'accès à modifier l'objet si l'évaluateur n'est pas
580 le request.user
581 """
582 return obj is None or request.user == obj.evaluateur.user
583
7d9736ba 584 ### Queryset
720c3ad5 585 def queryset(self, request):
beef7690
NBV
586 """
587 Afficher uniquement les évaluations de l'évaluateur, sauf si
7d9736ba 588 l'utilisateur est dans les groupes suivants.
beef7690 589 """
720c3ad5 590 qs = self.model._default_manager.get_query_set()
beef7690 591 user_groupes = request.user.groups.all()
3a542b85
NBV
592 if grp_drh_recrutement in user_groupes or \
593 grp_directeurs_bureau_recrutement in user_groupes or \
7d9736ba 594 grp_administrateurs_recrutement in user_groupes:
beef7690
NBV
595 return qs.select_related('offre_emploi')
596
ca73c3c6 597 try:
d069cdf1 598 evaluateur = Evaluateur.objects.get(user=request.user)
ca73c3c6
NBV
599 except Evaluateur.DoesNotExist:
600 return qs.none()
601
602 candidats_evaluations = CandidatEvaluation.objects.\
603 filter(evaluateur=evaluateur)
604 candidats_evaluations_ids = [ce.id for ce in \
605 candidats_evaluations.all()]
606 return qs.select_related('offre_emploi').\
607 filter(id__in=candidats_evaluations_ids)
596fe324 608
4e8340cf 609class CourrielTemplateAdmin(VersionAdmin):
7d9736ba 610 ### Actions à afficher
a029f641
NBV
611 def get_actions(self, request):
612 actions = super(CourrielTemplateAdmin, self).get_actions(request)
613 del actions['delete_selected']
540dfae4 614 return actions
4e8340cf 615
df59fcab 616admin.site.register(OffreEmploi, OffreEmploiAdmin)
382501c1 617admin.site.register(ProxyOffreEmploi, ProxyOffreEmploiAdmin)
df59fcab 618admin.site.register(Candidat, CandidatAdmin)
382501c1 619admin.site.register(ProxyCandidat, ProxyCandidatAdmin)
720c3ad5 620admin.site.register(CandidatEvaluation, CandidatEvaluationAdmin)
27c81d11 621admin.site.register(Evaluateur, EvaluateurAdmin)
32834000 622admin.site.register(CourrielTemplate, CourrielTemplateAdmin)