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, \ | |
16 | grp_administrateurs_recrutement | |
a084e988 | 17 | from recrutement.forms import * |
df59fcab | 18 | |
7d9736ba | 19 | ### CONSTANTES |
d333c690 NBV |
20 | IMPLANTATIONS_CENTRALES = [15, 19] |
21 | ||
b8b74dee NBV |
22 | class 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 | ||
31 | class EvaluateurInline(admin.TabularInline): | |
32 | model = ProxyEvaluateur | |
33 | fields = ('evaluateur',) | |
34 | extra = 1 | |
35 | ||
d2b30f5f | 36 | class 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 | ||
164 | class 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 |
221 | class CandidatPieceInline(admin.TabularInline): |
222 | model = CandidatPiece | |
223 | fields = ('candidat', 'nom', 'path',) | |
224 | extra = 1 | |
225 | max_num = 3 | |
226 | ||
572c8d08 NBV |
227 | class 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 | ||
235 | class 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 | 251 | class 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 | 400 | class 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 | 450 | class 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 | 467 | class 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 | 511 | class 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 | 622 | class 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 | 629 | admin.site.register(OffreEmploi, OffreEmploiAdmin) |
382501c1 | 630 | admin.site.register(ProxyOffreEmploi, ProxyOffreEmploiAdmin) |
df59fcab | 631 | admin.site.register(Candidat, CandidatAdmin) |
382501c1 | 632 | admin.site.register(ProxyCandidat, ProxyCandidatAdmin) |
720c3ad5 | 633 | admin.site.register(CandidatEvaluation, CandidatEvaluationAdmin) |
27c81d11 | 634 | admin.site.register(Evaluateur, EvaluateurAdmin) |
32834000 | 635 | admin.site.register(CourrielTemplate, CourrielTemplateAdmin) |