From f6724c20d0183f9c23331851138a37d64956065a Mon Sep 17 00:00:00 2001 From: Nilovna Bascunan-Vasquez Date: Tue, 5 Jul 2011 15:02:07 -0400 Subject: [PATCH] Permissions des groupes, affichage de listes selon permissions --- project/recrutement/admin.py | 260 ++++++++++++++++++++++----------------- project/recrutement/models.py | 17 +++ project/recrutement/views.py | 1 + project/recrutement/workflow.py | 26 ++++ 4 files changed, 188 insertions(+), 116 deletions(-) create mode 100644 project/recrutement/workflow.py diff --git a/project/recrutement/admin.py b/project/recrutement/admin.py index 06e2ccf..3dbbf98 100644 --- a/project/recrutement/admin.py +++ b/project/recrutement/admin.py @@ -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 "Voir les candidats \ " % (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 "Voir les candidats \ + " % (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 "Voir le candidat \ - " % (reverse('afficher_candidat'), obj.id) + " % (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 "Voir l'offre d'emploi \ + " % (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) diff --git a/project/recrutement/models.py b/project/recrutement/models.py index a126996..1e7b651 100755 --- a/project/recrutement/models.py +++ b/project/recrutement/models.py @@ -68,6 +68,14 @@ class OffreEmploi(Metadata): def __unicode__(self): return '%s [%s]' % (self.nom, self.id) +class ProxyOffreEmploi(OffreEmploi): + class Meta: + proxy = True + verbose_name = "Offre d'emploi (visualisation)" + verbose_name_plural = "Offres d'emploi (visualisation)" + + def __unicode__(self): + return '%s [%s] - View' % (self.nom, self.id) ### CANDIDAT @@ -126,6 +134,15 @@ class Candidat(Metadata): def __unicode__(self): return '%s %s [%s]' % (self.prenom, self.nom, self.id) +class ProxyCandidat(Candidat): + class Meta: + proxy = True + verbose_name = "Candidat (visualisation)" + verbose_name_plural = "Candidats (visualisation)" + + def __unicode__(self): + return '%s %s [%s]' % (self.prenom, self.nom, self.id) + ### PIECE CANDIDAT TYPE_PIECE_CHOICES = ( diff --git a/project/recrutement/views.py b/project/recrutement/views.py index 542f501..8d3d951 100755 --- a/project/recrutement/views.py +++ b/project/recrutement/views.py @@ -10,6 +10,7 @@ from django.template import Context, RequestContext from forms import * from models import * from project.recrutement import models as recr +from recrutement.workflow import grp_evaluateurs_recrutement def index(request): return render_to_response('recrutement/index.html', {}, diff --git a/project/recrutement/workflow.py b/project/recrutement/workflow.py new file mode 100644 index 0000000..5ec17a0 --- /dev/null +++ b/project/recrutement/workflow.py @@ -0,0 +1,26 @@ +# -*- encoding: utf-8 -*- + +from django.contrib.auth.models import Group + +def safe_create_groupe(name): + """ + Création d'un groupe prédéfini. Retourne None, quand la création + ne peut se faire. (C'est le cas au syncdb, quand la table de groupe + n'a pas été crée encore). + """ + try: + grp, created = Group.objects.get_or_create(name=name) + except: + return None + return grp + +grp_administrateurs_recrutement = safe_create_groupe(name='Administrateurs \ + recrutement') +grp_evaluateurs_recrutement = safe_create_groupe(name='Évaluateurs') +grp_drh_recrutement = safe_create_groupe(name='DRH') + +recrutement_groupes = ( + grp_administrateurs_recrutement, + grp_evaluateurs_recrutement, + grp_drh_recrutement, +) -- 1.7.10.4