from recrutement.models import *
from recrutement.workflow import grp_evaluateurs_recrutement, \
grp_drh_recrutement, grp_directeurs_bureau_recrutement, \
- grp_administrateurs_recrutement
+ grp_administrateurs_recrutement, \
+ grp_correspondants_rh_recrutement
from recrutement.forms import *
### CONSTANTES
IMPLANTATIONS_CENTRALES = [15, 19]
-class ProxyEvaluateur(Evaluateur.offres_emploi.through):
- """
- Ce proxy sert uniquement dans l'admin à disposer d'un libellé
- plus ergonomique.
- """
- class Meta:
- proxy = True
- verbose_name = "évaluateur"
-
-class EvaluateurInline(admin.TabularInline):
- model = ProxyEvaluateur
- fields = ('evaluateur',)
- extra = 1
-
class OffreEmploiAdmin(VersionAdmin):
date_hierarchy = 'date_creation'
list_display = ('nom', 'date_limite', 'region', 'statut',
list_filter = ('statut',)
actions = ['affecter_evaluateurs_offre_emploi', ]
form = OffreEmploiForm
- inlines = [EvaluateurInline, ]
### Actions à afficher
def get_actions(self, request):
### Queryset
def queryset(self, request):
- qs = self.model._default_manager.get_query_set()
+ qs = self.model._default_manager.get_query_set().select_related('offre_emploi')
user_groupes = request.user.groups.all()
if grp_drh_recrutement in user_groupes:
- return qs.select_related('offre_emploi')
+ return qs
if grp_directeurs_bureau_recrutement in user_groupes or \
+ grp_correspondants_rh_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)
+ return qs.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)
+ evaluateur = Evaluateur.objects.get(user=request.user)
+ offre_ids = [e.candidat.offre_emploi_id for e in
+ CandidatEvaluation.objects.select_related('candidat').filter(evaluateur=evaluateur)]
+ return qs.filter(id__in=offre_ids)
+
return qs.none()
### Permission add, delete, change
)
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)
return HttpResponseRedirect(reverse\
('admin:recrutement_proxyoffreemploi_changelist'))
class CandidatAdmin(VersionAdmin):
exclude = ('actif', )
- date_hierarchy = 'date_creation'
- list_display = ('nom', 'prenom', 'offre_emploi','statut',
- 'voir_offre_emploi', 'calculer_moyenne',
- 'afficher_candidat',)
- list_filter = ('offre_emploi', )
+ list_editable = ('statut', )
+ list_display = ('nom', 'prenom', 'offre_emploi',
+ 'voir_offre_emploi', 'calculer_moyenne',
+ 'afficher_candidat', '_date_creation', 'statut', )
+ list_filter = ('offre_emploi', 'offre_emploi__region', 'statut', )
fieldsets = (
("Offre d'emploi", {
actions = ['envoyer_courriel_candidats']
+ def _date_creation(self, obj):
+ return obj.date_creation
+ _date_creation.order_field = "date_creation"
+ _date_creation.short_description = "Date de création"
+
### Actions à afficher
def get_actions(self, request):
actions = super(CandidatAdmin, self).get_actions(request)
### Calculer la moyenne des notes
def calculer_moyenne(self, obj):
evaluations = CandidatEvaluation.objects.filter(candidat=obj)
- offre_emploi = obj.offre_emploi
- notes = [evaluation.note for evaluation in evaluations.all() \
+ notes = [evaluation.note for evaluation in evaluations \
if evaluation.note is not None]
if len(notes) > 0:
moyenne_votes = float(sum(notes)) / len(notes)
else:
moyenne_votes = "Non disponible"
- return moyenne_votes
+
+ totales = len(evaluations)
+ faites = len(notes)
+
+ if obj.statut == 'REC':
+ if totales == faites:
+ color = "green"
+ elif faites > 0 and float(totales) / float(faites) >= 2:
+ color = "orange"
+ else:
+ color = "red"
+ else:
+ color = "black"
+
+ return """<span style="color: %s;">%s (%s/%s)</span>""" % (color, moyenne_votes, faites, totales)
calculer_moyenne.allow_tags = True
- calculer_moyenne.short_description = "Moyenne des notes"
+ calculer_moyenne.short_description = "Notation"
### Permissions add, delete, change
def has_add_permission(self, request):
def has_change_permission(self, request, obj=None):
user_groupes = request.user.groups.all()
if request.user.is_superuser is True or \
+ grp_correspondants_rh_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:
return qs.select_related('candidats')
if grp_directeurs_bureau_recrutement in user_groupes or \
+ grp_correspondants_rh_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)
+ 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()
-
- offres_emploi = [o for o in user.offres_emploi.all()]
- candidat_ids = [o.candidat.id for o in offres_emploi]
+ evaluateur = Evaluateur.objects.get(user=request.user)
+ candidat_ids = [e.candidat.id for e in
+ CandidatEvaluation.objects.filter(evaluateur=evaluateur)]
return qs.select_related('candidats').filter(id__in=candidat_ids)
return qs.none()
class ProxyCandidatAdmin(CandidatAdmin):
+ list_editable = ()
readonly_fields = ('statut', 'offre_emploi', 'prenom', 'nom',
'genre', 'nationalite', 'situation_famille',
'nombre_dependant', 'telephone', 'email', 'adresse',
("Utilisateur", {
'fields': ('user',)
}),
- ("Offres d'emploi à évaluer", {
- 'fields': ('offres_emploi',)
- }),
)
### Actions à afficher
return True
return False
-class CandidatEvaluationAdmin(VersionAdmin):
- list_display = ('_candidat', '_offre_emploi', 'evaluateur', '_note',
+class CandidatEvaluationAdmin(admin.ModelAdmin):
+ search_fields = ('candidat__nom', 'candidat__prenom' )
+ list_display = ('_candidat', '_statut', '_offre_emploi', 'evaluateur', '_note',
'_commentaire', )
- _readonly_fields = ('candidat', 'evaluateur') # voir fonctions de permissions
+ readonly_fields = ('candidat', 'evaluateur')
+ list_filter = ('candidat__statut', 'candidat__offre_emploi',)
fieldsets = (
('Évaluation du candidat', {
'fields': ('candidat', 'evaluateur', 'note', 'commentaire', )
_note.short_description = "Note"
_note.admin_order_field = 'note'
+ def _statut(self, obj):
+ return obj.candidat.get_statut_display()
+ _statut.order_field = 'candidat__statut'
+ _statut.short_description = 'Statut'
+
+
### Lien en lecture seule vers le candidat
def _candidat(self, obj):
return "<a href='%s'>%s</a>" \
_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 request.user.is_superuser is True or \
- grp_drh_recrutement in user_groupes or \
- grp_directeurs_bureau_recrutement in user_groupes or \
- grp_administrateurs_recrutement in user_groupes:
- self.readonly_fields = ()
- return True
- self.readonly_fields = self._readonly_fields
- return False
+ return False
+
+ def has_delete_permission(self, request, obj=None):
+ return False
def has_change_permission(self, request, obj=None):
"""
mais interdire l'accès à modifier l'objet si l'évaluateur n'est pas
le request.user
"""
+ if obj is None:
+ return True
+
if request.user.is_superuser is True:
return True
- self.readonly_fields = self._readonly_fields
- grant = self.has_add_permission(request)
- if obj is None:
- return grant
- else:
- return grant and request.user == obj.evaluateur.user
+
+ return request.user == obj.evaluateur.user
### Queryset
def queryset(self, request):
Afficher uniquement les évaluations de l'évaluateur, sauf si
l'utilisateur est dans les groupes suivants.
"""
- qs = self.model._default_manager.get_query_set()
+ qs = self.model._default_manager.get_query_set().select_related('offre_emploi')
user_groupes = request.user.groups.all()
+
if grp_drh_recrutement in user_groupes or \
+ grp_correspondants_rh_recrutement in user_groupes or \
grp_directeurs_bureau_recrutement in user_groupes or \
grp_administrateurs_recrutement in user_groupes:
- return qs.select_related('offre_emploi')
-
- try:
- evaluateur = Evaluateur.objects.get(user=request.user)
- except Evaluateur.DoesNotExist:
- return qs.none()
-
- 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
+
+ evaluateur = Evaluateur.objects.get(user=request.user)
+ candidats_evaluations = \
+ CandidatEvaluation.objects.filter(evaluateur=evaluateur,
+ candidat__statut__in=('REC', ))
+ candidats_evaluations_ids = [ce.id for ce in candidats_evaluations]
+ return qs.filter(id__in=candidats_evaluations_ids)
class CourrielTemplateAdmin(VersionAdmin):
### Actions à afficher
# -*- encoding: utf-8 -*-
-import os
from django import forms
-from django.contrib import admin
-from django.forms.models import inlineformset_factory
-from datetime import timedelta
-from django.forms.widgets import CheckboxSelectMultiple
-from django.contrib.admin import widgets as admin_widgets
-from form_utils.forms import BetterModelForm
-from django.forms import ModelForm, ModelChoiceField, HiddenInput, CharField
-from django.forms.models import BaseInlineFormSet
-from django.core.mail import send_mail
-
-from datamaster_modeles.models import Employe, Implantation, Region
-from tinymce.widgets import TinyMCE
-from captcha.fields import CaptchaField
-
+from django.forms import ModelForm
from recrutement import models as recr
from auf.django.emploi import forms as emploi
-from project.rh import models as rh
-from project.dae.utils import get_employe_from_user as get_emp
################################################################################
# EVALUATION
class EvaluateurForm(forms.Form):
evaluateurs = forms.ModelMultipleChoiceField(queryset=
- recr.Evaluateur.objects.all())
+ recr.Evaluateur.objects.all(), required=False)
+
def __init__(self, *args, **kwargs):
self.offres_emploi = kwargs.pop('offres_emploi')
+ evaluateurs = [e.id for e in self.get_evaluateurs()]
+ initial = getattr(kwargs, 'initial', {})
+ initial['evaluateurs'] = evaluateurs
+ kwargs['initial'] = initial
super(EvaluateurForm, self).__init__(*args, **kwargs)
+
+ def get_evaluateurs(self):
+ return [e.evaluateur for e in \
+ recr.CandidatEvaluation.objects.filter(candidat__offre_emploi=self.offres_emploi)]
+
def save(self):
candidats = recr.Candidat.objects.\
- filter(offre_emploi__in=self.offres_emploi)
+ filter(offre_emploi=self.offres_emploi)
+
+ anciens_evaluateurs = self.get_evaluateurs()
+ nouveaux__evaluateurs = self.cleaned_data.get('evaluateurs', [])
+
+ # suppression des évaluations du type
+ evaluations = recr.CandidatEvaluation.objects.filter(candidat__offre_emploi=self.offres_emploi)
+ for e in evaluations:
+ if e.evaluateur not in nouveaux__evaluateurs:
+ e.delete()
+
+ # on prépopulent les évaluations si elles ne l'ont pas déja été
for candidat in candidats:
- for evaluateur in self.cleaned_data.get('evaluateurs', []):
- candidat_evaluation = recr.CandidatEvaluation()
- candidat_evaluation.candidat = candidat
- candidat_evaluation.evaluateur = evaluateur
- candidat_evaluation.save()
+ for evaluateur in self.cleaned_data.get('evaluateurs', []):
+ if evaluateur not in anciens_evaluateurs:
+ candidat_evaluation = recr.CandidatEvaluation()
+ candidat_evaluation.candidat = candidat
+ candidat_evaluation.evaluateur = evaluateur
+ candidat_evaluation.save()
################################################################################