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