1 # -*- encoding: utf-8 -*-
4 from django
.core
.urlresolvers
import reverse
5 from django
.http
import HttpResponseRedirect
6 from django
.contrib
import admin
7 from django
.forms
.models
import BaseInlineFormSet
8 from django
.db
.models
import Avg
9 from django
.conf
import settings
11 from reversion
.admin
import VersionAdmin
12 from datamaster_modeles
.models
import Region
, Bureau
13 from project
.rh
import models
as rh
15 from project
.dae
.utils
import get_employe_from_user
as get_emp
16 from recrutement
.models
import *
17 from recrutement
.workflow
import grp_drh_recrutement
, grp_drh2_recrutement
, \
18 grp_directeurs_bureau_recrutement
, \
19 grp_administrateurs_recrutement
, \
20 grp_correspondants_rh_recrutement
, \
21 grp_haute_direction_recrutement
23 from recrutement
.forms
import *
26 IMPLANTATIONS_CENTRALES
= [15, 19]
28 class OrderedChangeList(admin
.views
.main
.ChangeList
):
30 Surcharge pour appliquer le order_by d'un annotate
32 def get_query_set(self
):
33 qs
= super(OrderedChangeList
, self
).get_query_set()
34 qs
= qs
.order_by('-moyenne')
37 class OffreEmploiAdmin(VersionAdmin
):
38 date_hierarchy
= 'date_creation'
39 list_display
= ('nom', 'date_limite', 'region', 'statut',
40 'est_affiche', '_candidatsList', )
41 exclude
= ('actif', 'poste_nom', 'resume',)
42 list_filter
= ('statut',)
43 actions
= ['affecter_evaluateurs_offre_emploi', ]
44 form
= OffreEmploiForm
46 ### Actions à afficher
47 def get_actions(self
, request
):
48 actions
= super(OffreEmploiAdmin
, self
).get_actions(request
)
49 del actions
['delete_selected']
52 ### Affecter un évaluateurs à des offres d'emploi
53 def affecter_evaluateurs_offre_emploi(modeladmin
, obj
, candidats
):
54 selected
= obj
.POST
.getlist(admin
.ACTION_CHECKBOX_NAME
)
56 return HttpResponseRedirect(reverse('affecter_evaluateurs_offre_emploi')+
57 "?ids=%s" % (",".join(selected
)))
58 affecter_evaluateurs_offre_emploi
.short_description
= u
'Affecter évaluateur(s)'
60 ### Afficher la liste des candidats pour l'offre d'emploi
61 def _candidatsList(self
, obj
):
62 return "<a href='%s?offre_emploi__id__exact=%s'>Voir les candidats \
63 </a>" % (reverse('admin:recrutement_candidat_changelist'), obj
.id)
64 _candidatsList
.allow_tags
= True
65 _candidatsList
.short_description
= "Afficher la liste des candidats"
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
)
71 user_groupes
= request
.user
.groups
.all()
75 if form
.declared_fields
.has_key('region'):
76 region_field
= form
.declared_fields
['region']
78 region_field
= form
.base_fields
['region']
80 if grp_drh_recrutement
in user_groupes
or \
81 grp_drh2_recrutement
in user_groupes
or \
82 grp_haute_direction_recrutement
in user_groupes
:
83 region_field
.queryset
= Region
.objects
.all()
85 region_field
.queryset
= Region
.objects
.\
86 filter(id=employe
.implantation
.region
.id)
89 if form
.declared_fields
.has_key('poste'):
90 poste_field
= form
.declared_fields
['poste']
92 poste_field
= form
.base_fields
['poste']
94 if grp_drh_recrutement
in user_groupes
or \
95 grp_drh2_recrutement
in user_groupes
or \
96 grp_haute_direction_recrutement
in user_groupes
:
97 poste_field
.queryset
= rh
.Poste
.objects
.all()
99 poste_field
.queryset
= rh
.Poste
.objects
.\
100 filter(implantation__region
=employe
.implantation
.region
).\
101 exclude(implantation__in
=IMPLANTATIONS_CENTRALES
)
104 if form
.declared_fields
.has_key('bureau'):
105 bureau_field
= form
.declared_fields
['bureau']
107 bureau_field
= form
.base_fields
['bureau']
109 if grp_drh_recrutement
in user_groupes
or \
110 grp_drh2_recrutement
in user_groupes
or \
111 grp_haute_direction_recrutement
in user_groupes
:
112 bureau_field
.queryset
= Bureau
.objects
.all()
114 bureau_field
.queryset
= Bureau
.objects
.\
115 filter(region
=employe
.implantation
.region
)
120 def queryset(self
, request
):
121 qs
= self
.model
._default_manager
.get_query_set().select_related('offre_emploi')
122 user_groupes
= request
.user
.groups
.all()
123 if grp_drh_recrutement
in user_groupes
or \
124 grp_drh2_recrutement
in user_groupes
or \
125 grp_haute_direction_recrutement
in user_groupes
:
128 if grp_directeurs_bureau_recrutement
in user_groupes
or \
129 grp_correspondants_rh_recrutement
in user_groupes
or \
130 grp_administrateurs_recrutement
in user_groupes
:
131 employe
= get_emp(request
.user
)
132 return qs
.filter(region
=employe
.implantation
.region
)
134 if Evaluateur
.objects
.filter(user
=request
.user
).exists():
135 evaluateur
= Evaluateur
.objects
.get(user
=request
.user
)
136 offre_ids
= [e
.candidat
.offre_emploi_id
for e
in
137 CandidatEvaluation
.objects
.select_related('candidat').filter(evaluateur
=evaluateur
)]
138 return qs
.filter(id__in
=offre_ids
)
142 ### Permission add, delete, change
143 def has_add_permission(self
, request
):
144 user_groupes
= request
.user
.groups
.all()
145 if request
.user
.is_superuser
is True or \
146 grp_drh_recrutement
in user_groupes
or \
147 grp_drh2_recrutement
in user_groupes
or \
148 grp_directeurs_bureau_recrutement
in user_groupes
or \
149 grp_administrateurs_recrutement
in user_groupes
or \
150 grp_haute_direction_recrutement
in user_groupes
:
154 def has_delete_permission(self
, request
, obj
=None):
155 user_groupes
= request
.user
.groups
.all()
156 if request
.user
.is_superuser
is True or \
157 grp_drh_recrutement
in user_groupes
or \
158 grp_drh2_recrutement
in user_groupes
or \
159 grp_directeurs_bureau_recrutement
in user_groupes
or \
160 grp_administrateurs_recrutement
in user_groupes
or \
161 grp_haute_direction_recrutement
in user_groupes
:
165 def has_change_permission(self
, request
, obj
=None):
166 user_groupes
= request
.user
.groups
.all()
167 if request
.user
.is_superuser
is True or \
168 grp_drh_recrutement
in user_groupes
or \
169 grp_drh2_recrutement
in user_groupes
or \
170 grp_directeurs_bureau_recrutement
in user_groupes
or \
171 grp_administrateurs_recrutement
in user_groupes
or \
172 grp_haute_direction_recrutement
in user_groupes
:
176 class ProxyOffreEmploiAdmin(OffreEmploiAdmin
):
177 list_display
= ('nom', 'date_limite', 'region', 'statut',
179 readonly_fields
= ('description', 'bureau', 'duree_affectation',
180 'renumeration', 'debut_affectation', 'lieu_affectation',
181 'nom', 'resume', 'date_limite', 'region', 'poste')
186 ('Description générale', {
187 'fields': ('description', 'date_limite', )
190 'fields': ('lieu_affectation', 'bureau', 'region', 'poste',)
193 'fields': ('debut_affectation', 'duree_affectation',
200 ### Lieu de redirection après le change
201 def response_change(self
, request
, obj
):
202 return HttpResponseRedirect(reverse\
203 ('admin:recrutement_proxyoffreemploi_changelist'))
206 def get_form(self
, request
, obj
=None, **kwargs
):
207 form
= super(OffreEmploiAdmin
, self
).get_form(request
, obj
, **kwargs
)
210 ### Permissions add, delete, change
211 def has_add_permission(self
, request
):
214 def has_delete_permission(self
, request
, obj
=None):
217 def has_change_permission(self
, request
, obj
=None):
218 user_groupes
= request
.user
.groups
.all()
219 if request
.user
.is_superuser
is True or \
220 grp_correspondants_rh_recrutement
in user_groupes
or \
221 grp_drh_recrutement
in user_groupes
or \
222 grp_drh2_recrutement
in user_groupes
or \
223 grp_directeurs_bureau_recrutement
in user_groupes
or \
224 grp_administrateurs_recrutement
in user_groupes
or \
225 grp_haute_direction_recrutement
in user_groupes
:
233 class CandidatPieceInline(admin
.TabularInline
):
234 model
= CandidatPiece
235 fields
= ('candidat', 'nom', 'path',)
239 class ReadOnlyCandidatPieceInline(CandidatPieceInline
):
240 readonly_fields
= ('candidat', 'nom', 'path', )
244 class CandidatEvaluationInlineFormSet(BaseInlineFormSet
):
246 Empêche la suppression d'une évaluation pour le CandidatEvaluationInline
248 def __init__(self
, *args
, **kwargs
):
249 super(CandidatEvaluationInlineFormSet
, self
).__init__(*args
, **kwargs
)
250 self
.can_delete
= False
252 class CandidatEvaluationInline(admin
.TabularInline
):
253 model
= CandidatEvaluation
254 fields
= ('evaluateur', 'note', 'commentaire')
257 formset
= CandidatEvaluationInlineFormSet
260 def get_readonly_fields(self
, request
, obj
=None):
262 Empêche la modification des évaluations
265 return self
.readonly_fields
+('evaluateur', 'note', 'commentaire')
266 return self
.readonly_fields
268 class CandidatAdmin(VersionAdmin
):
269 search_fields
= ('nom', 'prenom' )
270 exclude
= ('actif', )
271 list_editable
= ('statut', )
272 list_display
= ('_candidat', 'offre_emploi',
273 'voir_offre_emploi', 'calculer_moyenne',
274 'afficher_candidat', '_date_creation', 'statut', )
275 list_filter
= ('offre_emploi', 'offre_emploi__region', 'statut', )
279 'fields': ('offre_emploi', )
281 ('Informations personnelles', {
282 'fields': ('prenom','nom','genre', 'nationalite',
283 'situation_famille', 'nombre_dependant',)
286 'fields': ('telephone', 'email', 'adresse', 'ville',
287 'etat_province', 'code_postal', 'pays', )
289 ('Informations professionnelles', {
290 'fields': ('niveau_diplome','employeur_actuel',
291 'poste_actuel', 'domaine_professionnel',)
294 'fields': ('statut', )
299 CandidatEvaluationInline
,
301 actions
= ['envoyer_courriel_candidats']
303 def _candidat(self
, obj
):
304 txt
= u
"%s %s (%s)" % ( obj
.nom
.upper(), obj
.prenom
,
306 txt
= textwrap
.wrap(txt
, 30)
307 return "<br/>".join(txt
)
308 _candidat
.short_description
= "Candidat"
309 _candidat
.admin_order_field
= "nom"
310 _candidat
.allow_tags
= True
312 def _date_creation(self
, obj
):
313 return obj
.date_creation
314 _date_creation
.admin_order_field
= "date_creation"
315 _date_creation
.short_description
= "Date de réception"
317 ### Actions à afficher
318 def get_actions(self
, request
):
319 actions
= super(CandidatAdmin
, self
).get_actions(request
)
320 del actions
['delete_selected']
323 ### Envoyer un courriel à des candidats
324 def envoyer_courriel_candidats(modeladmin
, obj
, candidats
):
325 selected
= obj
.POST
.getlist(admin
.ACTION_CHECKBOX_NAME
)
327 return HttpResponseRedirect(reverse('selectionner_template')+
328 "?ids=%s" % (",".join(selected
)))
329 envoyer_courriel_candidats
.short_description
= u
'Envoyer courriel'
331 ### Évaluer un candidat
332 def evaluer_candidat(self
, obj
):
333 return "<a href='%s?candidat__id__exact=%s'>Évaluer le candidat</a>" % \
334 (reverse('admin:recrutement_candidatevaluation_changelist'),
336 evaluer_candidat
.allow_tags
= True
337 evaluer_candidat
.short_description
= 'Évaluation'
339 ### Afficher un candidat
340 def afficher_candidat(self
, obj
):
341 items
= [u
"<li><a href='%s%s'>%s</li>" % \
342 (settings
.OE_PRIVE_MEDIA_URL
, pj
.path
, pj
.get_nom_display()) \
343 for pj
in obj
.pieces_jointes()]
344 html
= "<a href='%s'>Voir le candidat</a>" % \
345 (reverse('admin:recrutement_proxycandidat_change', args
=(obj
.id,)))
346 return "%s<ul>%s</ul>" % (html
, "\n".join(items
))
347 afficher_candidat
.allow_tags
= True
348 afficher_candidat
.short_description
= u
'Détails du candidat'
350 ### Voir l'offre d'emploi
351 def voir_offre_emploi(self
, obj
):
352 return "<a href='%s'>Voir l'offre d'emploi</a>" % \
353 (reverse('admin:recrutement_proxyoffreemploi_change',
354 args
=(obj
.offre_emploi
.id,)))
355 voir_offre_emploi
.allow_tags
= True
356 voir_offre_emploi
.short_description
= "Afficher l'offre d'emploi"
358 ### Calculer la moyenne des notes
359 def calculer_moyenne(self
, obj
):
360 evaluations
= CandidatEvaluation
.objects
.filter(candidat
=obj
)
362 notes
= [evaluation
.note
for evaluation
in evaluations \
363 if evaluation
.note
is not None]
366 moyenne_votes
= round(float(sum(notes
)) / len(notes
), 2)
368 moyenne_votes
= "Non disponible"
370 totales
= len(evaluations
)
373 if obj
.statut
== 'REC':
374 if totales
== faites
:
376 elif faites
> 0 and float(totales
) / float(faites
) >= 2:
383 return """<span style="color: %s;">%s (%s/%s)</span>""" % (color
, moyenne_votes
, faites
, totales
)
384 calculer_moyenne
.allow_tags
= True
385 calculer_moyenne
.short_description
= "Moyenne"
386 calculer_moyenne
.admin_order_field
= ""
388 ### Permissions add, delete, change
389 def has_add_permission(self
, request
):
390 user_groupes
= request
.user
.groups
.all()
391 if request
.user
.is_superuser
is True or \
392 grp_correspondants_rh_recrutement
in user_groupes
or \
393 grp_drh_recrutement
in user_groupes
or \
394 grp_drh2_recrutement
in user_groupes
or \
395 grp_directeurs_bureau_recrutement
in user_groupes
or \
396 grp_administrateurs_recrutement
in user_groupes
or \
397 grp_haute_direction_recrutement
in user_groupes
:
401 def has_delete_permission(self
, request
, obj
=None):
402 user_groupes
= request
.user
.groups
.all()
403 if request
.user
.is_superuser
is True or \
404 grp_correspondants_rh_recrutement
in user_groupes
or \
405 grp_drh_recrutement
in user_groupes
or \
406 grp_drh2_recrutement
in user_groupes
or \
407 grp_directeurs_bureau_recrutement
in user_groupes
or \
408 grp_administrateurs_recrutement
in user_groupes
or \
409 grp_haute_direction_recrutement
in user_groupes
:
413 def has_change_permission(self
, request
, obj
=None):
414 user_groupes
= request
.user
.groups
.all()
415 if request
.user
.is_superuser
is True or \
416 grp_correspondants_rh_recrutement
in user_groupes
or \
417 grp_drh_recrutement
in user_groupes
or \
418 grp_drh2_recrutement
in user_groupes
or \
419 grp_directeurs_bureau_recrutement
in user_groupes
or \
420 grp_administrateurs_recrutement
in user_groupes
or \
421 grp_haute_direction_recrutement
in user_groupes
:
425 def get_changelist(self
, request
, **kwargs
):
426 return OrderedChangeList
428 def queryset(self
, request
):
430 Spécifie un queryset limité, autrement Django exécute un
431 select_related() sans paramètre, ce qui a pour effet de charger tous
432 les objets FK, sans limite de profondeur. Dès qu'on arrive, dans les
433 modèles de Region, il existe plusieurs boucles, ce qui conduit à la
434 génération d'une requête infinie.
438 qs
= self
.model
._default_manager
.get_query_set().select_related('offre_emploi').annotate(moyenne
=Avg('evaluations__note'))
440 user_groupes
= request
.user
.groups
.all()
441 if grp_drh_recrutement
in user_groupes
or \
442 grp_drh2_recrutement
in user_groupes
or \
443 grp_haute_direction_recrutement
in user_groupes
:
446 if grp_directeurs_bureau_recrutement
in user_groupes
or \
447 grp_correspondants_rh_recrutement
in user_groupes
or \
448 grp_administrateurs_recrutement
in user_groupes
:
449 employe
= get_emp(request
.user
)
450 return qs
.filter(offre_emploi__region
=employe
.implantation
.region
)
452 if Evaluateur
.objects
.filter(user
=request
.user
).exists():
453 evaluateur
= Evaluateur
.objects
.get(user
=request
.user
)
454 candidat_ids
= [e
.candidat
.id for e
in
455 CandidatEvaluation
.objects
.filter(evaluateur
=evaluateur
)]
456 return qs
.filter(id__in
=candidat_ids
)
460 class ProxyCandidatAdmin(CandidatAdmin
):
462 readonly_fields
= ('statut', 'offre_emploi', 'prenom', 'nom',
463 'genre', 'nationalite', 'situation_famille',
464 'nombre_dependant', 'telephone', 'email', 'adresse',
465 'ville', 'etat_province', 'code_postal', 'pays',
466 'niveau_diplome', 'employeur_actuel', 'poste_actuel',
467 'domaine_professionnel', 'pieces_jointes',)
470 'fields': ('offre_emploi', )
472 ('Informations personnelles', {
473 'fields': ('prenom','nom','genre', 'nationalite',
474 'situation_famille', 'nombre_dependant',)
477 'fields': ('telephone', 'email', 'adresse', 'ville',
478 'etat_province', 'code_postal', 'pays', )
480 ('Informations professionnelles', {
481 'fields': ('niveau_diplome','employeur_actuel',
482 'poste_actuel', 'domaine_professionnel',)
485 inlines
= (CandidatEvaluationInline
, )
487 def has_add_permission(self
, request
):
490 def has_delete_permission(self
, request
, obj
=None):
493 def has_change_permission(self
, request
, obj
=None):
494 user_groupes
= request
.user
.groups
.all()
495 if request
.user
.is_superuser
is True or \
496 grp_correspondants_rh_recrutement
in user_groupes
or \
497 grp_drh_recrutement
in user_groupes
or \
498 grp_drh2_recrutement
in user_groupes
or \
499 grp_directeurs_bureau_recrutement
in user_groupes
or \
500 grp_administrateurs_recrutement
in user_groupes
or \
501 grp_haute_direction_recrutement
in user_groupes
:
505 evaluateur
= Evaluateur
.objects
.get(user
=request
.user
)
506 for e
in obj
.evaluations
.all():
507 if e
.evaluateur
== evaluateur
:
512 def get_actions(self
, request
):
515 class CandidatPieceAdmin(admin
.ModelAdmin
):
516 list_display
= ('nom', 'candidat', )
519 def queryset(self
, request
):
521 Spécifie un queryset limité, autrement Django exécute un
522 select_related() sans paramètre, ce qui a pour effet de charger tous
523 les objets FK, sans limite de profondeur. Dès qu'on arrive, dans les
524 modèles de Region, il existe plusieurs boucles, ce qui conduit à la
525 génération d'une requête infinie.
526 Affiche la liste de candidats que si le user connecté
527 possède un Evaluateur
529 qs
= self
.model
._default_manager
.get_query_set()
530 return qs
.select_related('candidat')
532 class EvaluateurAdmin(VersionAdmin
):
539 ### Actions à afficher
540 def get_actions(self
, request
):
541 actions
= super(EvaluateurAdmin
, self
).get_actions(request
)
542 del actions
['delete_selected']
545 ### Permissions add, delete, change
546 def has_add_permission(self
, request
):
547 user_groupes
= request
.user
.groups
.all()
548 if request
.user
.is_superuser
is True or \
549 grp_drh_recrutement
in user_groupes
or \
550 grp_drh2_recrutement
in user_groupes
or \
551 grp_haute_direction_recrutement
in user_groupes
:
555 def has_delete_permission(self
, request
, obj
=None):
556 user_groupes
= request
.user
.groups
.all()
557 if request
.user
.is_superuser
is True or \
558 grp_drh_recrutement
in user_groupes
or \
559 grp_drh2_recrutement
in user_groupes
or \
560 grp_haute_direction_recrutement
in user_groupes
:
564 def has_change_permission(self
, request
, obj
=None):
565 user_groupes
= request
.user
.groups
.all()
566 if request
.user
.is_superuser
is True or \
567 grp_drh_recrutement
in user_groupes
or \
568 grp_drh2_recrutement
in user_groupes
or \
569 grp_haute_direction_recrutement
in user_groupes
:
573 class CandidatEvaluationAdmin(admin
.ModelAdmin
):
574 search_fields
= ('candidat__nom', 'candidat__prenom' )
575 list_display
= ('_candidat', '_statut', '_offre_emploi', 'evaluateur', '_note',
577 readonly_fields
= ('candidat', 'evaluateur')
578 list_filter
= ('candidat__statut', 'candidat__offre_emploi',)
580 ('Évaluation du candidat', {
581 'fields': ('candidat', 'evaluateur', 'note', 'commentaire', )
585 def get_actions(self
, request
):
586 # on stocke l'evaluateur connecté (pas forcément la meilleure place...)
588 self
.evaluateur
= Evaluateur
.objects
.get(user
=request
.user
)
590 self
.evaluateur
= None
592 actions
= super(CandidatEvaluationAdmin
, self
).get_actions(request
)
593 del actions
['delete_selected']
597 def _note(self
, obj
):
599 Si l'évaluateur n'a pas encore donné de note au candidat, indiquer
600 un lien pour Évaluer le candidat.
601 Sinon afficher la note.
603 page
= self
.model
.__name__
.lower()
604 redirect_url
= 'admin:recrutement_%s_change' % page
607 label
= "Candidat non évalué"
611 if self
.evaluateur
== obj
.evaluateur
:
612 return "<a href='%s'>%s</a>" % (reverse(redirect_url
, args
=(obj
.id,)), label
)
615 _note
.allow_tags
= True
616 _note
.short_description
= "Note"
617 _note
.admin_order_field
= 'note'
619 def _statut(self
, obj
):
620 return obj
.candidat
.get_statut_display()
621 _statut
.order_field
= 'candidat__statut'
622 _statut
.short_description
= 'Statut'
625 ### Lien en lecture seule vers le candidat
626 def _candidat(self
, obj
):
627 return "<a href='%s'>%s</a>" \
628 % (reverse('admin:recrutement_proxycandidat_change',
629 args
=(obj
.candidat
.id,)), obj
.candidat
)
630 _candidat
.allow_tags
= True
631 _candidat
.short_description
= 'Candidat'
633 ### Afficher commentaire
634 def _commentaire(self
, obj
):
636 Si l'évaluateur n'a pas encore donné de note au candidat, indiquer
637 dans le champ commentaire, Aucun au lieu de (None)
638 Sinon afficher la note.
640 if obj
.commentaire
is None:
642 return obj
.commentaire
643 _commentaire
.allow_tags
= True
644 _commentaire
.short_description
= "Commentaire"
646 ### Afficher offre d'emploi
647 def _offre_emploi(self
, obj
):
648 return "<a href='%s'>%s</a>" % \
649 (reverse('admin:recrutement_proxyoffreemploi_change',
650 args
=(obj
.candidat
.offre_emploi
.id,)), obj
.candidat
.offre_emploi
)
651 _offre_emploi
.allow_tags
= True
652 _offre_emploi
.short_description
= "Voir offre d'emploi"
654 def has_add_permission(self
, request
):
657 def has_delete_permission(self
, request
, obj
=None):
660 def has_change_permission(self
, request
, obj
=None):
662 Permettre la visualisation dans la changelist
663 mais interdire l'accès à modifier l'objet si l'évaluateur n'est pas
666 user_groupes
= request
.user
.groups
.all()
668 if request
.user
.is_superuser
or \
669 grp_drh_recrutement
in user_groupes
or \
670 grp_drh2_recrutement
in user_groupes
or \
671 grp_correspondants_rh_recrutement
in user_groupes
or \
672 grp_directeurs_bureau_recrutement
in user_groupes
or \
673 grp_administrateurs_recrutement
in user_groupes
or \
674 grp_haute_direction_recrutement
in user_groupes
:
675 is_recrutement
= True
677 is_recrutement
= False
679 return is_recrutement
681 def queryset(self
, request
):
683 Afficher uniquement les évaluations de l'évaluateur, sauf si
684 l'utilisateur est dans les groupes suivants.
686 qs
= self
.model
._default_manager
.get_query_set().select_related('offre_emploi')
687 user_groupes
= request
.user
.groups
.all()
689 if grp_drh_recrutement
in user_groupes
or \
690 grp_drh2_recrutement
in user_groupes
or \
691 grp_correspondants_rh_recrutement
in user_groupes
or \
692 grp_directeurs_bureau_recrutement
in user_groupes
or \
693 grp_administrateurs_recrutement
in user_groupes
or \
694 grp_haute_direction_recrutement
in user_groupes
:
697 evaluateur
= Evaluateur
.objects
.get(user
=request
.user
)
698 candidats_evaluations
= \
699 CandidatEvaluation
.objects
.filter(evaluateur
=evaluateur
,
700 candidat__statut__in
=('REC', ))
701 candidats_evaluations_ids
= [ce
.id for ce
in candidats_evaluations
]
702 return qs
.filter(id__in
=candidats_evaluations_ids
)
705 class MesCandidatEvaluationAdmin(CandidatEvaluationAdmin
):
707 def has_change_permission(self
, request
, obj
=None):
709 Evaluateur
.objects
.get(user
=request
.user
)
712 is_evaluateur
= False
714 if obj
is None and is_evaluateur
:
718 return request
.user
== obj
.evaluateur
.user
722 def queryset(self
, request
):
723 qs
= self
.model
._default_manager
.get_query_set().select_related('offre_emploi')
724 evaluateur
= Evaluateur
.objects
.get(user
=request
.user
)
725 candidats_evaluations
= \
726 CandidatEvaluation
.objects
.filter(evaluateur
=evaluateur
,
727 candidat__statut__in
=('REC', ))
728 candidats_evaluations_ids
= [ce
.id for ce
in candidats_evaluations
]
729 return qs
.filter(id__in
=candidats_evaluations_ids
)
732 class CourrielTemplateAdmin(VersionAdmin
):
733 ### Actions à afficher
734 def get_actions(self
, request
):
735 actions
= super(CourrielTemplateAdmin
, self
).get_actions(request
)
736 del actions
['delete_selected']
739 admin
.site
.register(OffreEmploi
, OffreEmploiAdmin
)
740 admin
.site
.register(ProxyOffreEmploi
, ProxyOffreEmploiAdmin
)
741 admin
.site
.register(Candidat
, CandidatAdmin
)
742 admin
.site
.register(ProxyCandidat
, ProxyCandidatAdmin
)
743 admin
.site
.register(CandidatEvaluation
, CandidatEvaluationAdmin
)
744 admin
.site
.register(MesCandidatEvaluation
, MesCandidatEvaluationAdmin
)
745 admin
.site
.register(Evaluateur
, EvaluateurAdmin
)
746 admin
.site
.register(CourrielTemplate
, CourrielTemplateAdmin
)