1503: Permettre aux évaluateurs d'entrer des notes/commentaires sur les candidatures
authornilovna.bascunan-vasquez <nilovna.bascunan-vasquez@localhost.localdomain>
Thu, 2 Jun 2011 17:44:16 +0000 (13:44 -0400)
committernilovna.bascunan-vasquez <nilovna.bascunan-vasquez@localhost.localdomain>
Thu, 2 Jun 2011 17:44:16 +0000 (13:44 -0400)
project/recrutement/admin.py
project/recrutement/models.py
project/recrutement/views.py
project/urls.py

index a74162e..be50271 100644 (file)
@@ -12,8 +12,8 @@ class OffreEmploiAdmin(admin.ModelAdmin):
     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"   
 
@@ -37,7 +37,7 @@ class EvaluateurInline(admin.TabularInline):
 
 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', {
@@ -63,12 +63,18 @@ class CandidatAdmin(admin.ModelAdmin):
 
     # 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
@@ -78,8 +84,8 @@ class CandidatAdmin(admin.ModelAdmin):
         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"
 
@@ -104,7 +110,17 @@ class EvaluateurAdmin(admin.ModelAdmin):
     )
 
 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)
index 1a8e405..2a06ee6 100755 (executable)
@@ -10,6 +10,13 @@ import settings
 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.
@@ -113,7 +120,7 @@ class CandidatPiece(models.Model):
         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)
@@ -126,6 +133,6 @@ class CandidatEvaluation(models.Model):
                 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)  
index 486f0b9..f9a1d5e 100755 (executable)
@@ -14,9 +14,29 @@ def index(request):
     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():
index 231f396..c33e5aa 100644 (file)
@@ -20,6 +20,7 @@ urlpatterns = patterns(
     (r'^recrutement/', include('project.recrutement.urls')),
     url(r'^recrutement/affecter_evaluateurs_candidats/$', 'recrutement.views.affecter_evaluateurs_candidats', 
         name='affecter_evaluateurs_candidats'),
+    url(r'^recrutement/evaluer_candidat/$', 'recrutement.views.evaluer_candidat', name='evaluer_candidat'),
     (r'^', include('project.rh.urls')),
     (r'^prive/(?P<path>.*)$', 'django.views.static.serve', {'document_root': settings.PRIVE_MEDIA_ROOT}),
 )