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