Permissions des groupes, affichage de listes selon permissions
[auf_rh_dae.git] / project / recrutement / admin.py
index 06e2ccf..3dbbf98 100644 (file)
@@ -9,17 +9,19 @@ from reversion.admin import VersionAdmin
 from datamaster_modeles.models import Employe, Implantation, Region
 
 from recrutement.models import *
+from recrutement.workflow import grp_administrateurs_recrutement,\
+                            grp_evaluateurs_recrutement, grp_drh_recrutement
 
 class OffreEmploiAdmin(VersionAdmin):
     date_hierarchy = 'date_creation'
     list_display = ('nom', 'resume', 'date_limite', 'region', '_candidatsList')
-        
+
     # Afficher la liste des candidats pour l'offre d'emploi
     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"   
+    _candidatsList.short_description = "Afficher la liste des candidats"
 
     def queryset(self, request):
         """ 
@@ -27,13 +29,73 @@ class OffreEmploiAdmin(VersionAdmin):
         possède un Evaluateur
         """
         qs = self.model._default_manager.get_query_set()
-        try:
-            user = Evaluateur.objects.get(user=request.user)
-        except Evaluateur.DoesNotExist:
+        # 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
+            if grp_evaluateurs_recrutement in user_groupes:
+                user = Evaluateur.objects.get(user=request.user)               
+            elif grp_administrateurs_recrutement in user_groupes: 
+                user = AdministrateurRegional.objects.get(user=request.user)
+            else:
+                return qs.none()   
+                      
+            if type(user) is AdministrateurRegional:
+                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:   
+                
+                candidats = [g for g in user.candidats.all()]
+                offre_emploi_ids = [offre.id for offre in candidats]
+                return qs.select_related('offre_emploi').\
+                        filter(id__in=offre_emploi_ids)
+            
             return qs.none()
-        
-        region_ids = [g.id for g in user.regions.all()]
-        return qs.select_related('offre_emploi').filter(region__in=region_ids)
+        return qs.select_related('offre_emploi')
+
+    def has_change_permission(self, request, obj=None):
+        user_groupes = request.user.groups.all()
+        if grp_drh_recrutement in user_groupes or \
+            grp_administrateurs_recrutement in user_groupes:
+            return True
+        return False   
+
+class ProxyOffreEmploiAdmin(OffreEmploiAdmin):
+    list_display = ('nom', 'resume', 'date_limite', 'region', '_candidatsList', )
+    readonly_fields = ('actif', 'description', 'poste', 'bureau',
+                        'duree_affectation', 'renumeration',
+                        'debut_affectation', 'lieu_affectation', 'nom',
+                        'resume', 'date_limite', 'region')
+    fieldsets = (
+        (None, {
+            'fields': ('nom', )        
+        }),
+        (None, {
+            'fields': ('poste', 'resume','description', 'date_limite', )        
+        }),
+        (None, {
+            'fields': ('lieu_affectation', 'bureau', 'region', )
+        }),
+        (None, {
+            'fields': ('debut_affectation', 'duree_affectation',
+                        'renumeration', )
+        }),
+    )        
+    def has_add_permission(self, request):
+        return False
+
+    def has_delete_permission(self, request, obj=None):
+        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):
     """
@@ -122,9 +184,9 @@ class CandidatAdmin(VersionAdmin):
     # Afficher un candidat
     def afficher_candidat(self, obj):
         return "<a href='%s?id=%s'>Voir le candidat \
-                </a>" % (reverse('afficher_candidat'), obj.id)
+                </a>" % (reverse('recrutement_proxycandidat_change'), obj.id)
     afficher_candidat.allow_tags = True    
-    afficher_candidat.short_description = u'Afficher les détails'
+    afficher_candidat.short_description = u'Afficher les détails du candidat'
 
     # Voir l'offre d'emploi
     def voir_offre_emploi(self, obj):
@@ -151,7 +213,8 @@ class CandidatAdmin(VersionAdmin):
         evaluations = CandidatEvaluation.objects.filter(candidat=obj)
         offre_emploi = obj.offre_emploi
 
-        notes = [evaluation.note for evaluation in evaluations.all() if evaluation.note is not None]
+        notes = [evaluation.note for evaluation in evaluations.all() \
+                    if evaluation.note is not None]
  
         if len(notes) > 0 and offre_emploi.date_limite <= datetime.date.today():
             moyenne_votes = float(sum(notes)) / len(notes)
@@ -161,26 +224,26 @@ class CandidatAdmin(VersionAdmin):
     calculer_moyenne.allow_tags = True
     calculer_moyenne.short_description = "Moyenne des notes"
 
-    def get_form(self, request, obj=None, **kwargs):
-        """
-        Affiche la liste des offres d'emploi, seulement si le user
-        connecté possède un Evaluateur
-        """
-        form = super(CandidatAdmin, self).get_form(request, obj, **kwargs)
-        if form.declared_fields.has_key('offre_emploi'):
-            region_field = form.declared_fields['offre_emploi']
-        else:
-            region_field = form.base_fields['offre_emploi']
+    def add_delete_permission(self, request, obj=None) :
+        user_groupes = request.user.groups.all()
+        if grp_drh_recrutement in user_groupes or \
+            grp_administrateurs_recrutement in user_groupes:
+            return True
+        return False    
 
-        try:
-            user = Evaluateur.objects.get(user=request.user)
-        except Evaluateur.DoesNotExist:
-            region_field.queryset = region_field.queryset.none()
-            return form  
+    def has_add_permission(self, request):
+        return self.add_delete_permission(request, request)
 
-        region_ids = [g.id for g in user.regions.all()]
-        region_field.queryset = OffreEmploi.objects.filter(region__in=region_ids)
-        return form
+    def has_delete_permission(self, request, obj=None):
+        return self.add_delete_permission(request, request)
+
+    def has_change_permission(self, request, obj=None):
+        user_groupes = request.user.groups.all()
+        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   
 
     def queryset(self, obj):
         """
@@ -191,15 +254,50 @@ class CandidatAdmin(VersionAdmin):
         génération d'une requête infinie.
         
         """
+        qs = self.model._default_manager.get_query_set() 
+        # Si user est superuser afficher tous les candidats       
+        user_groupes = obj.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
+            if grp_evaluateurs_recrutement in user_groupes:
+                user = Evaluateur.objects.get(user=obj.user)               
+            #elif grp_administrateurs_recrutement in user_groupes: 
+            #   user = AdministrateurRegional.objects.get(user=obj.user)
+            else:
+                return qs.none()   
+
+            ids = [c.id for c in user.candidats.all()]
+            return qs.select_related('candidats').filter(id__in=ids)               
+        return qs.select_related('candidats')         
+
+class ProxyCandidatAdmin(CandidatAdmin):
+    #TODO: init boucler sur les fields pour le readonly
+    list_display = ('nom', 'prenom', 'offre_emploi','statut',
+                    'voir_offre_emploi')
+    readonly_fields = ('statut', 'offre_emploi', 'prenom', 'nom',
+                        'genre', 'nationalite', 'date_naissance',
+                        'situation_famille', 'nombre_dependant', 'telephone',
+                        'email', 'adresse', 'ville', 'etat_province', 
+                        'code_postal', 'pays', 'niveau_diplome',
+                        'employeur_actuel', 'poste_actuel',
+                        'domaine_professionnel',)
+
+    inlines = []
+    def has_add_permission(self, request):
+        return False
+
+    def has_delete_permission(self, request, obj=None):
+        return False
 
-        qs = self.model._default_manager.get_query_set()
-        try:
-            user = Evaluateur.objects.get(user=obj.user)
-        except Evaluateur.DoesNotExist:
-            return qs.none()      
-    
-        ids = [c.id for c in user.candidats.all()]
-        return qs.select_related('candidats').filter(id__in=ids)
+    def voir_offre_emploi(self, obj):
+        return "<a href='%s?id=%s'>Voir l'offre d'emploi</a> \
+                " % (reverse('admin:recrutement_proxyoffreemploi_changelist'), 
+                obj.offre_emploi.id)
+    voir_offre_emploi.allow_tags = True
+    voir_offre_emploi.short_description = "Afficher l'offre d'emploi"
 
 class CandidatPieceAdmin(admin.ModelAdmin):
     list_display = ('nom', 'candidat', )
@@ -219,54 +317,21 @@ class CandidatPieceAdmin(admin.ModelAdmin):
 
 class EvaluateurAdmin(VersionAdmin):
     fieldsets = (
-        (None, {'fields': ('user', )}),#'regions')}),
+        (None, {'fields': ('user', )}),
         (None, {'fields': ('candidats',)}),
     )
 
-    '''def get_form(self, request, obj=None, **kwargs):
-        """
-        Affiche la liste des users, regions et candidats, seulement si le user
-        connecté possède un Evaluateur
-        """
-        form = super(EvaluateurAdmin, self).get_form(request, obj, **kwargs)
-        if form.declared_fields.has_key('user'):
-            permission_field = form.declared_fields['user']
-        else:
-            permission_field = form.base_fields['user']
-
-        #if form.declared_fields.has_key('regions'):
-        #    region_field = form.declared_fields['regions']
-        #else:
-        #    region_field = form.base_fields['regions']
-
-        if form.declared_fields.has_key('candidats'):
-            candidats_field = form.declared_fields['candidats']
-        else:
-            candidats_field = form.base_fields['candidats']
-
-        try:
-            user = Evaluateur.objects.get(user=request.user)
-        except Evaluateur.DoesNotExist:
-            #region_field.queryset = Region.objects.none()
-            permission_field.queryset = Evaluateur.objects.none()
-            candidats_field.queryset = Candidat.objects.none()
-            return form
-
-        return form
-    '''
-
+    # 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
         """
-        qs = self.model._default_manager.get_query_set()
-        try:
-            user = Evaluateur.objects.get(user=request.user)
-        except Evaluateur.DoesNotExist:
-            return qs.none()
-        
-        return qs
+        user_groupes = obj.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
@@ -274,45 +339,6 @@ class AdministrateurRegionalAdmin(VersionAdmin):
 class CandidatEvaluationAdmin(VersionAdmin):
     list_display = ('candidat', 'evaluateur', 'note', 'commentaire', 'date', )
 
-    def get_form(self, request, obj=None, **kwargs):
-        """
-        Affiche la liste des candidats et évaluateur, seulement si le user
-        connecté possède un Evaluateur
-        """
-        form = super(CandidatEvaluationAdmin, self).get_form(request, obj,
-                **kwargs)
-        if form.declared_fields.has_key('evaluateur'):
-            evaluateur_field = form.declared_fields['evaluateur']
-        else:
-            evaluateur_field = form.base_fields['evaluateur']
-
-        if form.declared_fields.has_key('candidat'):
-            candidats_field = form.declared_fields['candidat']
-        else:
-            candidats_field = form.base_fields['candidat']
-
-        try:
-            user = Evaluateur.objects.get(user=request.user)
-        except Evaluateur.DoesNotExist:
-            evaluateur_field.queryset = Evaluateur.objects.none()
-            candidats_field.queryset = Candidat.objects.none()
-            return form
-
-        return form
-
-    def queryset(self, request):
-        """ 
-        Affiche la liste d'évaluation que si le user connecté 
-        possède un Evaluateur
-        """
-        qs = self.model._default_manager.get_query_set()
-        try:
-            user = Evaluateur.objects.get(user=request.user)
-        except Evaluateur.DoesNotExist:
-            return qs.none()
-
-        return qs.select_related('candidat')
-
 class CourrielTemplateAdmin(VersionAdmin):
     pass
 
@@ -321,3 +347,5 @@ admin.site.register(Candidat, CandidatAdmin)
 admin.site.register(CourrielTemplate, CourrielTemplateAdmin)
 admin.site.register(Evaluateur, EvaluateurAdmin)
 admin.site.register(AdministrateurRegional, AdministrateurRegionalAdmin)
+admin.site.register(ProxyOffreEmploi, ProxyOffreEmploiAdmin)
+admin.site.register(ProxyCandidat, ProxyCandidatAdmin)