list_display = ('nom', 'resume', 'date_limite', '_candidatsList', )
list_filter = ('region',)
- def _candidatsList(self, request):
- return "<a href='%s?offre_emploi__id__exact=%s'>Voir les candidats</a>" % (reverse('admin:recrutement_candidat_changelist'), request.id)
+ def _candidatsList(self, obj):
+ return "<a href='%s?offre_emploi__id__exact=%s'>Voir les candidats</a>" % (reverse('admin:recrutement_candidat_changelist'), obj.id)
_candidatsList.allow_tags = True
_candidatsList.short_description = "Liste des candidats"
class CandidatAdmin(admin.ModelAdmin):
date_hierarchy = 'date_creation'
- list_display = ('nom', 'prenom', 'offre_emploi','statut', '_actions')
+ list_display = ('nom', 'prenom', 'offre_emploi','statut', '_actions', 'evaluer_candidat')
list_filter = ('offre_emploi',)
fieldsets = (
('Informations personnelles', {
# Affecter un évaluateurs à des candidats
actions = ['affecter_candidats_evaluateur']
- def affecter_candidats_evaluateur(modeladmin, request, queryset):
- selected = request.POST.getlist(admin.ACTION_CHECKBOX_NAME)
+ def affecter_candidats_evaluateur(modeladmin, obj):
+ selected = obj.POST.getlist(admin.ACTION_CHECKBOX_NAME)
return HttpResponseRedirect(reverse('affecter_evaluateurs_candidats')+"?ids=%s" % (",".join(selected)))
affecter_candidats_evaluateur.short_description = "Affecter evaluateur"
- def queryset(self, request):
+
+ def evaluer_candidat(self, obj):
+ return "<a href='%s?id=%s'>Évaluer le candidat</a>" % (reverse('evaluer_candidat'), obj.id)
+ evaluer_candidat.allow_tags = True
+ evaluer_candidat.short_description = "Évaluer"
+
+ def queryset(self, obj):
"""
Spécifie un queryset limité, autrement Django exécute un select_related()
sans paramètre, ce qui a pour effet de charger tous les objets FK, sans limite
qs = self.model._default_manager.get_query_set()
return qs.select_related('offre_emploi')
- def _actions(self, request):
- return "<a href='%s?id=%s'>Voir l'offre d'emploi</a>" % (reverse('admin:recrutement_offreemploi_changelist'), request.offre_emploi.id)
+ def _actions(self, obj):
+ return "<a href='%s?id=%s'>Voir l'offre d'emploi</a>" % (reverse('admin:recrutement_offreemploi_changelist'), obj.offre_emploi.id)
_actions.allow_tags = True
_actions.short_description = "Offre d'emploi"
)
class CandidatEvaluationAdmin(admin.ModelAdmin):
- pass
+ list_display = ('candidat', 'evaluateur', 'note', 'commentaire', 'date', )
+
+ def queryset(self, obj):
+ """
+ Spécifie un queryset limité, autrement Django exécute un select_related()
+ sans paramètre, ce qui a pour effet de charger tous les objets FK, sans limite
+ de profondeur. Dès qu'on arrive, dans les modèles de Region, il existe plusieurs
+ boucles, ce qui conduit à la génération d'une requête infinie.
+ """
+ qs = self.model._default_manager.get_query_set()
+ return qs.select_related('offre_emploi')
admin.site.register(OffreEmploi, OffreEmploiAdmin)
admin.site.register(Candidat, CandidatAdmin)
import datamaster_modeles.models as ref
from project.rh import models as rh
+### CONSTANTES
+#NOTES
+NOTE_MIN = 1
+NOTE_RANGE = 1
+NOTE_MAX = 10
+NOTES = [(i, i) for i in range(NOTE_MIN, NOTE_MAX, NOTE_RANGE)]
+
# Abstracts
class Metadata(models.Model):
"""Méta-données AUF.
return '%s' % (self.nom)
class Evaluateur(models.Model):
- candidats = models.ManyToManyField(Candidat, verbose_name='Dossiers',
+ candidats = models.ManyToManyField(Candidat, verbose_name='Candidats',
related_name="evaluateurs", blank=True, null=True,)
nom = models.CharField(max_length=255)
prenom = models.CharField(max_length=255)
related_name='+')
evaluateur = models.ForeignKey(Evaluateur, db_column='evaluateur',
related_name='+')
- note = models.IntegerField()
+ note = models.IntegerField(choices=NOTES, blank=True, null=True)
commentaire = models.TextField(null=True, blank=True)
date = models.DateField(auto_now_add=True)
return render_to_response('recrutement/index.html', {},
RequestContext(request))
+def evaluer_candidat(request):
+ candidat = get_object_or_404(Candidat, id__in=request.GET.get('id'))
+
+ if request.method == "POST":
+ candidat_evaluation = CandidatEvaluation()
+ candidat_evaluation.candidat = candidat
+ form = CandidatEvaluationForm(request.POST, instance=candidat_evaluation, candidat=candidat)
+ if form.is_valid():
+ form.save()
+ messages.add_message(request, messages.SUCCESS,
+ "Le commentaire et la note ont été affectés \
+ au candidat.")
+ return redirect("admin:recrutement_candidat_changelist")
+ else:
+ form = CandidatEvaluationForm(candidat=candidat)
+
+ c = {'form' : form}
+ return render_to_response("recrutement/evaluer_candidat.html", Context(c), \
+ context_instance = RequestContext(request))
+
def affecter_evaluateurs_candidats(request):
candidat_ids = request.GET.get('ids').split(',')
- candidats = Candidat.objects.filter(id__in=candidat_ids)
+ candidats = get_object_or_404(Candidat, id__in=candidat_ids)
if request.method == "POST":
form = EvaluateurForm(request.POST, candidats=candidats)
if form.is_valid():