e29ed3fedba74f670e661c65a62fcfd852d1912a
[auf_rh_dae.git] / project / recrutement / admin.py
1 # -*- encoding: utf-8 -*-
2
3 from django.core.urlresolvers import reverse
4 from django.http import HttpResponseRedirect
5 from django.contrib import admin
6 from django.shortcuts import get_object_or_404
7
8 from reversion.admin import VersionAdmin
9 from datamaster_modeles.models import Employe, Implantation, Region
10
11 from recrutement.models import *
12
13 class OffreEmploiAdmin(VersionAdmin):
14 date_hierarchy = 'date_creation'
15 list_display = ('nom', 'resume', 'date_limite', 'region', '_candidatsList')
16
17 # Afficher la liste des candidats pour l'offre d'emploi
18 def _candidatsList(self, obj):
19 return "<a href='%s?offre_emploi__id__exact=%s'>Voir les candidats \
20 </a>" % (reverse('admin:recrutement_candidat_changelist'), obj.id)
21 _candidatsList.allow_tags = True
22 _candidatsList.short_description = "Liste des candidats"
23
24
25 def get_form(self, request, obj=None, **kwargs):
26 """
27 Affiche la liste des régions, seulement si le user
28 connecté possède un UserProfile
29 """
30 form = super(OffreEmploiAdmin, self).get_form(request, obj, **kwargs)
31 if form.declared_fields.has_key('region'):
32 region_field = form.declared_fields['region']
33 else:
34 region_field = form.base_fields['region']
35
36 try:
37 user = UserProfile.objects.get(user=request.user)
38 except UserProfile.DoesNotExist:
39 region_field.queryset = Region.objects.none()
40 return form
41
42 region_ids = [g.id for g in user.regions.all()]
43 region_field.queryset = Region.objects.filter(id__in=region_ids)
44 return form
45
46 def queryset(self, request):
47 """
48 N'affiche la liste de candidats que si le user connecté
49 possède un UserProfile
50 """
51 qs = self.model._default_manager.get_query_set()
52 try:
53 user = UserProfile.objects.get(user=request.user)
54 except UserProfile.DoesNotExist:
55 return qs.none()
56
57 region_ids = [g.id for g in user.regions.all()]
58 return qs.select_related('offre_emploi').filter(region__in=region_ids)
59
60 class ProxyCandidatPiece(CandidatPiece):
61 """
62 Ce proxy sert uniquement dans l'admin à disposer d'un libellé
63 plus ergonomique.
64 """
65 class Meta:
66 proxy = True
67 verbose_name = "pièce jointe"
68 verbose_name_plural = "pièces jointes"
69
70 class CandidatPieceInline(admin.TabularInline):
71 model = ProxyCandidatPiece
72 fields = ('candidat', 'nom', 'path', )
73 extra = 1
74
75 class ProxyEvaluateur(UserProfile.candidats.through):
76 """
77 Ce proxy sert uniquement dans l'admin à disposer d'un libellé
78 plus ergonomique.
79 """
80 class Meta:
81 proxy = True
82 verbose_name = "évaluateur"
83
84 class EvaluateurInline(admin.TabularInline):
85 model = ProxyEvaluateur
86 extra = 1
87
88 class CandidatAdmin(VersionAdmin):
89 date_hierarchy = 'date_creation'
90 list_display = ('nom', 'prenom', 'offre_emploi','statut',
91 'voir_offre_emploi', 'evaluer_candidat', #'note_evaluateur',
92 'calculer_moyenne', 'afficher_candidat',)
93 list_filter = ('offre_emploi', )
94 fieldsets = (
95 ("Offre d'emploi", {
96 'fields': ('offre_emploi', )
97 }),
98 ('Informations personnelles', {
99 'fields': ('prenom','nom','genre', 'nationalite', 'date_naissance',
100 'situation_famille', 'nombre_dependant',)
101 }),
102 ('Coordonnées', {
103 'fields': ('telephone', 'email', 'adresse', 'ville',
104 'etat_province', 'code_postal', 'pays', )
105 }),
106 ('Informations professionnelles', {
107 'fields': ('niveau_diplome','employeur_actuel',
108 'poste_actuel', 'domaine_professionnel',)
109 }),
110 ('Options avancées', {
111 'classes': ('collapse',),
112 'fields': ('actif', 'statut', )
113 }),
114 )
115 inlines = [
116 CandidatPieceInline,
117 EvaluateurInline,
118 ]
119
120 actions = ['affecter_candidats_evaluateur']
121 # Affecter un évaluateurs à des candidats
122 def affecter_candidats_evaluateur(modeladmin, obj, candidats):
123 selected = obj.POST.getlist(admin.ACTION_CHECKBOX_NAME)
124
125 return HttpResponseRedirect(reverse('affecter_evaluateurs_candidats')+
126 "?ids=%s" % (",".join(selected)))
127 affecter_candidats_evaluateur.short_description = u'Affecter évaluateur'
128
129 # Évaluer un candidat
130 def evaluer_candidat(self, obj):
131 return "<a href='%s?id=%s'>Évaluer le candidat \
132 </a>" % (reverse('evaluer_candidat'), obj.id)
133 evaluer_candidat.allow_tags = True
134 evaluer_candidat.short_description = 'Évaluer'
135
136 # Afficher un candidat
137 def afficher_candidat(self, obj):
138 return "<a href='%s?id=%s'>Voir le candidat \
139 </a>" % (reverse('afficher_candidat'), obj.id)
140 afficher_candidat.allow_tags = True
141 afficher_candidat.short_description = u'Afficher les détails'
142
143 # Voir l'offre d'emploi
144 def voir_offre_emploi(self, obj):
145 return "<a href='%s?id=%s'>Voir l'offre d'emploi</a> \
146 " % (reverse('admin:recrutement_offreemploi_changelist'),
147 obj.offre_emploi.id)
148 voir_offre_emploi.allow_tags = True
149 voir_offre_emploi.short_description = "Afficher l'offre d'emploi"
150
151 """ # Afficher note poster par l'évaluateur
152 def note_evaluateur(self, obj):
153 import pdb;pdb.set_trace()
154 evaluateur = UserProfile.objects.get(user=obj.user)
155 import pdb;pdb.set_trace()
156 note_eval = CandidatEvaluation.objects.filter(evaluateur=evaluateur,
157 candidat=obj.user)
158 return "blabla"
159 note_evaluateur.allow_tags = True
160 note_evaluateur.short_description = "Votre note"
161 """
162
163 # Calculer la moyenne des notes
164 def calculer_moyenne(self, obj):
165 evaluations = CandidatEvaluation.objects.filter(candidat=obj)
166 offre_emploi = obj.offre_emploi
167
168 notes = [evaluation.note for evaluation in evaluations.all() if evaluation.note is not None]
169
170 if len(notes) > 0 and offre_emploi.date_limite <= datetime.date.today():
171 moyenne_votes = float(sum(notes)) / len(notes)
172 else:
173 moyenne_votes = "Non disponible"
174 return moyenne_votes
175 calculer_moyenne.allow_tags = True
176 calculer_moyenne.short_description = "Moyenne des notes"
177
178 def get_form(self, request, obj=None, **kwargs):
179 """
180 Affiche la liste des offres d'emploi, seulement si le user
181 connecté possède un UserProfile
182 """
183 form = super(CandidatAdmin, self).get_form(request, obj, **kwargs)
184 if form.declared_fields.has_key('offre_emploi'):
185 region_field = form.declared_fields['offre_emploi']
186 else:
187 region_field = form.base_fields['offre_emploi']
188
189 try:
190 user = UserProfile.objects.get(user=request.user)
191 except UserProfile.DoesNotExist:
192 region_field.queryset = region_field.queryset.none()
193 return form
194
195 region_ids = [g.id for g in user.regions.all()]
196 region_field.queryset = OffreEmploi.objects.filter(region__in=region_ids)
197 return form
198
199 def queryset(self, obj):
200 """
201 Spécifie un queryset limité, autrement Django exécute un
202 select_related() sans paramètre, ce qui a pour effet de charger tous
203 les objets FK, sans limite de profondeur. Dès qu'on arrive, dans les
204 modèles de Region, il existe plusieurs boucles, ce qui conduit à la
205 génération d'une requête infinie.
206
207 """
208
209 qs = self.model._default_manager.get_query_set()
210 try:
211 user = UserProfile.objects.get(user=obj.user)
212 except UserProfile.DoesNotExist:
213 return qs.none()
214
215 ids = [c.id for c in user.candidats.all()]
216 return qs.select_related('candidats').filter(id__in=ids)
217
218 class CandidatPieceAdmin(admin.ModelAdmin):
219 list_display = ('nom', 'candidat', )
220
221 def queryset(self, request):
222 """
223 Spécifie un queryset limité, autrement Django exécute un
224 select_related() sans paramètre, ce qui a pour effet de charger tous
225 les objets FK, sans limite de profondeur. Dès qu'on arrive, dans les
226 modèles de Region, il existe plusieurs boucles, ce qui conduit à la
227 génération d'une requête infinie.
228 Affiche la liste de candidats que si le user connecté
229 possède un UserProfile
230 """
231 qs = self.model._default_manager.get_query_set()
232 return qs.select_related('candidat')
233
234 class EvaluateurAdmin(VersionAdmin):
235 fieldsets = (
236 (None, {'fields': ('user', 'regions')}),
237 (None, {'fields': ('candidats',)}),
238 )
239
240 def get_form(self, request, obj=None, **kwargs):
241 """
242 Affiche la liste des users, regions et candidats, seulement si le user
243 connecté possède un UserProfile
244 """
245 form = super(EvaluateurAdmin, self).get_form(request, obj, **kwargs)
246 if form.declared_fields.has_key('user'):
247 permission_field = form.declared_fields['user']
248 else:
249 permission_field = form.base_fields['user']
250
251 if form.declared_fields.has_key('regions'):
252 region_field = form.declared_fields['regions']
253 else:
254 region_field = form.base_fields['regions']
255
256 if form.declared_fields.has_key('candidats'):
257 candidats_field = form.declared_fields['candidats']
258 else:
259 candidats_field = form.base_fields['candidats']
260
261 try:
262 user = UserProfile.objects.get(user=request.user)
263 except UserProfile.DoesNotExist:
264 region_field.queryset = Region.objects.none()
265 permission_field.queryset = UserProfile.objects.none()
266 candidats_field.queryset = Candidat.objects.none()
267 return form
268
269 return form
270
271 def queryset(self, request):
272 """
273 Affiche la liste d'évaluateur que si le user connecté
274 possède un UserProfile
275 """
276 qs = self.model._default_manager.get_query_set()
277 try:
278 user = UserProfile.objects.get(user=request.user)
279 except UserProfile.DoesNotExist:
280 return qs.none()
281
282 return qs
283
284 class CandidatEvaluationAdmin(VersionAdmin):
285 list_display = ('candidat', 'evaluateur', 'note', 'commentaire', 'date', )
286
287 def get_form(self, request, obj=None, **kwargs):
288 """
289 Affiche la liste des candidats et évaluateur, seulement si le user
290 connecté possède un UserProfile
291 """
292 form = super(CandidatEvaluationAdmin, self).get_form(request, obj,
293 **kwargs)
294 if form.declared_fields.has_key('evaluateur'):
295 evaluateur_field = form.declared_fields['evaluateur']
296 else:
297 evaluateur_field = form.base_fields['evaluateur']
298
299 if form.declared_fields.has_key('candidat'):
300 candidats_field = form.declared_fields['candidat']
301 else:
302 candidats_field = form.base_fields['candidat']
303
304 try:
305 user = UserProfile.objects.get(user=request.user)
306 except UserProfile.DoesNotExist:
307 evaluateur_field.queryset = UserProfile.objects.none()
308 candidats_field.queryset = Candidat.objects.none()
309 return form
310
311 return form
312
313 def queryset(self, request):
314 """
315 Affiche la liste d'évaluation que si le user connecté
316 possède un UserProfile
317 """
318 qs = self.model._default_manager.get_query_set()
319 try:
320 user = UserProfile.objects.get(user=request.user)
321 except UserProfile.DoesNotExist:
322 return qs.none()
323
324 return qs.select_related('candidat')
325
326 admin.site.register(OffreEmploi, OffreEmploiAdmin)
327 admin.site.register(Candidat, CandidatAdmin)
328 admin.site.register(UserProfile, EvaluateurAdmin)