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' |
2f78949d |
15 | list_display = ('nom', 'resume', 'date_limite', '_candidatsList', ) |
7f9e891e |
16 | list_filter = ('region',) |
38df74bb |
17 | |
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 | |
2f78949d |
24 | def queryset(self, request): |
25 | """ |
8ea41642 |
26 | Spécifie un queryset limité, autrement Django exécute un |
27 | select_related() sans paramètre, ce qui a pour effet de charger tous |
28 | les objets FK, sans limite de profondeur. Dès qu'on arrive, dans les |
29 | modèles de Region, il existe plusieurs boucles, ce qui conduit à la |
30 | génération d'une requête infinie. |
2f78949d |
31 | """ |
f083eee0 |
32 | # user_email = request.user.email |
33 | # user = get_object_or_404(Employe, courriel=user_email) |
34 | # user_implantation = user.implantation |
35 | # implantation_region = get_object_or_404(Implantation, |
36 | # id=user_implantation.id) |
37 | # user_region = get_object_or_404(Region, |
38 | # id=implantation_region.region.id) |
2f78949d |
39 | qs = self.model._default_manager.get_query_set() |
f083eee0 |
40 | return qs.select_related('offre_emploi')#.filter(region=user_region.id) |
362a3534 |
41 | |
170c9aa2 |
42 | class CandidatPieceInline(admin.TabularInline): |
43 | model = CandidatPiece |
44 | extra = 1 |
45 | |
eb579d40 |
46 | class EvaluateurInline(admin.TabularInline): |
f083eee0 |
47 | model = User.candidats.through |
eb579d40 |
48 | extra = 1 |
49 | |
d2b30f5f |
50 | class CandidatAdmin(VersionAdmin): |
7f9e891e |
51 | date_hierarchy = 'date_creation' |
8ea41642 |
52 | list_display = ('nom', 'prenom', 'offre_emploi','statut', '_actions', |
53 | 'evaluer_candidat', ) |
54 | list_filter = ('offre_emploi', ) |
7f9e891e |
55 | fieldsets = ( |
56 | ('Informations personnelles', { |
57 | 'fields': ('prenom','nom','genre', 'nationalite', 'date_naissance', |
58 | 'situation_famille', 'nombre_dependant',) |
59 | }), |
60 | ('Adresse', { |
61 | 'fields': ('adresse', 'ville', 'etat_province', 'pays', ) |
62 | }), |
63 | ('Informations professionnelles', { |
8ea41642 |
64 | 'fields': ('offre_emploi','niveau_diplome','employeur_actuel', |
65 | 'poste_actuel', 'domaine_professionnel',) |
7f9e891e |
66 | }), |
67 | ('Options avancées', { |
68 | 'classes': ('collapse',), |
69 | 'fields': ('actif', 'statut', ) |
70 | }), |
71 | ) |
170c9aa2 |
72 | inlines = [ |
73 | CandidatPieceInline, |
eb579d40 |
74 | EvaluateurInline, |
170c9aa2 |
75 | ] |
f9983b5a |
76 | |
362a3534 |
77 | # Affecter un évaluateurs à des candidats |
78 | actions = ['affecter_candidats_evaluateur'] |
2adf9e0c |
79 | def affecter_candidats_evaluateur(modeladmin, obj, candidats): |
80 | |
596fe324 |
81 | selected = obj.POST.getlist(admin.ACTION_CHECKBOX_NAME) |
2adf9e0c |
82 | |
8ea41642 |
83 | return HttpResponseRedirect(reverse('affecter_evaluateurs_candidats')+ |
84 | "?ids=%s" % (",".join(selected))) |
362a3534 |
85 | affecter_candidats_evaluateur.short_description = "Affecter evaluateur" |
86 | |
596fe324 |
87 | def evaluer_candidat(self, obj): |
8ea41642 |
88 | return "<a href='%s?id=%s'>Évaluer le candidat \ |
89 | </a>" % (reverse('evaluer_candidat'), obj.id) |
596fe324 |
90 | evaluer_candidat.allow_tags = True |
91 | evaluer_candidat.short_description = "Évaluer" |
92 | |
93 | def queryset(self, obj): |
f9983b5a |
94 | """ |
8ea41642 |
95 | Spécifie un queryset limité, autrement Django exécute un |
96 | select_related() sans paramètre, ce qui a pour effet de charger tous |
97 | les objets FK, sans limite de profondeur. Dès qu'on arrive, dans les |
98 | modèles de Region, il existe plusieurs boucles, ce qui conduit à la |
99 | génération d'une requête infinie. |
f9983b5a |
100 | """ |
2adf9e0c |
101 | |
f9983b5a |
102 | qs = self.model._default_manager.get_query_set() |
2adf9e0c |
103 | user = get_object_or_404(User,user=obj.user) |
104 | ids = [c.id for c in user.candidats.all()] |
105 | return qs.select_related('candidats').filter(id__in=ids) |
df59fcab |
106 | |
596fe324 |
107 | def _actions(self, obj): |
8ea41642 |
108 | return "<a href='%s?id=%s'>Voir l'offre d'emploi</a> \ |
109 | " % (reverse('admin:recrutement_offreemploi_changelist'), |
110 | obj.offre_emploi.id) |
6067184b |
111 | _actions.allow_tags = True |
2f78949d |
112 | _actions.short_description = "Offre d'emploi" |
6067184b |
113 | |
2e9ee615 |
114 | class CandidatPieceAdmin(admin.ModelAdmin): |
170c9aa2 |
115 | list_display = ('nom', 'candidat', ) |
116 | |
117 | def queryset(self, request): |
118 | """ |
119 | Spécifie un queryset limité, autrement Django exécute un |
120 | select_related() sans paramètre, ce qui a pour effet de charger tous |
121 | les objets FK, sans limite de profondeur. Dès qu'on arrive, dans les |
122 | modèles de Region, il existe plusieurs boucles, ce qui conduit à la |
123 | génération d'une requête infinie. |
124 | """ |
125 | qs = self.model._default_manager.get_query_set() |
126 | return qs.select_related('candidat') |
2e9ee615 |
127 | |
d2b30f5f |
128 | class EvaluateurAdmin(VersionAdmin): |
eb579d40 |
129 | fieldsets = ( |
3b4bfad3 |
130 | (None, {'fields': ('user', 'regions')}), |
eb579d40 |
131 | (None, {'fields': ('candidats',)}), |
132 | ) |
4418c732 |
133 | |
d2b30f5f |
134 | class CandidatEvaluationAdmin(VersionAdmin): |
596fe324 |
135 | list_display = ('candidat', 'evaluateur', 'note', 'commentaire', 'date', ) |
136 | |
137 | def queryset(self, obj): |
138 | """ |
8ea41642 |
139 | Spécifie un queryset limité, autrement Django exécute un |
140 | select_related() sans paramètre, ce qui a pour effet de charger tous |
141 | les objets FK, sans limite de profondeur. Dès qu'on arrive, dans les |
142 | modèles de Region, il existe plusieurs boucles, ce qui conduit à la |
143 | génération d'une requête infinie. |
596fe324 |
144 | """ |
145 | qs = self.model._default_manager.get_query_set() |
146 | return qs.select_related('offre_emploi') |
4418c732 |
147 | |
df59fcab |
148 | admin.site.register(OffreEmploi, OffreEmploiAdmin) |
149 | admin.site.register(Candidat, CandidatAdmin) |
4418c732 |
150 | admin.site.register(CandidatPiece, CandidatPieceAdmin) |
f083eee0 |
151 | admin.site.register(User, EvaluateurAdmin) |
4418c732 |
152 | admin.site.register(CandidatEvaluation, CandidatEvaluationAdmin) |