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):
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)
"?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:
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:
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',
}),
)
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
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
max_num = 0
extra = 0
formset = CandidatEvaluationInlineFormSet
-
+
+ ### Fields readonly
def get_readonly_fields(self, request, obj=None):
"""
Empêche la modification des évaluations
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)
"?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'),
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',
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
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
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
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
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',
)
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
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
}),
)
+ ### 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',
}),
)
+ ### 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
_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',
_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
_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',
_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
"""
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:
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']
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)