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 |
38df74bb |
6 | from django.shortcuts import get_object_or_404 |
7 | |
6067184b |
8 | from reversion.admin import VersionAdmin |
38df74bb |
9 | from datamaster_modeles.models import Employe, Implantation, Region |
6067184b |
10 | |
df59fcab |
11 | from recrutement.models import * |
12 | |
d2b30f5f |
13 | class OffreEmploiAdmin(VersionAdmin): |
7f9e891e |
14 | date_hierarchy = 'date_creation' |
ec517164 |
15 | list_display = ('nom', 'resume', 'date_limite', 'region', '_candidatsList') |
38df74bb |
16 | |
8941aee7 |
17 | # Afficher la liste des candidats pour l'offre d'emploi |
596fe324 |
18 | def _candidatsList(self, obj): |
8ea41642 |
19 | return "<a href='%s?offre_emploi__id__exact=%s'>Voir les candidats \ |
20 | </a>" % (reverse('admin:recrutement_candidat_changelist'), obj.id) |
2f78949d |
21 | _candidatsList.allow_tags = True |
22 | _candidatsList.short_description = "Liste des candidats" |
362a3534 |
23 | |
7d82fd33 |
24 | |
f6749f29 |
25 | def get_form(self, request, obj=None, **kwargs): |
d835c9f3 |
26 | """ |
27 | Affiche la liste des régions, seulement si le user |
28 | connecté possède un UserProfile |
29 | """ |
f6749f29 |
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 | |
d835c9f3 |
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 | |
f6749f29 |
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 | |
2f78949d |
46 | def queryset(self, request): |
d835c9f3 |
47 | """ |
48 | N'affiche la liste de candidats que si le user connecté |
49 | possède un UserProfile |
2f78949d |
50 | """ |
51 | qs = self.model._default_manager.get_query_set() |
3bcef02d |
52 | try: |
53 | user = UserProfile.objects.get(user=request.user) |
54 | except UserProfile.DoesNotExist: |
55 | return qs.none() |
4e8e178f |
56 | |
3bcef02d |
57 | region_ids = [g.id for g in user.regions.all()] |
f6749f29 |
58 | return qs.select_related('offre_emploi').filter(region__in=region_ids) |
362a3534 |
59 | |
cced6a23 |
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" |
74cbc7a7 |
68 | verbose_name_plural = "pièces jointes" |
cced6a23 |
69 | |
170c9aa2 |
70 | class CandidatPieceInline(admin.TabularInline): |
cced6a23 |
71 | model = ProxyCandidatPiece |
72 | fields = ('candidat', 'nom', 'path', ) |
170c9aa2 |
73 | extra = 1 |
74 | |
cced6a23 |
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 | |
eb579d40 |
84 | class EvaluateurInline(admin.TabularInline): |
cced6a23 |
85 | model = ProxyEvaluateur |
eb579d40 |
86 | extra = 1 |
87 | |
d2b30f5f |
88 | class CandidatAdmin(VersionAdmin): |
7f9e891e |
89 | date_hierarchy = 'date_creation' |
0fd8a26d |
90 | list_display = ('nom', 'prenom', 'offre_emploi','statut', |
8941aee7 |
91 | 'voir_offre_emploi', 'evaluer_candidat', #'note_evaluateur', |
92 | 'calculer_moyenne', 'afficher_candidat',) |
8ea41642 |
93 | list_filter = ('offre_emploi', ) |
7f9e891e |
94 | fieldsets = ( |
4896b661 |
95 | ("Offre d'emploi", { |
96 | 'fields': ('offre_emploi', ) |
97 | }), |
7f9e891e |
98 | ('Informations personnelles', { |
99 | 'fields': ('prenom','nom','genre', 'nationalite', 'date_naissance', |
100 | 'situation_famille', 'nombre_dependant',) |
101 | }), |
ec517164 |
102 | ('Coordonnées', { |
103 | 'fields': ('telephone', 'email', 'adresse', 'ville', |
104 | 'etat_province', 'code_postal', 'pays', ) |
7f9e891e |
105 | }), |
106 | ('Informations professionnelles', { |
4896b661 |
107 | 'fields': ('niveau_diplome','employeur_actuel', |
8ea41642 |
108 | 'poste_actuel', 'domaine_professionnel',) |
7f9e891e |
109 | }), |
110 | ('Options avancées', { |
111 | 'classes': ('collapse',), |
112 | 'fields': ('actif', 'statut', ) |
113 | }), |
114 | ) |
170c9aa2 |
115 | inlines = [ |
116 | CandidatPieceInline, |
eb579d40 |
117 | EvaluateurInline, |
170c9aa2 |
118 | ] |
f9983b5a |
119 | |
0fd8a26d |
120 | actions = ['affecter_candidats_evaluateur'] |
362a3534 |
121 | # Affecter un évaluateurs à des candidats |
7061f835 |
122 | def affecter_candidats_evaluateur(modeladmin, obj, candidats): |
596fe324 |
123 | selected = obj.POST.getlist(admin.ACTION_CHECKBOX_NAME) |
2adf9e0c |
124 | |
8ea41642 |
125 | return HttpResponseRedirect(reverse('affecter_evaluateurs_candidats')+ |
126 | "?ids=%s" % (",".join(selected))) |
d835c9f3 |
127 | affecter_candidats_evaluateur.short_description = u'Affecter évaluateur' |
362a3534 |
128 | |
05503d56 |
129 | # Évaluer un candidat |
596fe324 |
130 | def evaluer_candidat(self, obj): |
8ea41642 |
131 | return "<a href='%s?id=%s'>Évaluer le candidat \ |
132 | </a>" % (reverse('evaluer_candidat'), obj.id) |
596fe324 |
133 | evaluer_candidat.allow_tags = True |
d835c9f3 |
134 | evaluer_candidat.short_description = 'Évaluer' |
596fe324 |
135 | |
7d82fd33 |
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 | |
8941aee7 |
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 | |
4896b661 |
178 | def get_form(self, request, obj=None, **kwargs): |
d835c9f3 |
179 | """ |
180 | Affiche la liste des offres d'emploi, seulement si le user |
181 | connecté possède un UserProfile |
182 | """ |
4896b661 |
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()] |
05503d56 |
196 | region_field.queryset = OffreEmploi.objects.filter(region__in=region_ids) |
4896b661 |
197 | return form |
198 | |
596fe324 |
199 | def queryset(self, obj): |
f9983b5a |
200 | """ |
8ea41642 |
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. |
d835c9f3 |
206 | |
f9983b5a |
207 | """ |
2adf9e0c |
208 | |
f9983b5a |
209 | qs = self.model._default_manager.get_query_set() |
3bcef02d |
210 | try: |
211 | user = UserProfile.objects.get(user=obj.user) |
212 | except UserProfile.DoesNotExist: |
213 | return qs.none() |
214 | |
2adf9e0c |
215 | ids = [c.id for c in user.candidats.all()] |
216 | return qs.select_related('candidats').filter(id__in=ids) |
df59fcab |
217 | |
2e9ee615 |
218 | class CandidatPieceAdmin(admin.ModelAdmin): |
170c9aa2 |
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. |
d835c9f3 |
228 | Affiche la liste de candidats que si le user connecté |
229 | possède un UserProfile |
170c9aa2 |
230 | """ |
231 | qs = self.model._default_manager.get_query_set() |
232 | return qs.select_related('candidat') |
2e9ee615 |
233 | |
d2b30f5f |
234 | class EvaluateurAdmin(VersionAdmin): |
eb579d40 |
235 | fieldsets = ( |
3b4bfad3 |
236 | (None, {'fields': ('user', 'regions')}), |
eb579d40 |
237 | (None, {'fields': ('candidats',)}), |
238 | ) |
4418c732 |
239 | |
d835c9f3 |
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 | |
d835c9f3 |
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 | |
d2b30f5f |
284 | class CandidatEvaluationAdmin(VersionAdmin): |
596fe324 |
285 | list_display = ('candidat', 'evaluateur', 'note', 'commentaire', 'date', ) |
286 | |
d835c9f3 |
287 | def get_form(self, request, obj=None, **kwargs): |
596fe324 |
288 | """ |
d835c9f3 |
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 |
596fe324 |
317 | """ |
318 | qs = self.model._default_manager.get_query_set() |
d835c9f3 |
319 | try: |
320 | user = UserProfile.objects.get(user=request.user) |
321 | except UserProfile.DoesNotExist: |
322 | return qs.none() |
323 | |
a7b36f5a |
324 | return qs.select_related('candidat') |
4418c732 |
325 | |
df59fcab |
326 | admin.site.register(OffreEmploi, OffreEmploiAdmin) |
327 | admin.site.register(Candidat, CandidatAdmin) |
f6749f29 |
328 | admin.site.register(UserProfile, EvaluateurAdmin) |