X-Git-Url: http://git.auf.org/?p=auf_rh_dae.git;a=blobdiff_plain;f=project%2Frecrutement%2Fadmin.py;h=c2b14aa4bafe9a16b1b7d9cb753bb335fb29a484;hp=4bc35f3c4bd46a75ea692319ca2db51ce3cb7d37;hb=bad00d312daf1bf886ca1d5b2708c1d3e4e91650;hpb=8fb8868b7cb564df85337bf99c3acb25c385c66f diff --git a/project/recrutement/admin.py b/project/recrutement/admin.py index 4bc35f3..c2b14aa 100644 --- a/project/recrutement/admin.py +++ b/project/recrutement/admin.py @@ -2,24 +2,32 @@ import textwrap -from auf.django.emploi.models import OffreEmploi, Candidat, CandidatPiece -from auf.django.references.models import Region, Bureau +from auf.django.emploi.models import CandidatPiece, Candidat, OffreEmploi +from auf.django.references.models import Region, Bureau, Implantation from django.conf import settings from django.contrib import admin from django.core.urlresolvers import reverse from django.db.models import Avg +from django.shortcuts import render_to_response +from django.template import RequestContext + +from auf.django.export.admin import ExportAdmin +from auf.django.emploi.models import STATUT_CHOICES from django.forms.models import BaseInlineFormSet from django.http import HttpResponseRedirect from django.shortcuts import redirect from reversion.admin import VersionAdmin from project import groups +from project.permissions import get_user_groupnames + from project.rh import models as rh from project.recrutement.forms import OffreEmploiForm from project.recrutement.models import \ Evaluateur, CandidatEvaluation, \ ProxyOffreEmploi, ProxyCandidat, MesCandidatEvaluation, \ - CourrielTemplate + CourrielTemplate, OffreEmploiEvaluateur + ### CONSTANTES IMPLANTATIONS_CENTRALES = [15, 19] @@ -58,6 +66,24 @@ class OffreEmploiAdminMixin(BaseAdmin): list_filter = ('statut',) actions = ['affecter_evaluateurs_offre_emploi', ] form = OffreEmploiForm + fieldsets = ( + (None, { + 'fields': ( + 'est_affiche', + 'statut', + 'date_limite', + 'nom', + 'description', + 'poste', + 'region', + 'lieu_affectation', + 'bureau', + 'debut_affectation', + 'duree_affectation', + 'renumeration', + ) + }), + ) ### Actions à afficher def get_actions(self, request): @@ -88,20 +114,15 @@ class OffreEmploiAdminMixin(BaseAdmin): def get_form(self, request, obj=None, **kwargs): form = super(OffreEmploiAdminMixin, self).get_form(request, obj, **kwargs) employe = groups.get_employe_from_user(request.user) - user_groupes = [g.name for g in request.user.groups.all()] + user_groupes = get_user_groupnames(request.user) # Region - - if 'region' in form.declared_fields: + region_field = None + if 'region' in form.declared_fields.keys(): region_field = form.declared_fields['region'] - read_only = False - elif 'region' in form.base_fields: + if 'region' in form.base_fields.keys(): region_field = form.base_fields['region'] - read_only = False - else: - read_only = True - - if not read_only: + if region_field: if groups.DRH_NIVEAU_1 in user_groupes or \ groups.DRH_NIVEAU_2 in user_groupes or \ groups.HAUTE_DIRECTION in user_groupes: @@ -111,16 +132,12 @@ class OffreEmploiAdminMixin(BaseAdmin): filter(id=employe.implantation.region.id) # Poste - if 'poste' in form.declared_fields: + poste_field = None + if 'poste' in form.declared_fields.keys(): poste_field = form.declared_fields['poste'] - read_only = False - elif 'poste' in form.base_fields: + if 'poste' in form.base_fields.keys(): poste_field = form.base_fields['poste'] - read_only = False - else: - read_only = True - - if not read_only: + if poste_field: if groups.DRH_NIVEAU_1 in user_groupes or \ groups.DRH_NIVEAU_2 in user_groupes or \ groups.HAUTE_DIRECTION in user_groupes: @@ -131,15 +148,12 @@ class OffreEmploiAdminMixin(BaseAdmin): exclude(implantation__in=IMPLANTATIONS_CENTRALES) # Bureau - if 'bureau' in form.declared_fields: + bureau_field = None + if 'bureau' in form.declared_fields.keys(): bureau_field = form.declared_fields['bureau'] - read_only = False - elif 'bureau' in form.base_fields: + if 'bureau' in form.base_fields.keys(): bureau_field = form.base_fields['bureau'] - read_only = False - else: - read_only = True - if not read_only: + if bureau_field: if groups.DRH_NIVEAU_1 in user_groupes or \ groups.DRH_NIVEAU_2 in user_groupes or \ groups.HAUTE_DIRECTION in user_groupes: @@ -155,7 +169,7 @@ class OffreEmploiAdminMixin(BaseAdmin): def queryset(self, request): qs = self.model._default_manager.get_query_set() \ .select_related('offre_emploi') - user_groupes = [g.name for g in request.user.groups.all()] + user_groupes = get_user_groupnames(request.user) if groups.DRH_NIVEAU_1 in user_groupes or \ groups.DRH_NIVEAU_2 in user_groupes or \ groups.HAUTE_DIRECTION in user_groupes: @@ -181,7 +195,7 @@ class OffreEmploiAdminMixin(BaseAdmin): ### Permission add, delete, change def has_add_permission(self, request): - user_groupes = [g.name for g in request.user.groups.all()] + user_groupes = get_user_groupnames(request.user) if request.user.is_superuser is True or \ groups.DRH_NIVEAU_1 in user_groupes or \ groups.DRH_NIVEAU_2 in user_groupes or \ @@ -192,7 +206,7 @@ class OffreEmploiAdminMixin(BaseAdmin): return False def has_delete_permission(self, request, obj=None): - user_groupes = [g.name for g in request.user.groups.all()] + user_groupes = get_user_groupnames(request.user) if request.user.is_superuser is True or \ groups.DRH_NIVEAU_1 in user_groupes or \ groups.DRH_NIVEAU_2 in user_groupes or \ @@ -209,7 +223,7 @@ class OffreEmploiAdminMixin(BaseAdmin): return False def has_change_permission(self, request, obj=None): - user_groupes = [g.name for g in request.user.groups.all()] + user_groupes = get_user_groupnames(request.user) if request.user.is_superuser is True or \ groups.DRH_NIVEAU_1 in user_groupes or \ groups.DRH_NIVEAU_2 in user_groupes or \ @@ -230,6 +244,17 @@ class OffreEmploiAdminMixin(BaseAdmin): return False + def formfield_for_foreignkey(self, db_field, request, **kwargs): + if db_field.name == 'lieu_affectation': + user_groupes = [g.name for g in request.user.groups.all()] + if not (request.user.is_superuser is True or \ + groups.DRH_NIVEAU_1 in user_groupes or \ + groups.DRH_NIVEAU_2 in user_groupes): + employe = groups.get_employe_from_user(request.user) + kwargs["queryset"] = Implantation.objects.filter(region=employe.implantation.region) + return db_field.formfield(**kwargs) + return super(OffreEmploiAdminMixin, self).formfield_for_foreignkey(db_field, request, **kwargs) + class OffreEmploiAdmin(VersionAdmin, OffreEmploiAdminMixin): pass @@ -266,11 +291,6 @@ class ProxyOffreEmploiAdmin(OffreEmploiAdminMixin): def response_change(self, request, obj): return redirect('admin:recrutement_proxyoffreemploi_changelist') - ### Formulaire - def get_form(self, request, obj=None, **kwargs): - form = super(ProxyOffreEmploiAdmin, self).get_form(request, obj, **kwargs) - return form - ### Permissions add, delete, change def has_add_permission(self, request): return False @@ -279,20 +299,10 @@ class ProxyOffreEmploiAdmin(OffreEmploiAdminMixin): return False def has_change_permission(self, request, obj=None): - user_groupes = [g.name for g in request.user.groups.all()] - if request.user.is_superuser is True or \ - groups.CORRESPONDANT_RH in user_groupes or \ - groups.DRH_NIVEAU_1 in user_groupes or \ - groups.DRH_NIVEAU_2 in user_groupes or \ - groups.DIRECTEUR_DE_BUREAU in user_groupes or \ - groups.ADMINISTRATEURS in user_groupes or \ - groups.HAUTE_DIRECTION in user_groupes: - return True - if obj is not None: return True - return False + return not super(ProxyOffreEmploiAdmin, self).has_change_permission(request, obj) class CandidatPieceInline(admin.TabularInline): @@ -333,14 +343,14 @@ class CandidatEvaluationInline(admin.TabularInline): return self.readonly_fields -class CandidatAdminMixin(BaseAdmin): +class CandidatAdminMixin(BaseAdmin, ExportAdmin): search_fields = ('nom', 'prenom') exclude = ('actif', ) list_editable = ('statut', ) list_display = ('_candidat', 'offre_emploi', 'voir_offre_emploi', 'calculer_moyenne', 'afficher_candidat', '_date_creation', 'statut', ) - list_filter = ('offre_emploi', 'offre_emploi__region', 'statut', ) + list_filter = ('offre_emploi__nom', 'offre_emploi__region', 'statut', ) fieldsets = ( ("Offre d'emploi", { @@ -348,7 +358,7 @@ class CandidatAdminMixin(BaseAdmin): }), ('Informations personnelles', { 'fields': ( - 'prenom', 'nom', 'genre', 'nationalite', + 'nom', 'prenom', 'genre', 'nationalite', 'situation_famille', 'nombre_dependant' ) }), @@ -372,7 +382,13 @@ class CandidatAdminMixin(BaseAdmin): CandidatPieceInline, CandidatEvaluationInline, ] - actions = ['envoyer_courriel_candidats'] + actions = ['envoyer_courriel_candidats', 'changer_statut'] + + export_fields = ['statut', 'offre_emploi', 'prenom', 'nom', 'genre', + 'nationalite', 'situation_famille', 'nombre_dependant', + 'niveau_diplome', 'employeur_actuel', 'poste_actuel', + 'domaine_professionnel', 'telephone', 'email', 'adresse', + 'ville', 'etat_province', 'code_postal', 'pays'] def _candidat(self, obj): txt = u"%s %s (%s)" % (obj.nom.upper(), obj.prenom, obj.genre) @@ -402,6 +418,23 @@ class CandidatAdminMixin(BaseAdmin): ) envoyer_courriel_candidats.short_description = u'Envoyer courriel' + ### Changer le statut à des candidats + def changer_statut(modeladmin, request, queryset): + if request.POST.get('post'): + queryset.update(statut=request.POST.get('statut')) + return None + + context = { + 'action_checkbox_name': admin.helpers.ACTION_CHECKBOX_NAME, + 'queryset': queryset, + 'status': STATUT_CHOICES, + } + + return render_to_response("recrutement/selectionner_statut.html", + context, context_instance = RequestContext(request)) + + changer_statut.short_description = u'Changer statut' + ### Évaluer un candidat def evaluer_candidat(self, obj): return "" \ @@ -417,7 +450,7 @@ class CandidatAdminMixin(BaseAdmin): items = [u"
  • %s
  • " % \ (settings.OE_PRIVE_MEDIA_URL, pj.path, pj.get_nom_display()) \ for pj in obj.pieces_jointes()] - html = "Voir le candidat" % ( + html = "Candidature" % ( reverse('admin:recrutement_proxycandidat_change', args=(obj.id,)) ) return "%s" % (html, "\n".join(items)) @@ -467,7 +500,7 @@ class CandidatAdminMixin(BaseAdmin): ### Permissions add, delete, change def has_add_permission(self, request): - user_groupes = [g.name for g in request.user.groups.all()] + user_groupes = get_user_groupnames(request.user) if request.user.is_superuser is True or \ groups.CORRESPONDANT_RH in user_groupes or \ groups.DRH_NIVEAU_1 in user_groupes or \ @@ -479,7 +512,7 @@ class CandidatAdminMixin(BaseAdmin): return False def has_delete_permission(self, request, obj=None): - user_groupes = [g.name for g in request.user.groups.all()] + user_groupes = get_user_groupnames(request.user) if request.user.is_superuser is True or \ groups.CORRESPONDANT_RH in user_groupes or \ groups.DRH_NIVEAU_1 in user_groupes or \ @@ -491,7 +524,7 @@ class CandidatAdminMixin(BaseAdmin): return False def has_change_permission(self, request, obj=None): - user_groupes = [g.name for g in request.user.groups.all()] + user_groupes = get_user_groupnames(request.user) if request.user.is_superuser is True or \ groups.CORRESPONDANT_RH in user_groupes or \ groups.DRH_NIVEAU_1 in user_groupes or \ @@ -502,6 +535,21 @@ class CandidatAdminMixin(BaseAdmin): return True return False + def formfield_for_foreignkey(self, db_field, request, **kwargs): + if db_field.name == 'offre_emploi': + employe = groups.get_employe_from_user(request.user) + user_groupes = [g.name for g in request.user.groups.all()] + if request.user.is_superuser is True or \ + groups.CORRESPONDANT_RH in user_groupes or \ + groups.DRH_NIVEAU_1 in user_groupes or \ + groups.DRH_NIVEAU_2 in user_groupes: + qs_offres = OffreEmploi.objects.all() + else: + qs_offres =OffreEmploi.objects.filter(region=employe.implantation.region) + kwargs["queryset"] = qs_offres + return db_field.formfield(**kwargs) + return super(CandidatAdminMixin, self).formfield_for_foreignkey(db_field, request, **kwargs) + def get_changelist(self, request, **kwargs): return OrderedChangeList @@ -517,7 +565,7 @@ class CandidatAdminMixin(BaseAdmin): .select_related('offre_emploi') \ .annotate(moyenne=Avg('evaluations__note')) - user_groupes = [g.name for g in request.user.groups.all()] + user_groupes = get_user_groupnames(request.user) if groups.DRH_NIVEAU_1 in user_groupes or \ groups.DRH_NIVEAU_2 in user_groupes or \ groups.HAUTE_DIRECTION in user_groupes: @@ -538,10 +586,12 @@ class CandidatAdminMixin(BaseAdmin): class CandidatAdmin(VersionAdmin, CandidatAdminMixin): + change_list_template = 'admin/recrutement/candidat/change_list.html' pass class ProxyCandidatAdmin(CandidatAdminMixin): + change_list_template = 'admin/recrutement/candidat/change_list.html' list_editable = () readonly_fields = ( 'statut', 'offre_emploi', 'prenom', 'nom', 'genre', 'nationalite', @@ -582,23 +632,17 @@ class ProxyCandidatAdmin(CandidatAdminMixin): return False def has_change_permission(self, request, obj=None): - user_groupes = [g.name for g in request.user.groups.all()] - if request.user.is_superuser is True or \ - groups.CORRESPONDANT_RH in user_groupes or \ - groups.DRH_NIVEAU_1 in user_groupes or \ - groups.DRH_NIVEAU_2 in user_groupes or \ - groups.DIRECTEUR_DE_BUREAU in user_groupes or \ - groups.ADMINISTRATEURS in user_groupes or \ - groups.HAUTE_DIRECTION in user_groupes: - return True - if obj is not None: - evaluateur = Evaluateur.objects.get(user=request.user) - for e in obj.evaluations.all(): - if e.evaluateur == evaluateur: - return True - - return False + return obj in self.queryset(request) + #try: + # evaluateur = Evaluateur.objects.get(user=request.user) + # for e in obj.evaluations.all(): + # if e.evaluateur == evaluateur: + # return True + # return False + #except: + # pass + return super(ProxyCandidatAdmin, self).has_change_permission(request, obj) def get_actions(self, request): return None @@ -636,7 +680,7 @@ class EvaluateurAdmin(BaseAdmin, VersionAdmin): ### Permissions add, delete, change def has_add_permission(self, request): - user_groupes = [g.name for g in request.user.groups.all()] + user_groupes = get_user_groupnames(request.user) if request.user.is_superuser is True or \ groups.DRH_NIVEAU_1 in user_groupes or \ groups.DRH_NIVEAU_2 in user_groupes or \ @@ -645,7 +689,7 @@ class EvaluateurAdmin(BaseAdmin, VersionAdmin): return False def has_delete_permission(self, request, obj=None): - user_groupes = [g.name for g in request.user.groups.all()] + user_groupes = get_user_groupnames(request.user) if request.user.is_superuser is True or \ groups.DRH_NIVEAU_1 in user_groupes or \ groups.DRH_NIVEAU_2 in user_groupes or \ @@ -654,7 +698,7 @@ class EvaluateurAdmin(BaseAdmin, VersionAdmin): return False def has_change_permission(self, request, obj=None): - user_groupes = [g.name for g in request.user.groups.all()] + user_groupes = get_user_groupnames(request.user) if request.user.is_superuser is True or \ groups.DRH_NIVEAU_1 in user_groupes or \ groups.DRH_NIVEAU_2 in user_groupes or \ @@ -759,7 +803,7 @@ class CandidatEvaluationAdmin(BaseAdmin): mais interdire l'accès à modifier l'objet si l'évaluateur n'est pas le request.user """ - user_groupes = [g.name for g in request.user.groups.all()] + user_groupes = get_user_groupnames(request.user) if request.user.is_superuser or \ groups.CORRESPONDANT_RH in user_groupes or \ @@ -781,8 +825,7 @@ class CandidatEvaluationAdmin(BaseAdmin): """ qs = self.model._default_manager.get_query_set() \ .select_related('offre_emploi') - user_groupes = request.user.groups.all() - user_groupes = [g.name for g in request.user.groups.all()] + user_groupes = get_user_groupnames(request.user) if request.user.is_superuser or \ groups.CORRESPONDANT_RH in user_groupes or \ @@ -791,7 +834,7 @@ class CandidatEvaluationAdmin(BaseAdmin): groups.DIRECTEUR_DE_BUREAU in user_groupes or \ groups.ADMINISTRATEURS in user_groupes or \ groups.HAUTE_DIRECTION in user_groupes: - return qs + return qs.filter(candidat__statut__in=('REC', 'SEL')) evaluateur = Evaluateur.objects.get(user=request.user) candidats_evaluations = \ @@ -802,6 +845,7 @@ class CandidatEvaluationAdmin(BaseAdmin): class MesCandidatEvaluationAdmin(CandidatEvaluationAdmin): + list_filter = [] def has_change_permission(self, request, obj=None): try: @@ -820,13 +864,27 @@ class MesCandidatEvaluationAdmin(CandidatEvaluationAdmin): def queryset(self, request): qs = self.model._default_manager.get_query_set() \ - .select_related('offre_emploi') + .select_related('offre_emploi') 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) + + # XXX: Pas l'idéal, mais on doit créer les objets CandidatEvaluation + # ici pour garder la liste à jour. Idéalement, il vaudrait peut-être + # mieux utiliser directement les objets Candidat. + for candidat in Candidat.objects .filter( + offre_emploi__offreemploievaluateur__evaluateur=evaluateur, + ).exclude(evaluations__evaluateur=evaluateur): + print candidat, candidat.offre_emploi + CandidatEvaluation.objects.get_or_create( + candidat=candidat, evaluateur=evaluateur + ) + + return qs.filter( + evaluateur=evaluateur, candidat__statut__in=('NOUV', 'REC') + ) + + +class OffreEmploiEvaluateurAdmin(BaseAdmin): + pass class CourrielTemplateAdmin(BaseAdmin, VersionAdmin): @@ -844,3 +902,4 @@ admin.site.register(CandidatEvaluation, CandidatEvaluationAdmin) admin.site.register(MesCandidatEvaluation, MesCandidatEvaluationAdmin) admin.site.register(Evaluateur, EvaluateurAdmin) admin.site.register(CourrielTemplate, CourrielTemplateAdmin) +admin.site.register(OffreEmploiEvaluateur, OffreEmploiEvaluateurAdmin)