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