1941: permissions régionales(Partie 2)
authorNilovna Bascunan-Vasquez <contact@nilovna.com>
Wed, 10 Aug 2011 22:40:01 +0000 (18:40 -0400)
committerNilovna Bascunan-Vasquez <contact@nilovna.com>
Wed, 10 Aug 2011 22:40:01 +0000 (18:40 -0400)
project/recrutement/admin.py
project/recrutement/models.py

index b34debf..3c3cfd4 100644 (file)
@@ -9,16 +9,16 @@ from django.forms.models import BaseInlineFormSet
 
 from reversion.admin import VersionAdmin
 from datamaster_modeles.models import Implantation, Region, Bureau
-
 from project.rh import models as rh
+
+from project.dae.utils import get_employe_from_user as get_emp
 from recrutement.models import *
 from recrutement.workflow import grp_evaluateurs_recrutement, \
                     grp_drh_recrutement, grp_directeurs_bureau_recrutement, \
                     grp_administrateurs_recrutement
 from recrutement.forms import *
 
-from project.dae.utils import get_employe_from_user as get_emp
-
+### CONSTANTES
 IMPLANTATIONS_CENTRALES = [15, 19]
 
 class ProxyEvaluateur(Evaluateur.offres_emploi.through):
@@ -45,12 +45,13 @@ class OffreEmploiAdmin(VersionAdmin):
     form = OffreEmploiForm
     inlines = [EvaluateurInline, ]
 
+    ### Actions à afficher
     def get_actions(self, request):
         actions = super(OffreEmploiAdmin, self).get_actions(request)
         del actions['delete_selected']
         return actions
 
-    # Affecter un évaluateurs à des offres d'emploi
+    ### Affecter un évaluateurs à des offres d'emploi
     def affecter_evaluateurs_offre_emploi(modeladmin, obj, candidats):   
         selected = obj.POST.getlist(admin.ACTION_CHECKBOX_NAME)
 
@@ -58,19 +59,20 @@ class OffreEmploiAdmin(VersionAdmin):
                 "?ids=%s" % (",".join(selected)))
     affecter_evaluateurs_offre_emploi.short_description = u'Affecter évaluateur(s)'
 
-    # Afficher la liste des candidats pour l'offre d'emploi
+    ### 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 = "Afficher la liste des candidats"
 
+    ### Formulaire
     def get_form(self, request, obj=None, **kwargs):
         form = super(OffreEmploiAdmin, self).get_form(request, obj, **kwargs)
         employe = get_emp(request.user)
         user_groupes = request.user.groups.all()
 
-        ### Region ###
+        # Region
         if form.declared_fields.has_key('region'):
             region_field = form.declared_fields['region']
         else:
@@ -82,19 +84,20 @@ class OffreEmploiAdmin(VersionAdmin):
             region_field.queryset = Region.objects.\
                                     filter(id=employe.implantation.region.id)
         
-        ### Poste ###
+        # Poste
         if form.declared_fields.has_key('poste'):
             poste_field = form.declared_fields['poste']
         else:
             poste_field = form.base_fields['poste']
 
-        import pdb;pdb.set_trace()
         if grp_drh_recrutement in user_groupes:
             poste_field.queryset = rh.Poste.objects.all()
         else:
-            poste_field.queryset = rh.Poste.objects.filter(implantation__region=employe.implantation.region).exclude(implantation__in=IMPLANTATIONS_CENTRALES)
+            poste_field.queryset = rh.Poste.objects.\
+                    filter(implantation__region=employe.implantation.region).\
+                    exclude(implantation__in=IMPLANTATIONS_CENTRALES)
         
-        ### Bureau ###
+        # Bureau
         if form.declared_fields.has_key('bureau'):
             bureau_field = form.declared_fields['bureau']
         else:
@@ -103,59 +106,60 @@ class OffreEmploiAdmin(VersionAdmin):
         if grp_drh_recrutement in user_groupes:
             bureau_field.queryset = Bureau.objects.all()
         else:
-            bureau_field.queryset = Bureau.objects.filter(region=employe.implantation.region)
-        
+            bureau_field.queryset = Bureau.objects.\
+                                    filter(region=employe.implantation.region)   
         return form
 
+    ### Queryset
     def queryset(self, request):
         qs = 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 and \
-            not grp_directeurs_bureau_recrutement in user_groupes and \
-            not grp_administrateurs_recrutement in user_groupes and \
-            not request.user.is_superuser:
-            """
-            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:
-                try:
-                    user = Evaluateur.objects.get(user=request.user)               
-                except Evaluateur.DoesNotExist:       
-                    return qs.none()       
-            else:
-                return qs.none()   
-                      
-            if type(user) is Evaluateur:        
-                candidats = [g for g in user.candidats.all()]
-                offre_emploi_ids = [c.offre_emploi.id for c in candidats]
-                return qs.select_related('offre_emploi').\
-                        filter(id__in=offre_emploi_ids)            
-            return qs.none()
-        return qs.select_related('offre_emploi')
+        if grp_drh_recrutement in user_groupes:
+            return qs.select_related('offre_emploi')
 
+        if grp_directeurs_bureau_recrutement in user_groupes or \
+            grp_administrateurs_recrutement in user_groupes:
+            employe = get_emp(request.user)
+            return qs.select_related('offre_emploi').\
+                                    filter(region=employe.implantation.region)
+
+        if grp_evaluateurs_recrutement in user_groupes:
+            try:
+                user = Evaluateur.objects.get(user=request.user)               
+            except Evaluateur.DoesNotExist:       
+                return qs.none()       
+                     
+            ids = [o.id for o in user.offres_emploi.all()]
+            return qs.select_related('offre_emploi').filter(id__in=ids)            
+        return qs.none()
+
+    ### Permission add, delete, change
     def has_add_permission(self, request):
         user_groupes = request.user.groups.all()
         if grp_drh_recrutement in user_groupes or \
             grp_directeurs_bureau_recrutement in user_groupes or \
-            grp_administrateurs_recrutement in user_groupes or \
-            request.user.is_superuser:
+            grp_administrateurs_recrutement in user_groupes:
             return True
         return False  
 
+    def has_delete_permission(self, request, obj=None):
+        user_groupes = request.user.groups.all()
+        if grp_drh_recrutement in user_groupes or \
+            grp_directeurs_bureau_recrutement in user_groupes or \
+            grp_administrateurs_recrutement in user_groupes:
+            return True
+        return False   
+
     def has_change_permission(self, request, obj=None):
         user_groupes = request.user.groups.all()
         if grp_drh_recrutement in user_groupes or \
             grp_directeurs_bureau_recrutement in user_groupes or \
-            grp_administrateurs_recrutement in user_groupes or \
-            request.user.is_superuser:
+            grp_administrateurs_recrutement in user_groupes:
             return True
         return False   
 
 class ProxyOffreEmploiAdmin(OffreEmploiAdmin):
-    list_display = ('nom', 'resume', 'date_limite', 'region', 'statut', 
+    list_display = ('nom', 'date_limite', 'region', 'statut', 
                     'est_affiche')
     readonly_fields = ('description', 'bureau', 'duree_affectation', 
                         'renumeration', 'debut_affectation', 'lieu_affectation',
@@ -176,24 +180,27 @@ class ProxyOffreEmploiAdmin(OffreEmploiAdmin):
         }),
     )        
     inlines = []
+
+    ### Actions à afficher
     def get_actions(self, request):
         actions = super(ProxyOffreEmploiAdmin, self).get_actions(request)
         del actions['affecter_evaluateurs_offre_emploi']
         return actions
 
+    ### Lieu de redirection après le change 
     def response_change(self, request, obj):
         response = super(ProxyOffreEmploiAdmin, self).response_change(request, 
                                                                             obj)
         user_groupes = request.user.groups.all()
         if grp_drh_recrutement in user_groupes or \
             grp_directeurs_bureau_recrutement in user_groupes or \
-            grp_administrateurs_recrutement in user_groupes or \
-            request.user.is_superuser:
+            grp_administrateurs_recrutement in user_groupes:
             return HttpResponseRedirect(reverse\
                                 ('admin:recrutement_offreemploi_changelist'))
         return HttpResponseRedirect(reverse\
                             ('admin:recrutement_proxyoffreemploi_changelist'))
 
+    ### Permissions add, delete, change
     def has_add_permission(self, request):
         return False
 
@@ -205,8 +212,7 @@ class ProxyOffreEmploiAdmin(OffreEmploiAdmin):
         if grp_evaluateurs_recrutement in user_groupes or \
             grp_drh_recrutement in user_groupes or \
             grp_directeurs_bureau_recrutement in user_groupes or \
-            grp_administrateurs_recrutement in user_groupes or \
-            request.user.is_superuser:
+            grp_administrateurs_recrutement in user_groupes:
             return True
         return False   
 
@@ -230,7 +236,8 @@ class CandidatEvaluationInline(admin.TabularInline):
     max_num = 0
     extra = 0
     formset = CandidatEvaluationInlineFormSet
-    
+
+    ### Fields readonly    
     def get_readonly_fields(self, request, obj=None):
         """
         Empêche la modification des évaluations
@@ -274,12 +281,13 @@ class CandidatAdmin(VersionAdmin):
 
     actions = ['envoyer_courriel_candidats']
 
+    ### Actions à afficher
     def get_actions(self, request):
         actions = super(CandidatAdmin, self).get_actions(request)
         del actions['delete_selected']
         return actions
 
-    # Envoyer un courriel à des candidats
+    ### Envoyer un courriel à des candidats
     def envoyer_courriel_candidats(modeladmin, obj, candidats):   
         selected = obj.POST.getlist(admin.ACTION_CHECKBOX_NAME)
 
@@ -287,7 +295,7 @@ class CandidatAdmin(VersionAdmin):
                 "?ids=%s" % (",".join(selected)))
     envoyer_courriel_candidats.short_description = u'Envoyer courriel'
 
-    # Évaluer un candidat
+    ### Évaluer un candidat
     def evaluer_candidat(self, obj):
         return "<a href='%s?candidat__id__exact=%s'>Évaluer le candidat</a>" % \
             (reverse('admin:recrutement_candidatevaluation_changelist'), 
@@ -295,14 +303,14 @@ class CandidatAdmin(VersionAdmin):
     evaluer_candidat.allow_tags = True    
     evaluer_candidat.short_description = 'Évaluation'
 
-    # Afficher un candidat
+    ### Afficher un candidat
     def afficher_candidat(self, obj):
         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'Détails du candidat'
 
-    # Voir l'offre d'emploi
+    ### Voir l'offre d'emploi
     def voir_offre_emploi(self, obj):
         return "<a href='%s'>Voir l'offre d'emploi</a>" % \
         (reverse('admin:recrutement_proxyoffreemploi_change', 
@@ -310,7 +318,7 @@ class CandidatAdmin(VersionAdmin):
     voir_offre_emploi.allow_tags = True
     voir_offre_emploi.short_description = "Afficher l'offre d'emploi"
 
-    # Calculer la moyenne des notes
+    ### Calculer la moyenne des notes
     def calculer_moyenne(self, obj):
         evaluations = CandidatEvaluation.objects.filter(candidat=obj)
         offre_emploi = obj.offre_emploi
@@ -326,12 +334,12 @@ class CandidatAdmin(VersionAdmin):
     calculer_moyenne.allow_tags = True
     calculer_moyenne.short_description = "Moyenne des notes"
 
+    ### Permissions add, delete, change
     def has_add_permission(self, request):
         user_groupes = request.user.groups.all()
         if grp_drh_recrutement in user_groupes or \
             grp_directeurs_bureau_recrutement in user_groupes or \
-            grp_administrateurs_recrutement in user_groupes or \
-            request.user.is_superuser:
+            grp_administrateurs_recrutement in user_groupes:
             return True
         return False   
 
@@ -339,8 +347,7 @@ class CandidatAdmin(VersionAdmin):
         user_groupes = request.user.groups.all()
         if grp_drh_recrutement in user_groupes or \
             grp_directeurs_bureau_recrutement in user_groupes or \
-            grp_administrateurs_recrutement in user_groupes or \
-            request.user.is_superuser:
+            grp_administrateurs_recrutement in user_groupes:
             return True
         return False   
 
@@ -348,11 +355,11 @@ class CandidatAdmin(VersionAdmin):
         user_groupes = request.user.groups.all()
         if grp_drh_recrutement in user_groupes or \
             grp_directeurs_bureau_recrutement in user_groupes or \
-            grp_administrateurs_recrutement in user_groupes or \
-            request.user.is_superuser:
+            grp_administrateurs_recrutement in user_groupes:
             return True
         return False   
 
+    ### Queryset
     def queryset(self, request):
         """
         Spécifie un queryset limité, autrement Django exécute un 
@@ -362,27 +369,27 @@ 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       
+        qs = self.model._default_manager.get_query_set()      
         user_groupes = request.user.groups.all()
-        if not grp_drh_recrutement in user_groupes and \
-            not grp_directeurs_bureau_recrutement in user_groupes and \
-            not grp_administrateurs_recrutement in user_groupes and \
-            not request.user.is_superuser:
-            # 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:
-                try:
-                    user = Evaluateur.objects.get(user=request.user)
-                except Evaluateur.DoesNotExist:       
-                    return qs.none()       
-            else:
+        if grp_drh_recrutement in user_groupes:
+            return qs.select_related('candidats')   
+
+        if grp_directeurs_bureau_recrutement in user_groupes or \
+            grp_administrateurs_recrutement in user_groupes:
+            employe = get_emp(request.user)
+            return qs.select_related('candidats').\
+                        filter(offre_emploi__region=employe.implantation.region)            
+
+        if grp_evaluateurs_recrutement in user_groupes:
+            try:
+                user = Evaluateur.objects.get(user=request.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)               
-        return qs.select_related('candidats')         
+
+            offres_emploi = [o for o in user.offres_emploi.all()]
+            candidat_ids = [o.candidat.id for o in offres_emploi]
+            return qs.select_related('candidats').filter(id__in=candidat_ids)            
+        return qs.none()    
 
 class ProxyCandidatAdmin(CandidatAdmin):
     readonly_fields = ('statut', 'offre_emploi', 'prenom', 'nom',
@@ -410,18 +417,19 @@ class ProxyCandidatAdmin(CandidatAdmin):
     )
     inlines = []
 
+    ### Lieu de redirection après le change
     def response_change(self, request, obj):
         response = super(ProxyCandidatAdmin, self).response_change(request, obj)
         user_groupes = request.user.groups.all()
         if grp_drh_recrutement in user_groupes or \
             grp_directeurs_bureau_recrutement in user_groupes or \
-            grp_administrateurs_recrutement in user_groupes or \
-            request.user.is_superuser:
+            grp_administrateurs_recrutement in user_groupes:
             return HttpResponseRedirect(reverse\
                                     ('admin:recrutement_candidat_changelist'))
         return HttpResponseRedirect(reverse\
                                 ('admin:recrutement_proxycandidat_changelist'))
 
+    ### Permissions add, delete, change
     def has_add_permission(self, request):
         return False
 
@@ -433,14 +441,14 @@ class ProxyCandidatAdmin(CandidatAdmin):
         if grp_drh_recrutement in user_groupes or \
             grp_evaluateurs_recrutement in user_groupes or \
             grp_directeurs_bureau_recrutement in user_groupes or \
-            grp_administrateurs_recrutement in user_groupes or \
-            request.user.is_superuser:
+            grp_administrateurs_recrutement in user_groupes:
             return True
         return False   
 
 class CandidatPieceAdmin(admin.ModelAdmin):
     list_display = ('nom', 'candidat', )
 
+    ### Queryset
     def queryset(self, request):
         """
         Spécifie un queryset limité, autrement Django exécute un 
@@ -464,13 +472,36 @@ class EvaluateurAdmin(VersionAdmin):
         }),
     )
 
+    ### Actions à afficher
     def get_actions(self, request):
         actions = super(EvaluateurAdmin, self).get_actions(request)
         del actions['delete_selected']
         return actions
 
-class AdministrateurRegionalAdmin(VersionAdmin):
-    pass
+    ### Permissions add, delete, change
+    def has_add_permission(self, request):
+        user_groupes = request.user.groups.all()
+        if grp_drh_recrutement in user_groupes or \
+            grp_directeurs_bureau_recrutement in user_groupes or \
+            grp_administrateurs_recrutement in user_groupes:
+            return True
+        return False   
+
+    def has_delete_permission(self, request, obj=None):
+        user_groupes = request.user.groups.all()
+        if grp_drh_recrutement in user_groupes or \
+            grp_directeurs_bureau_recrutement in user_groupes or \
+            grp_administrateurs_recrutement in user_groupes:
+            return True
+        return False   
+
+    def has_change_permission(self, request, obj=None):
+        user_groupes = request.user.groups.all()
+        if grp_drh_recrutement in user_groupes or \
+            grp_directeurs_bureau_recrutement in user_groupes or \
+            grp_administrateurs_recrutement in user_groupes:
+            return True
+        return False   
 
 class CandidatEvaluationAdmin(VersionAdmin):
     list_display = ('_candidat', '_offre_emploi', 'evaluateur', '_note', 
@@ -482,11 +513,13 @@ class CandidatEvaluationAdmin(VersionAdmin):
         }),
     )
 
+    ### Actions à afficher
     def get_actions(self, request):
         actions = super(CandidatEvaluationAdmin, self).get_actions(request)
         del actions['delete_selected']
         return actions
 
+    ### Afficher la note
     def _note(self, obj):
         """
         Si l'évaluateur n'a pas encore donné de note au candidat, indiquer
@@ -504,6 +537,7 @@ class CandidatEvaluationAdmin(VersionAdmin):
     _note.short_description = "Note"    
     _note.admin_order_field = 'note'    
 
+    ### Lien en lecture seule vers le candidat
     def _candidat(self, obj):
         return "<a href='%s'>%s</a>" \
             % (reverse('admin:recrutement_proxycandidat_change', 
@@ -511,6 +545,7 @@ class CandidatEvaluationAdmin(VersionAdmin):
     _candidat.allow_tags = True    
     _candidat.short_description = 'Candidat'
 
+    ### Afficher commentaire
     def _commentaire(self, obj):
         """
         Si l'évaluateur n'a pas encore donné de note au candidat, indiquer
@@ -523,7 +558,7 @@ class CandidatEvaluationAdmin(VersionAdmin):
     _commentaire.allow_tags = True
     _commentaire.short_description = "Commentaire"   
 
-
+    ### Afficher offre d'emploi
     def _offre_emploi(self, obj):
         return "<a href='%s'>%s</a>" % \
         (reverse('admin:recrutement_proxyoffreemploi_change', 
@@ -531,6 +566,15 @@ class CandidatEvaluationAdmin(VersionAdmin):
     _offre_emploi.allow_tags = True
     _offre_emploi.short_description = "Voir offre d'emploi"
     
+    ### Permissions add, delete, change
+    def has_add_permission(self, request):
+        user_groupes = request.user.groups.all()
+        if grp_drh_recrutement in user_groupes or \
+            grp_directeurs_bureau_recrutement in user_groupes or \
+            grp_administrateurs_recrutement in user_groupes:
+            return True
+        return False   
+
     def has_change_permission(self, request, obj=None):
         """
         Permettre la visualisation dans la changelist
@@ -539,17 +583,17 @@ class CandidatEvaluationAdmin(VersionAdmin):
         """
         return obj is None or request.user == obj.evaluateur.user
 
+    ### Queryset
     def queryset(self, request):
         """
         Afficher uniquement les évaluations de l'évaluateur, sauf si 
-        l'utilisateur est super admin.
+        l'utilisateur est dans les groupes suivants.
         """
         qs = self.model._default_manager.get_query_set()
         user_groupes = request.user.groups.all()
         if grp_drh_recrutement in user_groupes or \
             grp_directeurs_bureau_recrutement in user_groupes or \
-            grp_administrateurs_recrutement in user_groupes or \
-            request.user.is_superuser:
+            grp_administrateurs_recrutement in user_groupes:
             return qs.select_related('offre_emploi')
 
         try:
@@ -565,6 +609,7 @@ class CandidatEvaluationAdmin(VersionAdmin):
                 filter(id__in=candidats_evaluations_ids)
 
 class CourrielTemplateAdmin(VersionAdmin):
+    ### Actions à afficher
     def get_actions(self, request):
         actions = super(CourrielTemplateAdmin, self).get_actions(request)
         del actions['delete_selected']
@@ -576,5 +621,4 @@ admin.site.register(Candidat, CandidatAdmin)
 admin.site.register(ProxyCandidat, ProxyCandidatAdmin)
 admin.site.register(CandidatEvaluation, CandidatEvaluationAdmin)
 admin.site.register(Evaluateur, EvaluateurAdmin)
-#admin.site.register(AdministrateurRegional, AdministrateurRegionalAdmin)
 admin.site.register(CourrielTemplate, CourrielTemplateAdmin)
index ac46f39..57ed8cd 100755 (executable)
@@ -115,19 +115,6 @@ class Evaluateur(models.Model):
     def __unicode__(self):
         return '%s %s' % (self.user.first_name, self.user.last_name)
 
-class AdministrateurRegional(models.Model):
-    user = models.ForeignKey(User, unique=True,
-            verbose_name="Administrateur régionnal")
-    regions = models.ManyToManyField(ref.Region, 
-                           verbose_name="Régions", )
-
-    class Meta:
-        verbose_name = "administrateur régional"
-        verbose_name_plural = "administrateurs régionaux"
-
-    def __unicode__(self):
-        return '%s %s' % (self.user.first_name, self.user.last_name)
-
 class CandidatEvaluation(models.Model):
     candidat = models.ForeignKey(emploi.Candidat, db_column='candidat', 
                 related_name='+',)