X-Git-Url: http://git.auf.org/?p=auf_rh_dae.git;a=blobdiff_plain;f=project%2Frecrutement%2Fadmin.py;h=c2b14aa4bafe9a16b1b7d9cb753bb335fb29a484;hp=52e2cf58dda4f81d36d7dac28400dbd0e9809da2;hb=bad00d312daf1bf886ca1d5b2708c1d3e4e91650;hpb=86e4bb655bbd61c43aae3073d49f4a7638071b4a
diff --git a/project/recrutement/admin.py b/project/recrutement/admin.py
index 52e2cf5..c2b14aa 100644
--- a/project/recrutement/admin.py
+++ b/project/recrutement/admin.py
@@ -2,38 +2,50 @@
import textwrap
+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 auf.django.emploi.models import OffreEmploi, Candidat, CandidatPiece
-from auf.django.references.models import Region, Bureau
+from project import groups
+from project.permissions import get_user_groupnames
-from project.groups import get_employe_from_user as get_emp
from project.rh import models as rh
-
from project.recrutement.forms import OffreEmploiForm
from project.recrutement.models import \
Evaluateur, CandidatEvaluation, \
ProxyOffreEmploi, ProxyCandidat, MesCandidatEvaluation, \
- CourrielTemplate
-from project.recrutement.groups import \
- grp_drh, grp_drh2, \
- grp_directeurs_bureau, \
- grp_administrateurs, \
- grp_correspondants_rh, \
- grp_haute_direction
+ CourrielTemplate, OffreEmploiEvaluateur
### CONSTANTES
IMPLANTATIONS_CENTRALES = [15, 19]
+class BaseAdmin(admin.ModelAdmin):
+
+ class Media:
+ css = {'screen': (
+ 'css/admin_custom.css',
+ 'jquery-autocomplete/jquery.autocomplete.css',
+ )}
+ js = (
+ 'https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js',
+ 'jquery-autocomplete/jquery.autocomplete.min.js',
+ )
+
+
class OrderedChangeList(admin.views.main.ChangeList):
"""
Surcharge pour appliquer le order_by d'un annotate
@@ -44,7 +56,7 @@ class OrderedChangeList(admin.views.main.ChangeList):
return qs
-class OffreEmploiAdmin(VersionAdmin):
+class OffreEmploiAdminMixin(BaseAdmin):
date_hierarchy = 'date_creation'
list_display = (
'nom', 'date_limite', 'region', 'statut', 'est_affiche',
@@ -54,10 +66,28 @@ class OffreEmploiAdmin(VersionAdmin):
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):
- actions = super(OffreEmploiAdmin, self).get_actions(request)
+ actions = super(OffreEmploiAdminMixin, self).get_actions(request)
del actions['delete_selected']
return actions
@@ -76,58 +106,61 @@ class OffreEmploiAdmin(VersionAdmin):
### 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)
+ " % (reverse('admin:recrutement_proxycandidat_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()
+ form = super(OffreEmploiAdminMixin, self).get_form(request, obj, **kwargs)
+ employe = groups.get_employe_from_user(request.user)
+ 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']
- else:
+ if 'region' in form.base_fields.keys():
region_field = form.base_fields['region']
-
- if grp_drh in user_groupes or \
- grp_drh2 in user_groupes or \
- grp_haute_direction in user_groupes:
- region_field.queryset = Region.objects.all()
- else:
- region_field.queryset = Region.objects.\
+ 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:
+ region_field.queryset = Region.objects.all()
+ else:
+ region_field.queryset = Region.objects.\
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']
- else:
+ if 'poste' in form.base_fields.keys():
poste_field = form.base_fields['poste']
-
- if grp_drh in user_groupes or \
- grp_drh2 in user_groupes or \
- grp_haute_direction 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)
+ 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:
+ 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)
# Bureau
- if 'bureau' in form.declared_fields:
+ bureau_field = None
+ if 'bureau' in form.declared_fields.keys():
bureau_field = form.declared_fields['bureau']
- else:
+ if 'bureau' in form.base_fields.keys():
bureau_field = form.base_fields['bureau']
-
- if grp_drh in user_groupes or \
- grp_drh2 in user_groupes or \
- grp_haute_direction in user_groupes:
- bureau_field.queryset = Bureau.objects.all()
- else:
- bureau_field.queryset = \
- Bureau.objects.filter(region=employe.implantation.region)
+ 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:
+ bureau_field.queryset = Bureau.objects.all()
+ else:
+ bureau_field.queryset = \
+ Bureau.objects.filter(region=employe.implantation.region)
return form
@@ -136,16 +169,16 @@ class OffreEmploiAdmin(VersionAdmin):
def queryset(self, request):
qs = self.model._default_manager.get_query_set() \
.select_related('offre_emploi')
- user_groupes = request.user.groups.all()
- if grp_drh in user_groupes or \
- grp_drh2 in user_groupes or \
- grp_haute_direction in user_groupes:
+ 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:
return qs
- if grp_directeurs_bureau in user_groupes or \
- grp_correspondants_rh in user_groupes or \
- grp_administrateurs in user_groupes:
- employe = get_emp(request.user)
+ if groups.DIRECTEUR_DE_BUREAU in user_groupes or \
+ groups.CORRESPONDANT_RH in user_groupes or \
+ groups.ADMINISTRATEURS in user_groupes:
+ employe = groups.get_employe_from_user(request.user)
return qs.filter(region=employe.implantation.region)
if Evaluateur.objects.filter(user=request.user).exists():
@@ -162,40 +195,72 @@ class OffreEmploiAdmin(VersionAdmin):
### Permission add, delete, change
def has_add_permission(self, request):
- user_groupes = request.user.groups.all()
+ user_groupes = get_user_groupnames(request.user)
if request.user.is_superuser is True or \
- grp_drh in user_groupes or \
- grp_drh2 in user_groupes or \
- grp_directeurs_bureau in user_groupes or \
- grp_administrateurs in user_groupes or \
- grp_haute_direction in user_groupes:
+ 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
return False
def has_delete_permission(self, request, obj=None):
- user_groupes = request.user.groups.all()
+ user_groupes = get_user_groupnames(request.user)
if request.user.is_superuser is True or \
- grp_drh in user_groupes or \
- grp_drh2 in user_groupes or \
- grp_directeurs_bureau in user_groupes or \
- grp_administrateurs in user_groupes or \
- grp_haute_direction in user_groupes:
+ groups.DRH_NIVEAU_1 in user_groupes or \
+ groups.DRH_NIVEAU_2 in user_groupes or \
+ groups.HAUTE_DIRECTION in user_groupes:
return True
+
+ if obj is not None:
+ employe = groups.get_employe_from_user(request.user)
+ if (groups.DIRECTEUR_DE_BUREAU in user_groupes or \
+ groups.ADMINISTRATEURS in user_groupes) and (
+ employe.implantation.region == obj.lieu_affectation.region):
+ return True
+
return False
def has_change_permission(self, request, obj=None):
- user_groupes = request.user.groups.all()
+ user_groupes = get_user_groupnames(request.user)
if request.user.is_superuser is True or \
- grp_drh in user_groupes or \
- grp_drh2 in user_groupes or \
- grp_directeurs_bureau in user_groupes or \
- grp_administrateurs in user_groupes or \
- grp_haute_direction in user_groupes:
+ groups.DRH_NIVEAU_1 in user_groupes or \
+ groups.DRH_NIVEAU_2 in user_groupes or \
+ groups.HAUTE_DIRECTION in user_groupes:
return True
+
+ if obj is not None:
+ employe = groups.get_employe_from_user(request.user)
+ if (groups.DIRECTEUR_DE_BUREAU in user_groupes or \
+ groups.ADMINISTRATEURS in user_groupes) and (
+ employe.implantation.region == obj.lieu_affectation.region):
+ return True
+ else:
+ if groups.DIRECTEUR_DE_BUREAU in user_groupes or \
+ groups.ADMINISTRATEURS in user_groupes:
+ return True
+
+
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 ProxyOffreEmploiAdmin(OffreEmploiAdmin):
+class OffreEmploiAdmin(VersionAdmin, OffreEmploiAdminMixin):
+ pass
+
+
+class ProxyOffreEmploiAdmin(OffreEmploiAdminMixin):
list_display = (
'nom', 'date_limite', 'region', 'statut', 'est_affiche'
)
@@ -226,11 +291,6 @@ class ProxyOffreEmploiAdmin(OffreEmploiAdmin):
def response_change(self, request, obj):
return redirect('admin:recrutement_proxyoffreemploi_changelist')
- ### Formulaire
- def get_form(self, request, obj=None, **kwargs):
- form = super(OffreEmploiAdmin, self).get_form(request, obj, **kwargs)
- return form
-
### Permissions add, delete, change
def has_add_permission(self, request):
return False
@@ -239,20 +299,10 @@ class ProxyOffreEmploiAdmin(OffreEmploiAdmin):
return False
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 in user_groupes or \
- grp_drh in user_groupes or \
- grp_drh2 in user_groupes or \
- grp_directeurs_bureau in user_groupes or \
- grp_administrateurs in user_groupes or \
- grp_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):
@@ -293,14 +343,14 @@ class CandidatEvaluationInline(admin.TabularInline):
return self.readonly_fields
-class CandidatAdmin(VersionAdmin):
+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", {
@@ -308,7 +358,7 @@ class CandidatAdmin(VersionAdmin):
}),
('Informations personnelles', {
'fields': (
- 'prenom', 'nom', 'genre', 'nationalite',
+ 'nom', 'prenom', 'genre', 'nationalite',
'situation_famille', 'nombre_dependant'
)
}),
@@ -332,7 +382,13 @@ class CandidatAdmin(VersionAdmin):
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)
@@ -349,7 +405,7 @@ class CandidatAdmin(VersionAdmin):
### Actions à afficher
def get_actions(self, request):
- actions = super(CandidatAdmin, self).get_actions(request)
+ actions = super(CandidatAdminMixin, self).get_actions(request)
del actions['delete_selected']
return actions
@@ -362,6 +418,23 @@ class CandidatAdmin(VersionAdmin):
)
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 "" \
@@ -377,7 +450,7 @@ class CandidatAdmin(VersionAdmin):
items = [u"