Finalisation du tableau de bords pour les évaluateurs
[auf_rh_dae.git] / project / recrutement / admin.py
index 0c47c9a..0720ec2 100644 (file)
@@ -24,13 +24,20 @@ class OffreEmploiAdmin(VersionAdmin):
     _candidatsList.short_description = "Afficher la liste des candidats"
 
     def queryset(self, request):
-        qs = self.model._default_manager.get_query_set()
+        query = self.model._default_manager.get_query_set()
         # Si user est superuser afficher toutes les offres d'emploi  
         user_groupes = request.user.groups.all()
         if not grp_drh_recrutement in user_groupes:
-            # Si le user n'est ni un évaluateur ni un administrateur régional,
-            # retourner none
-            # Vérifier groupes
+            """
+            Filtrer les offre d'emploi pour afficher seulement les offres 
+            d'emploi actives
+            """
+            qs = query.filter(date_limite__gte=datetime.date.today())
+            """
+            Si le user n'est ni un évaluateur ni un administrateur régional,
+            retourner none
+            Vérifier groupes
+            """
             if grp_evaluateurs_recrutement in user_groupes:
                 user = Evaluateur.objects.get(user=request.user)               
             elif grp_administrateurs_recrutement in user_groupes: 
@@ -42,15 +49,13 @@ class OffreEmploiAdmin(VersionAdmin):
                 region_ids = [g.id for g in user.regions.all()]
                 return qs.select_related('offre_emploi').\
                         filter(region__in=region_ids)
-            if type(user) is Evaluateur:   
-                
+            if type(user) is Evaluateur:        
                 candidats = [g for g in user.candidats.all()]
-                offre_emploi_ids = [offre.id for offre in candidats]
+                offre_emploi_ids = [c.offre_emploi.id for c in candidats]
                 return qs.select_related('offre_emploi').\
-                        filter(id__in=offre_emploi_ids)
-            
+                        filter(id__in=offre_emploi_ids)            
             return qs.none()
-        return qs.select_related('offre_emploi')
+        return query.select_related('offre_emploi')
 
     def has_change_permission(self, request, obj=None):
         user_groupes = request.user.groups.all()
@@ -60,7 +65,7 @@ class OffreEmploiAdmin(VersionAdmin):
         return False   
 
 class ProxyOffreEmploiAdmin(OffreEmploiAdmin):
-    list_display = ('nom', 'resume', 'date_limite', 'region', '_candidatsList', )
+    list_display = ('nom', 'resume', 'date_limite', 'region', )
     readonly_fields = ('actif', 'description', 'poste', 'bureau',
                         'duree_affectation', 'renumeration',
                         'debut_affectation', 'lieu_affectation', 'nom',
@@ -88,17 +93,11 @@ class ProxyOffreEmploiAdmin(OffreEmploiAdmin):
 
     def has_change_permission(self, request, obj=None):
         user_groupes = request.user.groups.all()
-        if grp_evaluateurs_recrutement in user_groupes:
+        if grp_evaluateurs_recrutement in user_groupes or \
+            grp_drh_recrutement in user_groupes:
             return True
         return False   
 
-    def _candidatsList(self, obj):     
-        return "<a href='%s?offre_emploi__id__exact=%s'>Voir les candidats \
-            </a>" % (reverse('admin:recrutement_proxycandidat_changelist'), 
-                                obj.id)
-    _candidatsList.allow_tags = True 
-    _candidatsList.short_description = "Afficher la liste des candidats"   
-
 class ProxyCandidatPiece(CandidatPiece):
     """
     Ce proxy sert uniquement dans l'admin à disposer d'un libellé
@@ -178,16 +177,18 @@ class CandidatAdmin(VersionAdmin):
     envoyer_courriel_candidats.short_description = u'Envoyer courriel'
 
     # Évaluer un candidat
+    # TODO: Revérifier, si c'est mieux de rediriger vers Évaluation candidat et ensuite
+    #        permettre l'évaluation ou laisser le reverse(evaluer_candidat)
     def evaluer_candidat(self, obj):
-        return "<a href='%s?id=%s'>Évaluer le candidat \
-                </a>" % (reverse('evaluer_candidat'), obj.id)
+        return "<a href='%s?candidat__id__exact=%s'>Évaluer le candidat </a>" % \
+            (reverse('admin:recrutement_candidatevaluation_changelist'), 
+            obj.id)
     evaluer_candidat.allow_tags = True    
-    evaluer_candidat.short_description = 'Note du candidat'
+    evaluer_candidat.short_description = 'Évaluation'
 
     # Afficher un candidat
     def afficher_candidat(self, obj):
-        return "<a href='%s'>Voir le candidat </a>" \
-            % (reverse('admin:recrutement_proxycandidat_change', args=(obj.id,)))
+        return "<a href='%s'>Voir le candidat</a>" % (reverse('admin:recrutement_proxycandidat_change', args=(obj.id,)))
     afficher_candidat.allow_tags = True    
     afficher_candidat.short_description = u'Afficher les détails du candidat'
 
@@ -199,18 +200,6 @@ class CandidatAdmin(VersionAdmin):
     voir_offre_emploi.allow_tags = True
     voir_offre_emploi.short_description = "Afficher l'offre d'emploi"
 
-    """    # Afficher note poster par l'évaluateur
-    def note_evaluateur(self, obj):
-        import pdb;pdb.set_trace()
-        evaluateur = Evaluateur.objects.get(user=obj.user)
-        import pdb;pdb.set_trace()
-        note_eval = CandidatEvaluation.objects.filter(evaluateur=evaluateur, 
-                        candidat=obj.user)
-        return "blabla"
-    note_evaluateur.allow_tags = True
-    note_evaluateur.short_description = "Votre note"        
-    """
-
     # Calculer la moyenne des notes
     def calculer_moyenne(self, obj):
         evaluations = CandidatEvaluation.objects.filter(candidat=obj)
@@ -276,9 +265,6 @@ class CandidatAdmin(VersionAdmin):
         return qs.select_related('candidats')         
 
 class ProxyCandidatAdmin(CandidatAdmin):
-    #TODO: init boucler sur les fields pour le readonly
-    list_display = ('nom', 'prenom','statut', 'offre_emploi',
-                    'voir_offre_emploi', 'evaluer_candidat', 'afficher_candidat')#'note_evaluateur',)
     readonly_fields = ('statut', 'offre_emploi', 'prenom', 'nom',
                         'genre', 'nationalite', 'date_naissance',
                         'situation_famille', 'nombre_dependant', 'telephone',
@@ -313,7 +299,9 @@ class ProxyCandidatAdmin(CandidatAdmin):
 
     def has_change_permission(self, request, obj=None):
         user_groupes = request.user.groups.all()
-        if grp_evaluateurs_recrutement in user_groupes:
+        if grp_drh_recrutement in user_groupes or \
+            grp_administrateurs_recrutement in user_groupes or \
+            grp_evaluateurs_recrutement in user_groupes:
             return True
         return False   
 
@@ -339,39 +327,79 @@ class EvaluateurAdmin(VersionAdmin):
         #(None, {'fields': ('candidats',)}),
     )
 
-    # Peut-être qu'on peut enlever cette def, à cause des permissions
-    def queryset(self, request):
-        """ 
-        Affiche la liste d'évaluateur que si le user connecté 
-        possède un Evaluateur
-        """
-        user_groupes = request.user.groups.all()
-        if grp_drh_recrutement in user_groupes:
-           return self.model._default_manager.get_query_set() 
-
-        return qs.none()
-
 class AdministrateurRegionalAdmin(VersionAdmin):
     pass
 
 class CandidatEvaluationAdmin(VersionAdmin):
-    list_display = ('candidat', 'offre_emploi_candidat', 'evaluateur', 'note', 
-                    'commentaire',  'date',)
+    list_display = ('_offre_emploi', '_candidat', '_note', '_commentaire', 
+                    'evaluateur',)
+    readonly_fields = ('candidat', 'evaluateur')
+    fieldsets = (
+        ('Évaluation du candidat', {
+            'fields': ('candidat', 'evaluateur', 'note', 'commentaire', )        
+        }),
+    )
+
+    def _note(self, obj):
+        """
+        Si l'évaluateur n'a pas encore donné de note au candidat, indiquer
+        un lien pour Évaluer le candidat.
+        Sinon afficher la note.
+        """
+        if obj.note is None:
+            return "<a href='%s'>Évaluer le candidat </a>" % \
+                (reverse('admin:recrutement_candidatevaluation_change', 
+                args=(obj.candidat.id,)))
+        return obj.note
+    _note.allow_tags = True
+    _note.short_description = "Votre note"    
+    _note.admin_order_field = 'note'    
+
+    def _candidat(self, obj):
+        return "<a href='%s'>%s</a>" \
+            % (reverse('admin:recrutement_proxycandidat_change', 
+                        args=(obj.candidat.id,)), obj.candidat)
+    _candidat.allow_tags = True    
+    _candidat.short_description = 'Candidat'
+
+    def _commentaire(self, obj):
+        """
+        Si l'évaluateur n'a pas encore donné de note au candidat, indiquer
+        dans le champ commentaire, Aucun au lieu de (None)
+        Sinon afficher la note.
+        """
+        if obj.commentaire is None:
+            return "Aucun"
+        return obj.commentaire
+    _commentaire.allow_tags = True
+    _commentaire.short_description = "Commentaire"   
 
-    def offre_emploi_candidat(self, obj):
-        return obj.candidat.offre_emploi
 
+    def _offre_emploi(self, obj):
+        return "<a href='%s'>%s</a>" % \
+        (reverse('admin:recrutement_proxyoffreemploi_change', 
+                args=(obj.candidat.offre_emploi.id,)), obj.candidat.offre_emploi)
+    _offre_emploi.allow_tags = True
+    _offre_emploi.short_description = "Voir offre d'emploi"
+    _offre_emploi.admin_order_field = 'offre_emploi'
+    
     def queryset(self, request):
-        evaluateur = Evaluateur.objects.get(user=request.user)
-        candidats = Candidat.objects.filter(evaluateurs=evaluateur) 
-        candidats_evaluations = CandidatEvaluation.objects.\
-                                filter(evaluateur=evaluateur, 
-                                candidat__in=candidats)
+        """
+        Afficher uniquement les évaluations de l'évaluateur, sauf si 
+        l'utilisateur est super admin.
+        """
         qs = self.model._default_manager.get_query_set()
+        user_groupes = request.user.groups.all()
+        if grp_drh_recrutement in user_groupes:
+            return qs.select_related('offre_emploi')
+
+        evaluateur = Evaluateur.objects.get(user=request.user) 
+        candidats_evaluations = CandidatEvaluation.objects.\
+                                filter(evaluateur=evaluateur)
         candidats_evaluations_ids = [ce.id for ce in \
                                         candidats_evaluations.all()]
-        return qs.select_related('offre_emploi')#.\
-        #filter(id__in=candidats_evaluations_ids)
+        return qs.select_related('offre_emploi').\
+                filter(id__in=candidats_evaluations_ids)
 
 class CourrielTemplateAdmin(VersionAdmin):
     pass
@@ -379,8 +407,8 @@ class CourrielTemplateAdmin(VersionAdmin):
 admin.site.register(OffreEmploi, OffreEmploiAdmin)
 admin.site.register(Candidat, CandidatAdmin)
 admin.site.register(CandidatEvaluation, CandidatEvaluationAdmin)
-admin.site.register(CourrielTemplate, CourrielTemplateAdmin)
+#admin.site.register(CourrielTemplate, CourrielTemplateAdmin)
 admin.site.register(Evaluateur, EvaluateurAdmin)
-admin.site.register(AdministrateurRegional, AdministrateurRegionalAdmin)
+#admin.site.register(AdministrateurRegional, AdministrateurRegionalAdmin)
 admin.site.register(ProxyOffreEmploi, ProxyOffreEmploiAdmin)
 admin.site.register(ProxyCandidat, ProxyCandidatAdmin)