# -*- encoding: utf-8 -*-
from django.db.models import Q
-from rh import models as rh
-from utils import get_employe_from_user, is_user_dans_services_centraux
-from workflow import grp_drh
+
+from project.dae.utils import \
+ get_employe_from_user, is_user_dans_services_centraux
+from project.dae.workflow import grp_drh
+from project.rh import models as rh
+
class Responsable(object):
q = ""
- def get_query(self,q,request):
+
+ def get_query(self, q, request):
if len(q) < 4:
return rh.Poste.objects.none()
self.q = q
- postes = rh.Poste.objects.filter(
+ postes = rh.Poste.objects.filter(
Q(nom__icontains=q) |
Q(type_poste__nom__icontains=q) |
Q(rh_dossiers__employe__nom__icontains=q) |
def format_result(self, poste):
q = self.q
- filtre = Q(poste=poste) & (Q(poste__nom__icontains=q) | Q(employe__nom__icontains=q) | Q(employe__prenom__icontains=q))
+ filtre = Q(poste=poste) & (
+ Q(poste__nom__icontains=q) | Q(employe__nom__icontains=q) |
+ Q(employe__prenom__icontains=q)
+ )
dossiers = rh.Dossier.objects.filter(filtre)
-
+
nom_poste = poste.nom
-
+
if len(dossiers) == 1:
dossier = dossiers[0]
employe = dossier.employe
employe = unicode(dossiers[0].employe)
else:
employe = ""
- return "[%s] %s (%s) (%s)" % (poste.implantation.id, nom_poste, poste.id, employe)
+ return "[%s] %s (%s) (%s)" % (
+ poste.implantation.id, nom_poste, poste.id, employe
+ )
def format_item(self, poste):
- """ the display of a currently selected object in the area below the search box. html is OK """
+ """
+ the display of a currently selected object in the area below the
+ search box. html is OK
+ """
return self.format_result(poste)
def get_objects(self, ids):
- """ given a list of ids, return the objects ordered as you would like them on the admin page.
- this is for displaying the currently selected items (in the case of a ManyToMany field)
+ """
+ given a list of ids, return the objects ordered as you would like
+ them on the admin page. this is for displaying the currently
+ selected items (in the case of a ManyToMany field)
"""
return rh.Poste.objects.filter(pk__in=ids)
+
class Dossier(object):
- def get_query(self,q,request):
+ def get_query(self, q, request):
employe = get_employe_from_user(request.user)
prefixe_implantation = 'poste__implantation'
Q(employe__prenom__icontains=q)
if is_user_dans_services_centraux(request.user):
- q_place = Q(**{ '%s' % prefixe_implantation : employe.implantation })
+ q_place = Q(**{prefixe_implantation: employe.implantation})
else:
- q_place = Q(**{ '%s__region' % prefixe_implantation : employe.implantation.region })
-
+ q_place = Q(**{
+ prefixe_implantation + '__region': employe.implantation.region
+ })
if grp_drh in request.user.groups.all():
q_filtre = q_recherche
return dossier.__unicode__()
def format_item(self, dossier):
- """ the display of a currently selected object in the area below the search box. html is OK """
+ """
+ the display of a currently selected object in the area below the
+ search box. html is OK
+ """
return self.format_result(dossier)
def get_objects(self, ids):
- """ given a list of ids, return the objects ordered as you would like them on the admin page.
- this is for displaying the currently selected items (in the case of a ManyToMany field)
+ """
+ given a list of ids, return the objects ordered as you would like
+ them on the admin page. this is for displaying the currently
+ selected items (in the case of a ManyToMany field)
"""
return rh.Dossier.objects.filter(pk__in=ids)
+
class Poste(object):
- def get_query(self,q,request):
+ def get_query(self, q, request):
employe = get_employe_from_user(request.user)
prefixe_implantation = 'poste__implantation'
- q_recherche = Q(poste__nom__icontains=q) | Q(poste__type_poste__nom__icontains=q)
+ q_recherche = \
+ Q(poste__nom__icontains=q) | \
+ Q(poste__type_poste__nom__icontains=q)
if is_user_dans_services_centraux(request.user):
- q_place = Q(**{ '%s' % prefixe_implantation : employe.implantation })
+ q_place = Q(**{prefixe_implantation: employe.implantation})
else:
- q_place = Q(**{ '%s__region' % prefixe_implantation : employe.implantation.region })
-
+ q_place = Q(**{
+ prefixe_implantation + '__region': employe.implantation.region
+ })
if grp_drh in request.user.groups.all():
q_filtre = q_recherche
annee = dossier.date_debut.year
if dossier.date_fin is not None:
annee = dossier.date_fin.year
- return u"[%s] %s %s" % (dossier.poste.implantation, annee, dossier.poste.nom)
+ return u"[%s] %s %s" % (
+ dossier.poste.implantation, annee, dossier.poste.nom
+ )
def format_item(self, dossier):
- """ the display of a currently selected object in the area below the search box. html is OK """
+ """
+ the display of a currently selected object in the area below the
+ search box. html is OK
+ """
return self.format_result(dossier)
def get_objects(self, ids):
- """ given a list of ids, return the objects ordered as you would like them on the admin page.
- this is for displaying the currently selected items (in the case of a ManyToMany field)
+ """
+ given a list of ids, return the objects ordered as you would like
+ them on the admin page. this is for displaying the currently
+ selected items (in the case of a ManyToMany field)
"""
return rh.Dossier.objects.filter(pk__in=ids)
# -*- encoding: utf-8 -*-
-from django.db.models import Q
from django.contrib import messages
-from django.contrib.auth.decorators import user_passes_test
-from django.core.urlresolvers import reverse
from django.http import HttpResponseRedirect
from django.shortcuts import get_object_or_404
-from workflow import dae_groupes, ETATS_EDITABLE, ETATS_VALIDE, \
- grp_drh, grp_drh2
+from project.dae.workflow import \
+ dae_groupes, ETATS_EDITABLE, ETATS_VALIDE, grp_drh, grp_drh2
from project.dae import models as dae
from project.rh import models as rh
-from utils import get_employe_from_user
+
def user_in_dae_groupes(user):
"""
return True
return False
+
def redirect_interdiction(request, msg=u"Vous n'avez pas accès à cette page"):
- """
- Redirection du la page de login avec un message d'erreur.
- """
- from django.conf import settings
- from django.contrib.auth import REDIRECT_FIELD_NAME
- from django.utils.http import urlquote
- login_url = settings.LOGIN_URL
- path = urlquote(request.get_full_path())
- tup = login_url, REDIRECT_FIELD_NAME, path
- messages.add_message(request, messages.ERROR, "Votre compte ne permet pas d'accéder à cette partie de l'application.")
- return HttpResponseRedirect('%s?%s=%s' % tup)
+ """
+ Redirection du la page de login avec un message d'erreur.
+ """
+ from django.conf import settings
+ from django.contrib.auth import REDIRECT_FIELD_NAME
+ from django.utils.http import urlquote
+ login_url = settings.LOGIN_URL
+ path = urlquote(request.get_full_path())
+ tup = login_url, REDIRECT_FIELD_NAME, path
+ messages.add_message(
+ request, messages.ERROR,
+ "Votre compte ne permet pas d'accéder à cette partie de l'application."
+ )
+ return HttpResponseRedirect('%s?%s=%s' % tup)
+
def dae_groupe_requis(fn):
"""
- L'accès à la plateforme nécessite d'appartenir au moins à un groupe,
- ou d'être superuser. De cette manière l'autentification AUF fonctionnera
- toujours, il suffit de mettre le nouvel employé dans le groupe qui le concerne.
+ L'accès à la plateforme nécessite d'appartenir au moins à un groupe, ou
+ d'être superuser. De cette manière l'autentification AUF fonctionnera
+ toujours, il suffit de mettre le nouvel employé dans le groupe qui le
+ concerne.
"""
def inner(request, *args, **kwargs):
user = request.user
if user.is_superuser or user_in_dae_groupes(user):
return fn(request, *args, **kwargs)
- else :
- msg = u"Votre compte ne permet pas d'accéder à cette partie de l'application."
+ else:
+ msg = u"Votre compte ne permet pas d'accéder à cette partie " \
+ u"de l'application."
return redirect_interdiction(request, msg)
return inner
+
def poste_dans_ma_region_ou_service(fn):
"""
- Test si le user connecté appartient bien à la même région ou service que le poste.
+ Test si le user connecté appartient bien à la même région ou service que
+ le poste.
"""
def inner(request, *args, **kwargs):
user = request.user
postes = Poste.objects.ma_region_ou_service(user).filter(id=id)
if len(postes) > 0:
return fn(request, *args, **kwargs)
- else :
+ else:
msg = u"Vous n'avez pas le droit de consulter ce poste."
return redirect_interdiction(request, msg)
return inner
+
def dossier_dans_ma_region_ou_service(fn):
"""
- Test si le user connecté appartient bien à la même région ou service que le poste.
+ Test si le user connecté appartient bien à la même région ou service que
+ le poste.
"""
def inner(request, *args, **kwargs):
user = request.user
poste_key = kwargs.get('key', None)
dossier_id = kwargs.get('dossier_id', None)
- # Si on s'intéresse à un dossier, on teste la validation avec le poste associé
+ # Si on s'intéresse à un dossier, on teste la validation avec le
+ # poste associé
if dossier_id is not None:
- dossiers = dae.Dossier.objects.ma_region_ou_service(user).filter(id=dossier_id)
+ dossiers = dae.Dossier.objects.ma_region_ou_service(user) \
+ .filter(id=dossier_id)
if len(dossiers) > 0:
return fn(request, *args, **kwargs)
- else :
- msg = u"Vous n'avez pas le droit de consulter ce dossier d'embauche."
+ else:
+ msg = u"Vous n'avez pas le droit de consulter " \
+ u"ce dossier d'embauche."
return redirect_interdiction(request, msg)
# Autoriser la création d'une nouvelle demande
return fn(request, *args, **kwargs)
# On est en train de répondre à un poste
else:
- return poste_dans_ma_region_ou_service(fn)(request, *args, **kwargs)
+ return poste_dans_ma_region_ou_service(fn)(
+ request, *args, **kwargs
+ )
return inner
+
def vieux_dossier_dans_ma_region_ou_service(fn):
"""
- Test si le user connecté appartient bien à la même région ou service que le poste.
+ Test si le user connecté appartient bien à la même région ou service que
+ le poste.
"""
def inner(request, *args, **kwargs):
user = request.user
dossier_id = kwargs.get('dossier_id', None)
- dossiers = rh.Dossier.objects.ma_region_ou_service(user).filter(id=dossier_id)
+ dossiers = rh.Dossier.objects.ma_region_ou_service(user) \
+ .filter(id=dossier_id)
if len(dossiers) > 0:
return fn(request, *args, **kwargs)
else:
- msg = u"Vous n'avez pas le droit de consulter ce dossier d'embauche."
+ msg = u"Vous n'avez pas le droit de consulter " \
+ u"ce dossier d'embauche."
return redirect_interdiction(request, msg)
-
return inner
+
def employe_dans_ma_region_ou_service(fn):
"""
Test d'accès à un employé
employe_key = kwargs.get('employe_key')
if employe_key in autorises:
return fn(request, *args, **kwargs)
- else :
+ else:
msg = u"Vous n'avez pas le droit de consulter cet employé."
return redirect_interdiction(request, msg)
return inner
+
def dossier_est_modifiable(fn):
def inner(request, *args, **kwargs):
dossier_id = kwargs.get('dossier_id', None)
dossier = dae.Dossier.objects.get(id=dossier_id)
if not (dossier.etat in ETATS_EDITABLE and
(grp_drh in user_groupes or grp_drh2 in user_groupes or
- dossier in dae.Dossier.objects.mes_choses_a_faire(request.user).all())):
+ dossier in dae.Dossier.objects \
+ .mes_choses_a_faire(request.user).all())):
msg = u"Ce dossier d'embauche ne peut plus être modifié."
return redirect_interdiction(request, msg)
return fn(request, *args, **kwargs)
return inner
+
def poste_est_modifiable(fn):
def inner(request, *args, **kwargs):
key = kwargs.get('key', None)
poste_id = key.split('-')[1]
poste = dae.Poste.objects.get(id=poste_id)
if grp_drh not in request.user.groups.all() and \
- (poste.etat not in ETATS_EDITABLE or poste not in dae.Poste.objects.mes_choses_a_faire(request.user).all()):
+ (poste.etat not in ETATS_EDITABLE \
+ or poste not in dae.Poste.objects \
+ .mes_choses_a_faire(request.user).all()):
msg = u"Ce poste ne peut plus être modifié."
return redirect_interdiction(request, msg)
return fn(request, *args, **kwargs)
return inner
+
def get_contrat(fn):
"""Ce décorateur s'attend à ce que le premier argument de la vue décorée
soit l'ID d'un contrat. Il vérifie les permissions, puis transforme
user_groupes = request.user.groups.all()
if not (dossier.etat in ETATS_VALIDE and
(grp_drh in user_groupes or grp_drh2 in user_groupes or
- dossier in dae.Dossier.objects.mes_choses_a_faire(request.user).all())):
+ dossier in dae.Dossier.objects \
+ .mes_choses_a_faire(request.user).all())):
return redirect_interdiction(request)
return fn(request, contrat, *args, **kwargs)
return inner
# -*- encoding: utf-8 -*-
-from django.db import models
from django.db.models import Q
-from utils import get_employe_from_user
-from workflow import MAP_GROUPE_ETATS_A_FAIRE, DOSSIER_ETAT_FINALISE, \
- POSTE_ETAT_FINALISE
-from workflow import grp_drh, \
- grp_drh2, \
- grp_accior, \
- grp_abf, \
- grp_haute_direction, \
- grp_service_utilisateurs
-
-from rh.managers import DossierManager as RHDossierManager
-from rh.managers import PosteManager as RHPosteManager
-from rh.managers import PosteComparaisonManager as RHPosteComparaisonManager
-from rh.managers import DossierComparaisonManager as RHDossierComparaisonManager
+
+from project.dae.utils import get_employe_from_user
+from project.dae.workflow import MAP_GROUPE_ETATS_A_FAIRE
+from project.dae.workflow import \
+ grp_drh, grp_drh2, grp_accior, \
+ grp_abf, grp_haute_direction, grp_service_utilisateurs
+from project.rh.managers import \
+ DossierManager as RHDossierManager, \
+ PosteManager as RHPosteManager, \
+ PosteComparaisonManager as RHPosteComparaisonManager, \
+ DossierComparaisonManager as RHDossierComparaisonManager
class TodoManagerMixin(object):
q2 = Q(etat=etat)
if g == grp_service_utilisateurs:
q2 &= Q(**{self.prefixe_service: employe.service})
- elif g not in (grp_accior, grp_abf, grp_haute_direction, grp_drh, grp_drh2):
- q2 &= Q(**{self.prefixe_implantation: employe.implantation.region})
+ elif g not in (
+ grp_accior, grp_abf, grp_haute_direction, grp_drh, grp_drh2
+ ):
+ q2 &= Q(**{
+ self.prefixe_implantation: employe.implantation.region
+ })
q |= q2
if rien_a_faire:
return qs
+
class DossierManager(RHDossierManager, TodoManagerMixin):
pass
+
class PosteManager(RHPosteManager, TodoManagerMixin):
pass
+
class PosteComparaisonManager(RHPosteComparaisonManager, TodoManagerMixin):
pass
+
class DossierComparaisonManager(RHDossierComparaisonManager, TodoManagerMixin):
pass
# -*- encoding: utf-8 -*-
-from django.contrib.auth.models import Group
from auf.django.workflow.models import WorkflowMixin
-from utils import is_user_dans_services_centraux, is_user_dans_region
-from rh.groups import *
+
+from project.dae.utils import \
+ is_user_dans_services_centraux, is_user_dans_region
+from project.rh.groups import \
+ grp_drh, grp_drh2, grp_administrateurs, grp_service_utilisateurs, \
+ grp_correspondants_rh, grp_directeurs_bureau, grp_accior, grp_abf, \
+ grp_haute_direction
# codes états
POSTE_ETAT_BROUILLON = 'BROUILLON'
#libellés états
POSTE_ETATS = {
- POSTE_ETAT_BROUILLON : u"En rédaction",
- POSTE_ETAT_ADMINISTRATEUR : u"Validation de l'administrateur",
- POSTE_ETAT_DIRECTEUR_BUREAU : u"Directeur de bureau",
- POSTE_ETAT_SERVICE_UTILISATEURS : u"Service utilisateurs",
- POSTE_ETAT_DRH_CONTROLE : u"Validation DRH",
- POSTE_ETAT_DRH_2 : u"Validation DRH 2",
- POSTE_ETAT_DEMANDE_MODIF : u"Demande de modification",
- POSTE_ETAT_ACCIOR : u"ACCIOR",
- POSTE_ETAT_ABF : u"ABF",
- POSTE_ETAT_HAUTE_DIRECTION : u"Validation : Secrétaire général / Recteur",
- POSTE_ETAT_DEMANDE_JUSTIF : u"Demande de justification",
- POSTE_ETAT_REGION_FINALISATION : u'Retour à la région',
- POSTE_ETAT_DRH_FINALISATION : u'Retour à la DRH',
- POSTE_ETAT_FINALISE : u'Finalisée'
+ POSTE_ETAT_BROUILLON: u"En rédaction",
+ POSTE_ETAT_ADMINISTRATEUR: u"Validation de l'administrateur",
+ POSTE_ETAT_DIRECTEUR_BUREAU: u"Directeur de bureau",
+ POSTE_ETAT_SERVICE_UTILISATEURS: u"Service utilisateurs",
+ POSTE_ETAT_DRH_CONTROLE: u"Validation DRH",
+ POSTE_ETAT_DRH_2: u"Validation DRH 2",
+ POSTE_ETAT_DEMANDE_MODIF: u"Demande de modification",
+ POSTE_ETAT_ACCIOR: u"ACCIOR",
+ POSTE_ETAT_ABF: u"ABF",
+ POSTE_ETAT_HAUTE_DIRECTION: u"Validation : Secrétaire général / Recteur",
+ POSTE_ETAT_DEMANDE_JUSTIF: u"Demande de justification",
+ POSTE_ETAT_REGION_FINALISATION: u'Retour à la région',
+ POSTE_ETAT_DRH_FINALISATION: u'Retour à la DRH',
+ POSTE_ETAT_FINALISE: u'Finalisée'
}
#libellés états pour boutons
POSTE_ETATS_BOUTONS = {
- POSTE_ETAT_DIRECTEUR_BUREAU : u"Envoyer au directeur de bureau",
- POSTE_ETAT_SERVICE_UTILISATEURS : u"Envoyer au service utilisateurs",
- POSTE_ETAT_ADMINISTRATEUR : u"Envoyer à l'adminstrateur",
- POSTE_ETAT_DRH_CONTROLE : u"Envoyer à la DRH (validation)",
- POSTE_ETAT_DRH_2 : u"Envoyer à DRH 2",
- POSTE_ETAT_DEMANDE_MODIF : u"Envoyer une demande de modification",
- POSTE_ETAT_ACCIOR : u"Envoyer à l'ACCIOR",
- POSTE_ETAT_ABF : u"Envoyer à l'ABF",
- POSTE_ETAT_HAUTE_DIRECTION : u"Envoyer à la haute direction",
- POSTE_ETAT_DEMANDE_JUSTIF : u"Envoyer une demande de justification",
- POSTE_ETAT_REGION_FINALISATION : u"Retourner à la région pour finalisation",
- POSTE_ETAT_DRH_FINALISATION : u'Retourner à la DRH pour finalisation',
- POSTE_ETAT_FINALISE : u'Finaliser'
+ POSTE_ETAT_DIRECTEUR_BUREAU: u"Envoyer au directeur de bureau",
+ POSTE_ETAT_SERVICE_UTILISATEURS: u"Envoyer au service utilisateurs",
+ POSTE_ETAT_ADMINISTRATEUR: u"Envoyer à l'adminstrateur",
+ POSTE_ETAT_DRH_CONTROLE: u"Envoyer à la DRH (validation)",
+ POSTE_ETAT_DRH_2: u"Envoyer à DRH 2",
+ POSTE_ETAT_DEMANDE_MODIF: u"Envoyer une demande de modification",
+ POSTE_ETAT_ACCIOR: u"Envoyer à l'ACCIOR",
+ POSTE_ETAT_ABF: u"Envoyer à l'ABF",
+ POSTE_ETAT_HAUTE_DIRECTION: u"Envoyer à la haute direction",
+ POSTE_ETAT_DEMANDE_JUSTIF: u"Envoyer une demande de justification",
+ POSTE_ETAT_REGION_FINALISATION: u"Retourner à la région pour finalisation",
+ POSTE_ETAT_DRH_FINALISATION: u'Retourner à la DRH pour finalisation',
+ POSTE_ETAT_FINALISE: u'Finaliser'
}
# définition du worflow séquentiel
POSTE_ACTIONS = {
- POSTE_ACTION_ENVOYER_BROUILLON : {
- 'nom' : u'Créer',
- 'etat_initial' : None,
- 'etat_final' : POSTE_ETAT_BROUILLON,
+ POSTE_ACTION_ENVOYER_BROUILLON: {
+ 'nom': u'Créer',
+ 'etat_initial': None,
+ 'etat_final': POSTE_ETAT_BROUILLON,
},
- POSTE_ACTION_ENVOYER_ADMINISTRATEUR : {
- 'nom' : u'Envoyer',
- 'etat_initial' : (POSTE_ETAT_BROUILLON,),
- 'etat_final' : POSTE_ETAT_ADMINISTRATEUR,
+ POSTE_ACTION_ENVOYER_ADMINISTRATEUR: {
+ 'nom': u'Envoyer',
+ 'etat_initial': (POSTE_ETAT_BROUILLON,),
+ 'etat_final': POSTE_ETAT_ADMINISTRATEUR,
},
- POSTE_ACTION_ENVOYER_SRV_UTILISATEURS : {
- 'nom' : u'Envoyer',
- 'etat_initial' : (POSTE_ETAT_ADMINISTRATEUR,),
- 'etat_final' : POSTE_ETAT_SERVICE_UTILISATEURS,
+ POSTE_ACTION_ENVOYER_SRV_UTILISATEURS: {
+ 'nom': u'Envoyer',
+ 'etat_initial': (POSTE_ETAT_ADMINISTRATEUR,),
+ 'etat_final': POSTE_ETAT_SERVICE_UTILISATEURS,
},
- POSTE_ACTION_ENVOYER_DIRECTEUR_BUREAU : {
- 'nom' : u'Envoyer',
- 'etat_initial' : (POSTE_ETAT_ADMINISTRATEUR,),
- 'etat_final' : POSTE_ETAT_DIRECTEUR_BUREAU,
+ POSTE_ACTION_ENVOYER_DIRECTEUR_BUREAU: {
+ 'nom': u'Envoyer',
+ 'etat_initial': (POSTE_ETAT_ADMINISTRATEUR,),
+ 'etat_final': POSTE_ETAT_DIRECTEUR_BUREAU,
},
- POSTE_ACTION_ENVOYER_DRH_CONTROLE : {
- 'nom' : u'Envoyer',
- 'etat_initial' : (POSTE_ETAT_ADMINISTRATEUR, POSTE_ETAT_DIRECTEUR_BUREAU, POSTE_ETAT_SERVICE_UTILISATEURS),
- 'etat_final' : POSTE_ETAT_DRH_CONTROLE,
+ POSTE_ACTION_ENVOYER_DRH_CONTROLE: {
+ 'nom': u'Envoyer',
+ 'etat_initial': (
+ POSTE_ETAT_ADMINISTRATEUR, POSTE_ETAT_DIRECTEUR_BUREAU,
+ POSTE_ETAT_SERVICE_UTILISATEURS
+ ),
+ 'etat_final': POSTE_ETAT_DRH_CONTROLE,
},
- POSTE_ACTION_ENVOYER_DRH_2 : {
- 'nom' : u'Envoyer',
- 'etat_initial' : (POSTE_ETAT_DRH_CONTROLE,),
- 'etat_final' : POSTE_ETAT_DRH_2,
+ POSTE_ACTION_ENVOYER_DRH_2: {
+ 'nom': u'Envoyer',
+ 'etat_initial': (POSTE_ETAT_DRH_CONTROLE,),
+ 'etat_final': POSTE_ETAT_DRH_2,
},
- POSTE_ACTION_DEMANDE_MODIF : {
- 'nom' : u'Envoyer',
- 'etat_initial' : (POSTE_ETAT_DRH_CONTROLE, POSTE_ETAT_DRH_2),
+ POSTE_ACTION_DEMANDE_MODIF: {
+ 'nom': u'Envoyer',
+ 'etat_initial': (POSTE_ETAT_DRH_CONTROLE, POSTE_ETAT_DRH_2),
'etat_final': POSTE_ETAT_DEMANDE_MODIF,
},
- POSTE_ACTION_RETOUR_DEMANDE_MODIF : {
+ POSTE_ACTION_RETOUR_DEMANDE_MODIF: {
'nom': u'Retourner',
'etat_initial': (POSTE_ETAT_DEMANDE_MODIF,),
'etat_final': POSTE_ETAT_DRH_CONTROLE,
},
- POSTE_ACTION_ENVOYER_ACCIOR : {
- 'nom' : u'Envoyer',
- 'etat_initial' : (POSTE_ETAT_DRH_2,),
- 'etat_final' : POSTE_ETAT_ACCIOR,
+ POSTE_ACTION_ENVOYER_ACCIOR: {
+ 'nom': u'Envoyer',
+ 'etat_initial': (POSTE_ETAT_DRH_2,),
+ 'etat_final': POSTE_ETAT_ACCIOR,
},
- POSTE_ACTION_ENVOYER_ABF : {
- 'nom' : u'Envoyer',
- 'etat_initial' : (POSTE_ETAT_ACCIOR,),
- 'etat_final' : POSTE_ETAT_ABF,
+ POSTE_ACTION_ENVOYER_ABF: {
+ 'nom': u'Envoyer',
+ 'etat_initial': (POSTE_ETAT_ACCIOR,),
+ 'etat_final': POSTE_ETAT_ABF,
},
- POSTE_ACTION_ENVOYER_HAUTE_DIRECTION : {
- 'nom' : u'Envoyer',
- 'etat_initial' : (POSTE_ETAT_ABF,),
- 'etat_final' : POSTE_ETAT_HAUTE_DIRECTION,
+ POSTE_ACTION_ENVOYER_HAUTE_DIRECTION: {
+ 'nom': u'Envoyer',
+ 'etat_initial': (POSTE_ETAT_ABF,),
+ 'etat_final': POSTE_ETAT_HAUTE_DIRECTION,
},
- POSTE_ACTION_DEMANDE_JUSTIF : {
- 'nom' : u'Envoyer',
- 'etat_initial' : (POSTE_ETAT_HAUTE_DIRECTION,),
+ POSTE_ACTION_DEMANDE_JUSTIF: {
+ 'nom': u'Envoyer',
+ 'etat_initial': (POSTE_ETAT_HAUTE_DIRECTION,),
'etat_final': POSTE_ETAT_DEMANDE_JUSTIF,
},
- POSTE_ACTION_RETOUR_DEMANDE_JUSTIF : {
- 'nom' : u'Envoyer',
- 'etat_initial' : (POSTE_ETAT_DEMANDE_JUSTIF,),
+ POSTE_ACTION_RETOUR_DEMANDE_JUSTIF: {
+ 'nom': u'Envoyer',
+ 'etat_initial': (POSTE_ETAT_DEMANDE_JUSTIF,),
'etat_final': POSTE_ETAT_HAUTE_DIRECTION,
},
- POSTE_ACTION_ENVOYER_REGION_FINALISATION : {
- 'nom' : u'Envoyer',
- 'etat_initial' : (POSTE_ETAT_HAUTE_DIRECTION,),
- 'etat_final' : POSTE_ETAT_REGION_FINALISATION
+ POSTE_ACTION_ENVOYER_REGION_FINALISATION: {
+ 'nom': u'Envoyer',
+ 'etat_initial': (POSTE_ETAT_HAUTE_DIRECTION,),
+ 'etat_final': POSTE_ETAT_REGION_FINALISATION
},
- POSTE_ACTION_ENVOYER_DRH_FINALISATION : {
- 'nom' : u'Envoyer',
- 'etat_initial' : (POSTE_ETAT_REGION_FINALISATION,),
- 'etat_final' : POSTE_ETAT_DRH_FINALISATION,
+ POSTE_ACTION_ENVOYER_DRH_FINALISATION: {
+ 'nom': u'Envoyer',
+ 'etat_initial': (POSTE_ETAT_REGION_FINALISATION,),
+ 'etat_final': POSTE_ETAT_DRH_FINALISATION,
},
- POSTE_ACTION_FINALISER : {
- 'nom' : u'Finaliser',
- 'etat_initial' : (POSTE_ETAT_DRH_FINALISATION,),
- 'etat_final' : POSTE_ETAT_FINALISE
+ POSTE_ACTION_FINALISER: {
+ 'nom': u'Finaliser',
+ 'etat_initial': (POSTE_ETAT_DRH_FINALISATION,),
+ 'etat_final': POSTE_ETAT_FINALISE
},
}
def acces_directeur_bureau(self, action, request):
user_groups = request.user.groups.all()
return grp_drh in user_groups or grp_drh2 in user_groups or \
- (is_user_dans_services_centraux(request.user) and
+ (is_user_dans_services_centraux(request.user) and
grp_administrateurs in user_groups)
def acces_administrateur(self, action, request):
user_groups = request.user.groups.all()
- return grp_correspondants_rh in user_groups or grp_drh in user_groups or \
- grp_drh2 in user_groups
+ return grp_correspondants_rh in user_groups or grp_drh in user_groups \
+ or grp_drh2 in user_groups
def acces_drh_controle(self, action, request):
user_groups = request.user.groups.all()
if not is_user_dans_services_centraux(request.user):
return False
user_groups = request.user.groups.all()
- return grp_administrateurs in user_groups or grp_drh in user_groups or \
- grp_drh2 in user_groups
+ return grp_administrateurs in user_groups or grp_drh in user_groups \
+ or grp_drh2 in user_groups
def acces_accior(self, action, request):
user_groups = request.user.groups.all()
def acces_abf(self, action, request):
user_groups = request.user.groups.all()
- return grp_accior in user_groups or grp_drh in user_groups or grp_drh2 in user_groups
+ return grp_accior in user_groups or grp_drh in user_groups \
+ or grp_drh2 in user_groups
def acces_haute_direction(self, action, request):
user_groups = request.user.groups.all()
- return grp_abf in user_groups or grp_drh in user_groups or grp_drh2 in user_groups
+ return grp_abf in user_groups or grp_drh in user_groups \
+ or grp_drh2 in user_groups
def acces_region_finalisation(self, action, request):
user_groups = request.user.groups.all()
- return grp_haute_direction in user_groups or grp_drh in user_groups or \
- grp_drh2 in user_groups
+ return grp_haute_direction in user_groups or grp_drh in user_groups \
+ or grp_drh2 in user_groups
def acces_drh_finalisation(self, action, request):
user_groups = request.user.groups.all()
def acces_demande_justif(self, action, request):
user_groups = request.user.groups.all()
- return grp_haute_direction in user_groups or grp_drh in user_groups or \
- grp_drh2 in user_groups
+ return grp_haute_direction in user_groups or grp_drh in user_groups \
+ or grp_drh2 in user_groups
def acces_retour_demande_modif(self, action, request):
user_groups = request.user.groups.all()
- return grp_administrateurs in user_groups or grp_drh in user_groups or \
- grp_drh2 in user_groups
+ return grp_administrateurs in user_groups or grp_drh in user_groups \
+ or grp_drh2 in user_groups
def acces_retour_demande_justif(self, action, request):
user_groups = request.user.groups.all()
DOSSIER_ETAT_DRH_FINALISATION = POSTE_ETAT_DRH_FINALISATION
DOSSIER_ETAT_FINALISE = POSTE_ETAT_FINALISE
+
class DossierWorkflow(PosteWorkflow):
class Meta:
MAP_GROUPE_ETATS_A_FAIRE = {
- grp_correspondants_rh : (POSTE_ETAT_BROUILLON, DOSSIER_ETAT_BROUILLON,
- POSTE_ETAT_REGION_FINALISATION,
- DOSSIER_ETAT_REGION_FINALISATION),
- grp_service_utilisateurs : (POSTE_ETAT_SERVICE_UTILISATEURS,
- DOSSIER_ETAT_SERVICE_UTILISATEURS,),
- grp_administrateurs : (POSTE_ETAT_ADMINISTRATEUR,
- DOSSIER_ETAT_ADMINISTRATEUR,
- POSTE_ETAT_DEMANDE_MODIF,
- DOSSIER_ETAT_DEMANDE_MODIF,
- POSTE_ETAT_REGION_FINALISATION,
- DOSSIER_ETAT_REGION_FINALISATION,
- ),
- grp_directeurs_bureau : (POSTE_ETAT_DIRECTEUR_BUREAU, DOSSIER_ETAT_DIRECTEUR_BUREAU, ),
- grp_drh : (POSTE_ETAT_DRH_CONTROLE, POSTE_ETAT_DRH_FINALISATION,
- DOSSIER_ETAT_DRH_CONTROLE, DOSSIER_ETAT_DRH_FINALISATION,
- POSTE_ETAT_DEMANDE_JUSTIF, DOSSIER_ETAT_DEMANDE_JUSTIF),
- grp_drh2 : (POSTE_ETAT_DRH_2, DOSSIER_ETAT_DRH_2),
- grp_accior : (POSTE_ETAT_ACCIOR, DOSSIER_ETAT_ACCIOR, ),
- grp_abf : (POSTE_ETAT_ABF, DOSSIER_ETAT_ABF, ),
- grp_haute_direction : (POSTE_ETAT_HAUTE_DIRECTION, DOSSIER_ETAT_HAUTE_DIRECTION, ),
+ grp_correspondants_rh: (
+ POSTE_ETAT_BROUILLON, DOSSIER_ETAT_BROUILLON,
+ POSTE_ETAT_REGION_FINALISATION, DOSSIER_ETAT_REGION_FINALISATION
+ ),
+ grp_service_utilisateurs: (
+ POSTE_ETAT_SERVICE_UTILISATEURS,
+ DOSSIER_ETAT_SERVICE_UTILISATEURS
+ ),
+ grp_administrateurs: (
+ POSTE_ETAT_ADMINISTRATEUR, DOSSIER_ETAT_ADMINISTRATEUR,
+ POSTE_ETAT_DEMANDE_MODIF, DOSSIER_ETAT_DEMANDE_MODIF,
+ POSTE_ETAT_REGION_FINALISATION, DOSSIER_ETAT_REGION_FINALISATION,
+ ),
+ grp_directeurs_bureau: (
+ POSTE_ETAT_DIRECTEUR_BUREAU, DOSSIER_ETAT_DIRECTEUR_BUREAU
+ ),
+ grp_drh: (
+ POSTE_ETAT_DRH_CONTROLE, POSTE_ETAT_DRH_FINALISATION,
+ DOSSIER_ETAT_DRH_CONTROLE, DOSSIER_ETAT_DRH_FINALISATION,
+ POSTE_ETAT_DEMANDE_JUSTIF, DOSSIER_ETAT_DEMANDE_JUSTIF
+ ),
+ grp_drh2: (POSTE_ETAT_DRH_2, DOSSIER_ETAT_DRH_2),
+ grp_accior: (POSTE_ETAT_ACCIOR, DOSSIER_ETAT_ACCIOR),
+ grp_abf: (POSTE_ETAT_ABF, DOSSIER_ETAT_ABF),
+ grp_haute_direction: (
+ POSTE_ETAT_HAUTE_DIRECTION, DOSSIER_ETAT_HAUTE_DIRECTION
+ ),
}
-ETATS_EDITABLE = (POSTE_ETAT_BROUILLON, POSTE_ETAT_ADMINISTRATEUR,
- POSTE_ETAT_DRH_CONTROLE, POSTE_ETAT_DRH_2,
- POSTE_ETAT_DIRECTEUR_BUREAU,
- POSTE_ETAT_SERVICE_UTILISATEURS, POSTE_ETAT_DEMANDE_MODIF,
- POSTE_ETAT_DEMANDE_JUSTIF, DOSSIER_ETAT_BROUILLON,
- DOSSIER_ETAT_ADMINISTRATEUR, DOSSIER_ETAT_DRH_CONTROLE,
- DOSSIER_ETAT_DRH_2, DOSSIER_ETAT_DIRECTEUR_BUREAU,
- DOSSIER_ETAT_SERVICE_UTILISATEURS,
- DOSSIER_ETAT_DEMANDE_MODIF, DOSSIER_ETAT_DEMANDE_JUSTIF,
+ETATS_EDITABLE = (
+ POSTE_ETAT_BROUILLON, POSTE_ETAT_ADMINISTRATEUR,
+ POSTE_ETAT_DRH_CONTROLE, POSTE_ETAT_DRH_2, POSTE_ETAT_DIRECTEUR_BUREAU,
+ POSTE_ETAT_SERVICE_UTILISATEURS, POSTE_ETAT_DEMANDE_MODIF,
+ POSTE_ETAT_DEMANDE_JUSTIF, DOSSIER_ETAT_BROUILLON,
+ DOSSIER_ETAT_ADMINISTRATEUR, DOSSIER_ETAT_DRH_CONTROLE,
+ DOSSIER_ETAT_DRH_2, DOSSIER_ETAT_DIRECTEUR_BUREAU,
+ DOSSIER_ETAT_SERVICE_UTILISATEURS, DOSSIER_ETAT_DEMANDE_MODIF,
+ DOSSIER_ETAT_DEMANDE_JUSTIF,
)
-ETATS_VALIDE = (DOSSIER_ETAT_REGION_FINALISATION, DOSSIER_ETAT_DRH_FINALISATION,
- DOSSIER_ETAT_FINALISE)
+ETATS_VALIDE = (
+ DOSSIER_ETAT_REGION_FINALISATION, DOSSIER_ETAT_DRH_FINALISATION,
+ DOSSIER_ETAT_FINALISE
+)
# -*- encoding: utf-8 -*-
-import datamaster_modeles.models as ref
-import rh.models as rh
-from operator import itemgetter
+from datamaster_modeles import models as ref
+from django.contrib.auth.models import Group
+
+from project.rh import models as rh
+
def get_employe_from_user(user):
"""
- Retourne un employé AUF (rh.Employe) à partir de son user Django.
+ Retourne un employé AUF (rh.Employe) à partir de son user Django.
"""
try:
ref_employe = ref.Authentification.objects.get(courriel=user.email).id
employe.tel_pro_poste = ref_employe.telephone_poste
employe.tel_pro_ip = ref_employe.telephone_ip
except:
- #raise Exception(u"L'employé avec le courriel %s n'a pas été trouvé dans le référentiel." % user.email)
employe = rh.Employe.objects.none()
return employe
+
def get_employe_from_id(id):
"""
- Retourne un employé AUF (rh.Employe) à partir de son id.
+ Retourne un employé AUF (rh.Employe) à partir de son id.
"""
try:
employe = rh.Employe.objects.get(id=id)
except:
employe = rh.Employe.objects.none()
return employe
-
+
+
def safe_create_groupe(name=None, id=None):
"""
Création d'un groupe prédéfini. Retourne None, quand la création
try:
if name:
grp, created = Group.objects.get_or_create(name=name)
- elif id :
+ elif id:
grp, created = Group.objects.get_or_create(id=id)
except:
return None
return grp
-
from django.forms.models import BaseInlineFormSet
from django.db.models import Avg
from django.conf import settings
+from django.shortcuts import redirect
from reversion.admin import VersionAdmin
from datamaster_modeles.models import 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_drh_recrutement, grp_drh2_recrutement, \
+from project.recrutement.forms import OffreEmploiForm
+from project.recrutement.models import \
+ Evaluateur, CandidatEvaluation, CandidatPiece, OffreEmploi, \
+ ProxyOffreEmploi, Candidat, ProxyCandidat, MesCandidatEvaluation, \
+ CourrielTemplate
+from project.recrutement.workflow import \
+ grp_drh_recrutement, grp_drh2_recrutement, \
grp_directeurs_bureau_recrutement, \
grp_administrateurs_recrutement, \
grp_correspondants_rh_recrutement, \
grp_haute_direction_recrutement
-from recrutement.forms import *
### CONSTANTES
IMPLANTATIONS_CENTRALES = [15, 19]
+
class OrderedChangeList(admin.views.main.ChangeList):
"""
Surcharge pour appliquer le order_by d'un annotate
qs = qs.order_by('-moyenne')
return qs
+
class OffreEmploiAdmin(VersionAdmin):
date_hierarchy = 'date_creation'
- list_display = ('nom', 'date_limite', 'region', 'statut',
- 'est_affiche', '_candidatsList', )
+ list_display = (
+ 'nom', 'date_limite', 'region', 'statut', 'est_affiche',
+ '_candidatsList'
+ )
exclude = ('actif', 'poste_nom', 'resume',)
list_filter = ('statut',)
actions = ['affecter_evaluateurs_offre_emploi', ]
return actions
### Affecter un évaluateurs à des offres d'emploi
- def affecter_evaluateurs_offre_emploi(modeladmin, obj, candidats):
+ def affecter_evaluateurs_offre_emploi(modeladmin, obj, candidats):
selected = obj.POST.getlist(admin.ACTION_CHECKBOX_NAME)
- return HttpResponseRedirect(reverse('affecter_evaluateurs_offre_emploi')+
- "?ids=%s" % (",".join(selected)))
- affecter_evaluateurs_offre_emploi.short_description = u'Affecter évaluateur(s)'
+ return HttpResponseRedirect(
+ reverse('affecter_evaluateurs_offre_emploi') +
+ "?ids=%s" % (",".join(selected))
+ )
+
+ affecter_evaluateurs_offre_emploi.short_description = \
+ u'Affecter évaluateur(s)'
### Afficher la liste des candidats pour l'offre d'emploi
- def _candidatsList(self, obj):
+ 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.allow_tags = True
_candidatsList.short_description = "Afficher la liste des candidats"
### Formulaire
form = super(OffreEmploiAdmin, self).get_form(request, obj, **kwargs)
employe = get_emp(request.user)
user_groupes = request.user.groups.all()
-
-
+
# Region
- if form.declared_fields.has_key('region'):
+ if 'region' in form.declared_fields:
region_field = form.declared_fields['region']
else:
region_field = form.base_fields['region']
else:
region_field.queryset = Region.objects.\
filter(id=employe.implantation.region.id)
-
+
# Poste
- if form.declared_fields.has_key('poste'):
+ if 'poste' in form.declared_fields:
poste_field = form.declared_fields['poste']
else:
poste_field = form.base_fields['poste']
poste_field.queryset = rh.Poste.objects.\
filter(implantation__region=employe.implantation.region).\
exclude(implantation__in=IMPLANTATIONS_CENTRALES)
-
+
# Bureau
- if form.declared_fields.has_key('bureau'):
+ if 'bureau' in form.declared_fields:
bureau_field = form.declared_fields['bureau']
else:
bureau_field = form.base_fields['bureau']
grp_haute_direction_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().select_related('offre_emploi')
+ 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_drh2_recrutement in user_groupes or \
if Evaluateur.objects.filter(user=request.user).exists():
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)]
+ 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()
grp_administrateurs_recrutement in user_groupes or \
grp_haute_direction_recrutement in user_groupes:
return True
- return False
+ return False
def has_delete_permission(self, request, obj=None):
user_groupes = request.user.groups.all()
grp_administrateurs_recrutement in user_groupes or \
grp_haute_direction_recrutement in user_groupes:
return True
- return False
+ return False
def has_change_permission(self, request, obj=None):
user_groupes = request.user.groups.all()
grp_administrateurs_recrutement in user_groupes or \
grp_haute_direction_recrutement in user_groupes:
return True
- return False
+ return False
+
class ProxyOffreEmploiAdmin(OffreEmploiAdmin):
- list_display = ('nom', 'date_limite', 'region', 'statut',
- 'est_affiche')
- readonly_fields = ('description', 'bureau', 'duree_affectation',
- 'renumeration', 'debut_affectation', 'lieu_affectation',
- 'nom', 'resume', 'date_limite', 'region', 'poste')
+ list_display = (
+ 'nom', 'date_limite', 'region', 'statut', 'est_affiche'
+ )
+ readonly_fields = (
+ 'description', 'bureau', 'duree_affectation', 'renumeration',
+ 'debut_affectation', 'lieu_affectation', 'nom', 'resume',
+ 'date_limite', 'region', 'poste'
+ )
fieldsets = (
('Nom', {
- 'fields': ('nom', )
+ 'fields': ('nom',)
}),
('Description générale', {
- 'fields': ('description', 'date_limite', )
+ 'fields': ('description', 'date_limite',)
}),
('Coordonnées', {
'fields': ('lieu_affectation', 'bureau', 'region', 'poste',)
}),
('Autre', {
- 'fields': ('debut_affectation', 'duree_affectation',
- 'renumeration', )
+ 'fields': (
+ 'debut_affectation', 'duree_affectation', 'renumeration',
+ )
}),
- )
+ )
inlines = []
-
- ### Lieu de redirection après le change
+ ### Lieu de redirection après le change
def response_change(self, request, obj):
- return HttpResponseRedirect(reverse\
- ('admin:recrutement_proxyoffreemploi_changelist'))
+ return redirect('admin:recrutement_proxyoffreemploi_changelist')
### Formulaire
def get_form(self, request, obj=None, **kwargs):
return False
+
class CandidatPieceInline(admin.TabularInline):
model = CandidatPiece
fields = ('candidat', 'nom', 'path',)
extra = 1
max_num = 3
+
class ReadOnlyCandidatPieceInline(CandidatPieceInline):
readonly_fields = ('candidat', 'nom', 'path', )
cand_delete = False
"""
def __init__(self, *args, **kwargs):
super(CandidatEvaluationInlineFormSet, self).__init__(*args, **kwargs)
- self.can_delete = False
+ self.can_delete = False
+
class CandidatEvaluationInline(admin.TabularInline):
model = CandidatEvaluation
extra = 0
formset = CandidatEvaluationInlineFormSet
- ### Fields readonly
+ ### Fields readonly
def get_readonly_fields(self, request, obj=None):
"""
Empêche la modification des évaluations
"""
if obj:
- return self.readonly_fields+('evaluateur', 'note', 'commentaire')
+ return self.readonly_fields + ('evaluateur', 'note', 'commentaire')
return self.readonly_fields
+
class CandidatAdmin(VersionAdmin):
- search_fields = ('nom', 'prenom' )
+ search_fields = ('nom', 'prenom')
exclude = ('actif', )
list_editable = ('statut', )
list_display = ('_candidat', 'offre_emploi',
'fields': ('offre_emploi', )
}),
('Informations personnelles', {
- 'fields': ('prenom','nom','genre', 'nationalite',
- 'situation_famille', 'nombre_dependant',)
+ 'fields': (
+ 'prenom', 'nom', 'genre', 'nationalite',
+ 'situation_famille', 'nombre_dependant'
+ )
}),
('Coordonnées', {
- 'fields': ('telephone', 'email', 'adresse', 'ville',
- 'etat_province', 'code_postal', 'pays', )
+ 'fields': (
+ 'telephone', 'email', 'adresse', 'ville', 'etat_province',
+ 'code_postal', 'pays'
+ )
}),
('Informations professionnelles', {
- 'fields': ('niveau_diplome','employeur_actuel',
- 'poste_actuel', 'domaine_professionnel',)
- }),
+ 'fields': (
+ 'niveau_diplome', 'employeur_actuel', 'poste_actuel',
+ 'domaine_professionnel'
+ )
+ }),
('Traitement', {
'fields': ('statut', )
}),
actions = ['envoyer_courriel_candidats']
def _candidat(self, obj):
- txt = u"%s %s (%s)" % ( obj.nom.upper(), obj.prenom,
- obj.genre)
+ txt = u"%s %s (%s)" % (obj.nom.upper(), obj.prenom, obj.genre)
txt = textwrap.wrap(txt, 30)
return "<br/>".join(txt)
_candidat.short_description = "Candidat"
return actions
### Envoyer un courriel à des candidats
- def envoyer_courriel_candidats(modeladmin, obj, candidats):
+ def envoyer_courriel_candidats(modeladmin, obj, candidats):
selected = obj.POST.getlist(admin.ACTION_CHECKBOX_NAME)
- return HttpResponseRedirect(reverse('selectionner_template')+
- "?ids=%s" % (",".join(selected)))
+ return HttpResponseRedirect(
+ reverse('selectionner_template') + "?ids=%s" % (",".join(selected))
+ )
envoyer_courriel_candidats.short_description = u'Envoyer courriel'
### É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'),
- obj.id)
- evaluer_candidat.allow_tags = True
+ return "<a href='%s?candidat__id__exact=%s'>" \
+ "Évaluer le candidat</a>" % (
+ reverse('admin:recrutement_candidatevaluation_changelist'),
+ obj.id
+ )
+ evaluer_candidat.allow_tags = True
evaluer_candidat.short_description = 'Évaluation'
### Afficher un candidat
items = [u"<li><a href='%s%s'>%s</li>" % \
(settings.OE_PRIVE_MEDIA_URL, pj.path, pj.get_nom_display()) \
for pj in obj.pieces_jointes()]
- html = "<a href='%s'>Voir le candidat</a>" % \
- (reverse('admin:recrutement_proxycandidat_change', args=(obj.id,)))
+ html = "<a href='%s'>Voir le candidat</a>" % (
+ reverse('admin:recrutement_proxycandidat_change', args=(obj.id,))
+ )
return "%s<ul>%s</ul>" % (html, "\n".join(items))
- afficher_candidat.allow_tags = True
+ afficher_candidat.allow_tags = True
afficher_candidat.short_description = u'Détails du candidat'
### 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',
- args=(obj.offre_emploi.id,)))
+ return "<a href='%s'>Voir l'offre d'emploi</a>" % (reverse(
+ 'admin:recrutement_proxyoffreemploi_change',
+ args=(obj.offre_emploi.id,)
+ ))
voir_offre_emploi.allow_tags = True
voir_offre_emploi.short_description = "Afficher l'offre d'emploi"
notes = [evaluation.note for evaluation in evaluations \
if evaluation.note is not None]
-
+
if len(notes) > 0:
moyenne_votes = round(float(sum(notes)) / len(notes), 2)
else:
totales = len(evaluations)
faites = len(notes)
- if obj.statut == 'REC':
+ if obj.statut == 'REC':
if totales == faites:
color = "green"
elif faites > 0 and float(totales) / float(faites) >= 2:
else:
color = "black"
- return """<span style="color: %s;">%s (%s/%s)</span>""" % (color, moyenne_votes, faites, totales)
+ return """<span style="color: %s;">%s (%s/%s)</span>""" % (
+ color, moyenne_votes, faites, totales
+ )
calculer_moyenne.allow_tags = True
calculer_moyenne.short_description = "Moyenne"
calculer_moyenne.admin_order_field = ""
grp_administrateurs_recrutement in user_groupes or \
grp_haute_direction_recrutement in user_groupes:
return True
- return False
+ return False
def has_delete_permission(self, request, obj=None):
user_groupes = request.user.groups.all()
grp_administrateurs_recrutement in user_groupes or \
grp_haute_direction_recrutement in user_groupes:
return True
- return False
+ return False
def has_change_permission(self, request, obj=None):
user_groupes = request.user.groups.all()
def queryset(self, request):
"""
- Spécifie un queryset limité, autrement Django exécute un
- select_related() sans paramètre, ce qui a pour effet de charger tous
- les objets FK, sans limite de profondeur. Dès qu'on arrive, dans les
- modèles de Region, il existe plusieurs boucles, ce qui conduit à la
+ Spécifie un queryset limité, autrement Django exécute un
+ select_related() sans paramètre, ce qui a pour effet de charger tous
+ les objets FK, sans limite de profondeur. Dès qu'on arrive, dans les
+ modèles de Region, il existe plusieurs boucles, ce qui conduit à la
génération d'une requête infinie.
-
"""
-
- qs = self.model._default_manager.get_query_set().select_related('offre_emploi').annotate(moyenne=Avg('evaluations__note'))
+ qs = self.model._default_manager.get_query_set() \
+ .select_related('offre_emploi') \
+ .annotate(moyenne=Avg('evaluations__note'))
user_groupes = request.user.groups.all()
if grp_drh_recrutement in user_groupes or \
candidat_ids = [e.candidat.id for e in
CandidatEvaluation.objects.filter(evaluateur=evaluateur)]
return qs.filter(id__in=candidat_ids)
- return qs.none()
+ return qs.none()
class ProxyCandidatAdmin(CandidatAdmin):
list_editable = ()
- readonly_fields = ('statut', 'offre_emploi', 'prenom', 'nom',
- 'genre', 'nationalite', 'situation_famille',
- 'nombre_dependant', 'telephone', 'email', 'adresse',
- 'ville', 'etat_province', 'code_postal', 'pays',
- 'niveau_diplome', 'employeur_actuel', 'poste_actuel',
- 'domaine_professionnel', 'pieces_jointes',)
+ readonly_fields = (
+ 'statut', 'offre_emploi', 'prenom', 'nom', 'genre', 'nationalite',
+ 'situation_famille', 'nombre_dependant', 'telephone', 'email',
+ 'adresse', 'ville', 'etat_province', 'code_postal', 'pays',
+ 'niveau_diplome', 'employeur_actuel', 'poste_actuel',
+ 'domaine_professionnel', 'pieces_jointes'
+ )
fieldsets = (
("Offre d'emploi", {
'fields': ('offre_emploi', )
}),
('Informations personnelles', {
- 'fields': ('prenom','nom','genre', 'nationalite',
- 'situation_famille', 'nombre_dependant',)
+ 'fields': (
+ 'prenom', 'nom', 'genre', 'nationalite', 'situation_famille',
+ 'nombre_dependant'
+ )
}),
('Coordonnées', {
- 'fields': ('telephone', 'email', 'adresse', 'ville',
- 'etat_province', 'code_postal', 'pays', )
+ 'fields': (
+ 'telephone', 'email', 'adresse', 'ville', 'etat_province',
+ 'code_postal', 'pays'
+ )
}),
('Informations professionnelles', {
- 'fields': ('niveau_diplome','employeur_actuel',
- 'poste_actuel', 'domaine_professionnel',)
- }),
+ 'fields': (
+ 'niveau_diplome', 'employeur_actuel', 'poste_actuel',
+ 'domaine_professionnel'
+ )
+ }),
)
inlines = (CandidatEvaluationInline, )
def get_actions(self, request):
return None
+
class CandidatPieceAdmin(admin.ModelAdmin):
list_display = ('nom', 'candidat', )
### Queryset
def queryset(self, request):
"""
- Spécifie un queryset limité, autrement Django exécute un
- select_related() sans paramètre, ce qui a pour effet de charger tous
- les objets FK, sans limite de profondeur. Dès qu'on arrive, dans les
- modèles de Region, il existe plusieurs boucles, ce qui conduit à la
- génération d'une requête infinie.
- Affiche la liste de candidats que si le user connecté
- possède un Evaluateur
+ Spécifie un queryset limité, autrement Django exécute un
+ select_related() sans paramètre, ce qui a pour effet de charger tous
+ les objets FK, sans limite de profondeur. Dès qu'on arrive, dans les
+ modèles de Region, il existe plusieurs boucles, ce qui conduit à la
+ génération d'une requête infinie. Affiche la liste de candidats que
+ si le user connecté possède un Evaluateur
"""
qs = self.model._default_manager.get_query_set()
return qs.select_related('candidat')
+
class EvaluateurAdmin(VersionAdmin):
fieldsets = (
("Utilisateur", {
grp_drh2_recrutement in user_groupes or \
grp_haute_direction_recrutement in user_groupes:
return True
- return False
+ return False
def has_delete_permission(self, request, obj=None):
user_groupes = request.user.groups.all()
grp_drh2_recrutement in user_groupes or \
grp_haute_direction_recrutement in user_groupes:
return True
- return False
+ return False
def has_change_permission(self, request, obj=None):
user_groupes = request.user.groups.all()
grp_drh2_recrutement in user_groupes or \
grp_haute_direction_recrutement in user_groupes:
return True
- return False
+ return False
+
class CandidatEvaluationAdmin(admin.ModelAdmin):
- search_fields = ('candidat__nom', 'candidat__prenom' )
- list_display = ('_candidat', '_statut', '_offre_emploi', 'evaluateur', '_note',
- '_commentaire', )
+ search_fields = ('candidat__nom', 'candidat__prenom')
+ list_display = (
+ '_candidat', '_statut', '_offre_emploi', 'evaluateur', '_note',
+ '_commentaire'
+ )
readonly_fields = ('candidat', 'evaluateur')
list_filter = ('candidat__statut', 'candidat__offre_emploi',)
fieldsets = (
('Évaluation du candidat', {
- 'fields': ('candidat', 'evaluateur', 'note', 'commentaire', )
+ 'fields': ('candidat', 'evaluateur', 'note', 'commentaire', )
}),
)
"""
page = self.model.__name__.lower()
redirect_url = 'admin:recrutement_%s_change' % page
-
+
if obj.note is None:
label = "Candidat non évalué"
else:
label = obj.note
if self.evaluateur == obj.evaluateur:
- return "<a href='%s'>%s</a>" % (reverse(redirect_url, args=(obj.id,)), label)
+ return "<a href='%s'>%s</a>" % (
+ reverse(redirect_url, args=(obj.id,)), label
+ )
else:
return label
_note.allow_tags = True
- _note.short_description = "Note"
- _note.admin_order_field = 'note'
+ _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>" \
- % (reverse('admin:recrutement_proxycandidat_change',
+ % (reverse('admin:recrutement_proxycandidat_change',
args=(obj.candidat.id,)), obj.candidat)
- _candidat.allow_tags = True
+ _candidat.allow_tags = True
_candidat.short_description = 'Candidat'
### Afficher commentaire
return "Aucun"
return obj.commentaire
_commentaire.allow_tags = True
- _commentaire.short_description = "Commentaire"
+ _commentaire.short_description = "Commentaire"
### Afficher offre d'emploi
def _offre_emploi(self, obj):
return "<a href='%s'>%s</a>" % \
- (reverse('admin:recrutement_proxyoffreemploi_change',
+ (reverse('admin:recrutement_proxyoffreemploi_change',
args=(obj.candidat.offre_emploi.id,)), obj.candidat.offre_emploi)
_offre_emploi.allow_tags = True
_offre_emploi.short_description = "Voir offre d'emploi"
-
+
def has_add_permission(self, request):
return False
def queryset(self, request):
"""
- Afficher uniquement les évaluations de l'évaluateur, sauf si
+ Afficher uniquement les évaluations de l'évaluateur, sauf si
l'utilisateur est dans les groupes suivants.
"""
- qs = self.model._default_manager.get_query_set().select_related('offre_emploi')
+ 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_haute_direction_recrutement in user_groupes:
return qs
- evaluateur = Evaluateur.objects.get(user=request.user)
+ evaluateur = Evaluateur.objects.get(user=request.user)
candidats_evaluations = \
CandidatEvaluation.objects.filter(evaluateur=evaluateur,
candidat__statut__in=('REC', ))
return False
def queryset(self, request):
- qs = self.model._default_manager.get_query_set().select_related('offre_emploi')
- evaluateur = Evaluateur.objects.get(user=request.user)
+ qs = self.model._default_manager.get_query_set() \
+ .select_related('offre_emploi')
+ evaluateur = Evaluateur.objects.get(user=request.user)
candidats_evaluations = \
CandidatEvaluation.objects.filter(evaluateur=evaluateur,
candidat__statut__in=('REC', ))
automatiquement remplacés par les informations de \
chaque candidat."
+
# Abstracts
class Metadata(models.Model):
- """Méta-données AUF.
+ """
+ Méta-données AUF.
Metadata.actif = flag remplaçant la suppression.
actif == False : objet réputé supprimé.
"""
actif = models.BooleanField(default=True)
date_creation = models.DateField(auto_now_add=True, )
-
+
class Meta:
abstract = True
+
class Candidat(emploi.Candidat):
class Meta:
proxy = True
moyenne_votes = "Non disponible"
return moyenne_votes
+
class OffreEmploi(emploi.OffreEmploi):
class Meta:
proxy = True
class Meta:
proxy = True
+
class OffreEmploiManager(models.Manager):
def get_query_set(self):
fkeys = ('region',)
return super(OffreEmploiManager, self).get_query_set().\
select_related(*fkeys).all()
+
class ProxyOffreEmploi(emploi.OffreEmploi):
class Meta:
proxy = True
def __unicode__(self):
return '%s [%s] - View' % (self.nom, self.id)
+
class ProxyCandidat(emploi.Candidat):
class Meta:
proxy = True
def __unicode__(self):
return '%s %s [%s]' % (self.prenom, self.nom, self.id)
+
class Evaluateur(models.Model):
user = models.ForeignKey(User, unique=True, verbose_name=u"Évaluateur")
def __unicode__(self):
return '%s %s' % (self.user.first_name, self.user.last_name)
+
# Synchro des objets évaluateurs pour mettre les users Django dans le groupe
# évaluateurs, afin d'y mettre des permissions
@receiver(pre_save, sender=Evaluateur)
instance.user.groups.add(grp_evaluateurs_recrutement)
instance.user.save()
+
@receiver(pre_delete, sender=Evaluateur)
def sync_delete_groupe_evaluateur(sender, **kwargs):
instance = kwargs['instance']
class CandidatEvaluation(models.Model):
- candidat = models.ForeignKey(emploi.Candidat, db_column='candidat',
- related_name='evaluations',)
- evaluateur = models.ForeignKey(Evaluateur, db_column='evaluateur',
- related_name='+', verbose_name=u'Évaluateur')
+ candidat = models.ForeignKey(emploi.Candidat, db_column='candidat',
+ related_name='evaluations',)
+ evaluateur = models.ForeignKey(Evaluateur, db_column='evaluateur',
+ related_name='+', verbose_name=u'Évaluateur')
note = models.IntegerField(choices=NOTES, blank=True, null=True)
commentaire = models.TextField(null=True, blank=True, default='Aucun')
- date = models.DateField(auto_now_add=True,)
+ date = models.DateField(auto_now_add=True,)
class Meta:
verbose_name = u'évaluation du candidat'
return u"non disponible"
return u"%s %s" % (self.note, self.commentaire,)
+
class MesCandidatEvaluation(CandidatEvaluation):
class Meta:
('REF', 'Refusé'),
)
-class CourrielTemplate(models.Model):
- nom_modele = models.CharField(max_length=100, verbose_name=u'Nom du modèle',)
- sujet = models.CharField(max_length=100, verbose_name=u'Sujet du courriel')
- plain_text = models.TextField(verbose_name=u'Texte',
- help_text=HELP_TEXT_TAGS_ACCEPTES, )
+class CourrielTemplate(models.Model):
+ nom_modele = models.CharField(u'nom du modèle', max_length=100)
+ sujet = models.CharField(u'sujet du courriel', max_length=100)
+ plain_text = models.TextField(u'texte', help_text=HELP_TEXT_TAGS_ACCEPTES)
def __unicode__(self):
- return u'%s' % self.nom_modele
+ return self.nom_modele
class Meta:
- ordering = ['nom_modele',]
+ ordering = ('nom_modele',)
verbose_name = "Modèle de courriel"
verbose_name_plural = "Modèles de courriel"
+
class CandidatCourriel(models.Model):
- candidats = models.ManyToManyField(Candidat, verbose_name=u"Candidats", )
- template = models.ForeignKey(CourrielTemplate, db_column='template',
- related_name='+', verbose_name=u"Modèle de courriel", )
- sujet = models.CharField(max_length=255, blank=True,
- help_text=HELP_TEXT_TAGS_ACCEPTES, )
- plain_text = models.TextField(verbose_name=u'Texte', blank=True,
- help_text=HELP_TEXT_TAGS_ACCEPTES, )
- html = tinymce_models.HTMLField(verbose_name=u'Texte en HTML', null=True,
- blank=True, help_text=HELP_TEXT_TAGS_ACCEPTES, )
+ candidats = models.ManyToManyField(Candidat, verbose_name=u"Candidats")
+ template = models.ForeignKey(
+ CourrielTemplate, db_column='template', related_name='+',
+ verbose_name=u"Modèle de courriel"
+ )
+ sujet = models.CharField(
+ max_length=255, blank=True, help_text=HELP_TEXT_TAGS_ACCEPTES
+ )
+ plain_text = models.TextField(
+ u'texte', blank=True, help_text=HELP_TEXT_TAGS_ACCEPTES
+ )
+ html = tinymce_models.HTMLField(
+ verbose_name=u'texte en HTML', null=True, blank=True,
+ help_text=HELP_TEXT_TAGS_ACCEPTES
+ )
def __unicode__(self):
- return '%s' % (self.titre)
+ return self.titre
class Meta:
verbose_name = u"modèle de courriel"
# -*- encoding: utf-8 -*-
-from rh.groups import safe_create_groupe
-from rh.groups import CORRESPONDANT_RH, DRH_NIVEAU_1, DRH_NIVEAU_2, \
+from project.rh.groups import safe_create_groupe
+from project.rh.groups import \
+ CORRESPONDANT_RH, DRH_NIVEAU_1, DRH_NIVEAU_2, \
DIRECTEUR_DE_BUREAU, ADMINISTRATEURS, HAUTE_DIRECTION
grp_evaluateurs_recrutement = safe_create_groupe(name='Évaluateurs')
# -*- encoding: utf-8 -*-
-from rh.groups import grp_drh, grp_drh2
+from project.rh.groups import grp_drh, grp_drh2
from project.decorators import redirect_interdiction
else:
return False
+
def drh_or_admin_required(fn):
"""
Teste si un user Django fait parti du groupe DRH, DRH2 ou s'il est admin
if in_drh_or_admin(user):
return fn(request, *args, **kwargs)
- msg = u"Votre compte ne permet pas d'accéder à cette partie de l'application."
+ msg = u"Votre compte ne permet pas d'accéder à " \
+ u"cette partie de l'application."
return redirect_interdiction(request, msg)
return inner
# -*- encoding: utf-8 -*-
-import pygraphviz as pgv
-
from datetime import date
+
+import pygraphviz as pgv
from django.db.models import Q
from django.core.urlresolvers import reverse
from rh import models as rh
+
def bind_poste_to_graph(graph, postes_by_id):
for n in graph.nodes():
dossiers = rh.Dossier.objects.select_related('employe').filter(
Q(poste__id=n)
).exclude(supprime=True).all()
-
if dossiers:
employes = "\\n".join(
- ["[%s] %s %s" %
- (d.employe_id, d.employe.nom.upper(),
+ ["[%s] %s %s" %
+ (d.employe_id, d.employe.nom.upper(),
d.employe.prenom
) for d in dossiers]
)
- label = u"%s\\n%s\\n%s" % (d.poste.nom, employes, d.poste.implantation)
+ label = u"%s\\n%s\\n%s" % (
+ d.poste.nom, employes, d.poste.implantation
+ )
else:
poste = postes_by_id[int(n)]
label = u"%s\\n---\\n%s" % (poste.nom, poste.implantation)
return graph
-def organigramme_postes_cluster(cluster_filter, titre=u"Organigramme", cluster_titre=u"Cluster 1"):
- """ Crée un organigramme des postes avec un cluster défini par le keyword qui sera
- rajouté au queryset en tant que filter.
- cluster_filter doit être un map de format (field: value) qui sera appliqué au queryset.
+
+def organigramme_postes_cluster(cluster_filter, titre=u"Organigramme",
+ cluster_titre=u"Cluster 1"):
+ """
+ Crée un organigramme des postes avec un cluster défini par le keyword
+ qui sera rajouté au queryset en tant que filter.
+
+ cluster_filter doit être un map de format (field: value) qui sera
+ appliqué au queryset.
+
Par exemple: cluster_filter={"service__exact": 19}
"""
if type(titre) != type(unicode()):
postes_by_id = dict((p.id, p) for p in rh.Poste.objects.all())
- postes = rh.Poste.objects.select_related('implantation').filter((Q(date_fin__gt=date.today()) | Q(date_fin=None)) & (Q(date_debut__lt=date.today()) | Q(date_debut=None)) ).filter(**cluster_filter).exclude(supprime=True, responsable=None).all()
+ postes = rh.Poste.objects.select_related('implantation').filter(
+ Q(date_fin__gt=date.today()) | Q(date_fin=None),
+ Q(date_debut__lt=date.today()) | Q(date_debut=None),
+ **cluster_filter
+ ).exclude(supprime=True, responsable=None)
nom = titre.encode('ascii', 'xmlcharrefreplace')
graph = pgv.AGraph(directed=True, name=nom)
#pour mettre l'organigramme de gauche à droite (au lieu du haut à bas)
#graph.rankdir='LR'
- graph_service = graph.subgraph(nbunch=[1,2], \
- name="cluster1", \
- # style='filled', \
- # color='lightgrey', \
- # label=cluster_titre.encode('ascii', 'xmlcharrefreplace'),
- # labeljust="l")
- )
+ graph_service = graph.subgraph(nbunch=[1, 2], name="cluster1")
graph_service.graph_attr['style'] = 'filled'
graph_service.graph_attr['color'] = 'lightgrey'
- graph_service.graph_attr['label'] = cluster_titre.encode('ascii', 'xmlcharrefreplace')
+ graph_service.graph_attr['label'] = \
+ cluster_titre.encode('ascii', 'xmlcharrefreplace')
graph_service.graph_attr['labeljust'] = 'l'
for p in postes:
for p_id in graph_service.nodes():
if postes_by_id[int(p_id)].responsable_id:
poste_remontant = postes_by_id[int(p_id)]
- while poste_remontant.responsable_id and poste_remontant.responsable_id and poste_remontant.responsable_id != poste_remontant.id:
+ while poste_remontant.responsable_id \
+ and poste_remontant.responsable_id \
+ and poste_remontant.responsable_id != poste_remontant.id:
poste_remontant = postes_by_id[poste_remontant.responsable_id]
if poste_remontant.responsable_id:
- graph.add_edge(poste_remontant.responsable_id, poste_remontant.id)
+ graph.add_edge(
+ poste_remontant.responsable_id, poste_remontant.id
+ )
bind_poste_to_graph(graph, postes_by_id)
graph.layout(prog='dot')
svg = graph.draw(format='svg')
-
- return svg
-
+ return svg
import datetime
+from datamaster_modeles.models import Implantation, Region
from django.utils.encoding import smart_unicode
from django.template import Library
from django.utils.http import urlencode
-from datamaster_modeles.models import Implantation, Region
-from rh.models import TypeContrat
+from project.rh.models import TypeContrat
register = Library()
@register.inclusion_tag('admin/filter.html', takes_context=True)
def filter_comble(context):
- return {'title': 'comblé',
- 'choices': prepare_choices(COMBLE_CHOICES, 'comble', context)}
+ return {
+ 'title': 'comblé',
+ 'choices': prepare_choices(COMBLE_CHOICES, 'comble', context)
+ }
@register.inclusion_tag('admin/filter.html', takes_context=True)
def filter_region(context, prefix=None):
-
label = "".join([prefix or "", "implantation__region"])
- return {'title': u"région",
- 'choices': prepare_choices(Region.objects.values_list('id', 'nom'), label, context, remove=['pays', 'nord_sud'])}
+ return {
+ 'title': u"région",
+ 'choices': prepare_choices(
+ Region.objects.values_list('id', 'nom'), label, context,
+ remove=['pays', 'nord_sud']
+ )
+ }
@register.inclusion_tag('admin/filter.html', takes_context=True)
def filter_implantation(context, prefix=None):
-
label = "".join([prefix or "", "implantation"])
- return {'title': u"implantation",
- 'choices': prepare_choices(Implantation.objects.values_list('id', 'nom'), label, context)}
+ return {
+ 'title': u"implantation",
+ 'choices': prepare_choices(
+ Implantation.objects.values_list('id', 'nom'), label, context
+ )
+ }
@register.inclusion_tag('admin/filter.html', takes_context=True)
def filter_region_contrat(context):
- return {'title': u"région",
- 'choices': prepare_choices(Region.objects.values_list('id', 'nom'), 'dossier__poste__implantation__region', context, remove=['pays', 'nord_sud'])}
+ return {
+ 'title': u"région",
+ 'choices': prepare_choices(
+ Region.objects.values_list('id', 'nom'),
+ 'dossier__poste__implantation__region', context,
+ remove=['pays', 'nord_sud']
+ )
+ }
+
@register.inclusion_tag('admin/filter.html', takes_context=True)
def filter_region_dossier(context):
- return {'title': u"région",
- 'choices': prepare_choices(Region.objects.values_list('id', 'nom'), 'poste__implantation__region', context, remove=['pays', 'nord_sud'])}
+ return {
+ 'title': u"région",
+ 'choices': prepare_choices(
+ Region.objects.values_list('id', 'nom'),
+ 'poste__implantation__region', context,
+ remove=['pays', 'nord_sud']
+ )
+ }
+
@register.inclusion_tag('admin/filter.html', takes_context=True)
def filter_implantation_dossier(context):
- return {'title': u"implantation",
- 'choices': prepare_choices(Implantation.objects.values_list('id', 'nom'), 'poste__implantation', context)}
+ return {
+ 'title': u"implantation",
+ 'choices': prepare_choices(
+ Implantation.objects.values_list('id', 'nom'),
+ 'poste__implantation', context
+ )
+ }
@register.inclusion_tag('admin/filter.html', takes_context=True)
def filter_implantation_contrat(context):
- return {'title': u"implantation",
- 'choices': prepare_choices(Implantation.objects.values_list('id', 'nom'), 'dossier__poste__implantation', context)}
+ return {
+ 'title': u"implantation",
+ 'choices': prepare_choices(
+ Implantation.objects.values_list('id', 'nom'),
+ 'dossier__poste__implantation', context
+ )
+ }
@register.inclusion_tag('admin/filter.html', takes_context=True)
def filter_type_contrat(context):
- return {'title': u"type de contrat",
- 'choices': prepare_choices(TypeContrat.objects.values_list('id', 'nom'), 'type_contrat', context)}
+ return {
+ 'title': u"type de contrat",
+ 'choices': prepare_choices(
+ TypeContrat.objects.values_list('id', 'nom'), 'type_contrat',
+ context
+ )
+ }
+
@register.inclusion_tag('admin/filter_select.html', takes_context=True)
def filter_echeance_contrat(context):
today = datetime.date.today()
- three_months = today + datetime.timedelta(days=3*30)
- six_months = today + datetime.timedelta(days=6*30)
- twelve_months = today + datetime.timedelta(days=12*30)
+ three_months = today + datetime.timedelta(days=3 * 30)
+ six_months = today + datetime.timedelta(days=6 * 30)
+ twelve_months = today + datetime.timedelta(days=12 * 30)
field_name = 'date_fin'
return {'title': u"échéance",
'choices': prepare_choices_date(field_name, context, links=(
('Tous', {}),
- ('moins de 3 mois', {'%s__gte' % field_name: today.strftime('%Y-%m-%d'),
- '%s__lte' % field_name: three_months.strftime('%Y-%m-%d')}),
- ('3 à 6 mois', {'%s__gte' % field_name: three_months.strftime('%Y-%m-%d'),
- '%s__lte' % field_name: six_months.strftime('%Y-%m-%d')}),
- ('6 à 12 mois', {'%s__gte' % field_name: six_months.strftime('%Y-%m-%d'),
- '%s__lte' % field_name: twelve_months.strftime('%Y-%m-%d')}),
+ ('moins de 3 mois', {
+ '%s__gte' % field_name: today.strftime('%Y-%m-%d'),
+ '%s__lte' % field_name: three_months.strftime('%Y-%m-%d')
+ }),
+ ('3 à 6 mois', {
+ '%s__gte' % field_name: three_months.strftime('%Y-%m-%d'),
+ '%s__lte' % field_name: six_months.strftime('%Y-%m-%d')
+ }),
+ ('6 à 12 mois', {
+ '%s__gte' % field_name: six_months.strftime('%Y-%m-%d'),
+ '%s__lte' % field_name: twelve_months.strftime('%Y-%m-%d')
+ }),
)
)}
+
@register.inclusion_tag('admin/filter_select.html', takes_context=True)
def filter_debut_contrat(context):
year = datetime.date.today().timetuple()[0]
this_year = datetime.date(year, 1, 1)
next_year = datetime.date(year + 1, 1, 1)
- last_year = datetime.date(year - 1, 12,31)
+ last_year = datetime.date(year - 1, 12, 31)
field_name = 'date_debut'
return {'title': u"date début",
'choices': prepare_choices_date(field_name, context, links=(
('Tous', {}),
- ('années à venir', {'%s__gte' % field_name: next_year.strftime('%Y-%m-%d')}),
- ('cette anneée', {'%s__gte' % field_name: this_year.strftime('%Y-%m-%d'),
- '%s__lt' % field_name: next_year.strftime('%Y-%m-%d')}),
- ('années passées', {'%s__lte' % field_name: last_year.strftime('%Y-%m-%d')}),
+ ('années à venir', {
+ '%s__gte' % field_name: next_year.strftime('%Y-%m-%d')
+ }),
+ ('cette anneée', {
+ '%s__gte' % field_name: this_year.strftime('%Y-%m-%d'),
+ '%s__lt' % field_name: next_year.strftime('%Y-%m-%d')
+ }),
+ ('années passées', {
+ '%s__lte' % field_name: last_year.strftime('%Y-%m-%d')
+ }),
)
)}
+
@register.inclusion_tag('admin/filter_select.html', takes_context=True)
def filter_a_venir(context):
today = datetime.date.today()
year, month, day = datetime.date.today().timetuple()[:3]
- mois_prochain = datetime.date(year+((month+1)/13), (month+1)%12, 1)
- this_month = datetime.date(year, month, 1)
+ mois_prochain = datetime.date(
+ year + (month + 1) / 13, (month + 1) % 12, 1
+ )
+ this_month = datetime.date(year, month, 1)
field_name = 'date_debut'
return {'title': u"à venir",
'choices': prepare_choices_date(field_name, context, links=(
('Tous', {}),
- ('à venir', {'%s__gt' % field_name: today.strftime('%Y-%m-%d')}),
- ('à venir mois prochain', {'%s__gte' % field_name: mois_prochain.strftime('%Y-%m-%d')}),
- ('à venir ce mois', {'%s__gte' % field_name: this_month.strftime('%Y-%m-%d'),
- '%s__lt' % field_name: mois_prochain.strftime('%Y-%m-%d')}),
+ ('à venir', {
+ '%s__gt' % field_name: today.strftime('%Y-%m-%d')
+ }),
+ ('à venir mois prochain', {
+ '%s__gte' % field_name: mois_prochain.strftime('%Y-%m-%d')
+ }),
+ ('à venir ce mois', {
+ '%s__gte' % field_name: this_month.strftime('%Y-%m-%d'),
+ '%s__lt' % field_name: mois_prochain.strftime('%Y-%m-%d')
+ }),
)
)}
-
-
@register.inclusion_tag('admin/filter_select.html', takes_context=True)
def filter_region_remun(context):
- return {'title': u"région",
- 'choices': prepare_choices(Region.objects.values_list('id', 'nom'), 'dossiers__poste__implantation__region', context, remove=['pays', 'nord_sud'])}
+ return {
+ 'title': u"région",
+ 'choices': prepare_choices(
+ Region.objects.values_list('id', 'nom'),
+ 'dossiers__poste__implantation__region', context,
+ remove=['pays', 'nord_sud']
+ )
+ }
@register.inclusion_tag('admin/filter_select.html', takes_context=True)
def filter_implantation_remun(context):
- return {'title': u"implantation",
- 'choices': prepare_choices(Implantation.objects.values_list('id', 'nom'), 'dossiers__poste__implantation', context)}
+ return {
+ 'title': u"implantation",
+ 'choices': prepare_choices(
+ Implantation.objects.values_list('id', 'nom'),
+ 'dossiers__poste__implantation', context
+ )
+ }
+
@register.inclusion_tag('rh/rapports/table_header.html', takes_context=True)
def table_header(context, headers):
return {'headers': headers}
+
def get_query_string(request, new_params=None, remove=None):
- if new_params is None: new_params = {}
- if remove is None: remove = []
+ if new_params is None:
+ new_params = {}
+ if remove is None:
+ remove = []
p = dict(request.GET.items())
for r in remove:
for k in p.keys():
def prepare_choices(choices, query_param, context, remove=[]):
request = context['request']
query_val = request.GET.get(query_param)
- result = [{'selected': query_val is None,
- 'query_string': get_query_string(request, {}, [query_param] + remove),
- 'display': 'Tout'}]
+ result = [{
+ 'selected': query_val is None,
+ 'query_string': get_query_string(request, {}, [query_param] + remove),
+ 'display': 'Tout'
+ }]
for k, v in choices:
- result.append({'selected': smart_unicode(k) == query_val,
- 'query_string': get_query_string(request, {query_param: k}, remove),
- 'display': v})
+ result.append({
+ 'selected': smart_unicode(k) == query_val,
+ 'query_string': get_query_string(
+ request, {query_param: k}, remove
+ ),
+ 'display': v
+ })
return result
request = context['request']
params = request.GET
field_generic = '%s__' % field_name
- date_params = dict([(k, v) for k, v in params.items() if k.startswith(field_generic)])
+ date_params = dict([
+ (k, v) for k, v in params.items() if k.startswith(field_generic)
+ ])
-
-
result = []
for title, param_dict in links:
- result.append({'selected': date_params == param_dict,
- 'query_string': get_query_string(request, param_dict, [field_generic]),
- 'display': title})
+ result.append({
+ 'selected': date_params == param_dict,
+ 'query_string': get_query_string(
+ request, param_dict, [field_generic]
+ ),
+ 'display': title
+ })
return result
+
class SortHeaders:
- def __init__(self, request, headers, order_field_type, order_field, default_order_type="asc", not_sortable=[]):
+ def __init__(self, request, headers, order_field_type, order_field,
+ default_order_type="asc", not_sortable=[]):
self.request = request
self.order_field_type = order_field_type
self.order_field = order_field
if default_order_type not in ('asc', 'desc'):
raise AttributeError(u"L'ordre par défaut n'est pas valide")
self.default_order_type = default_order_type
- self.current_order_field = self.params[self.order_field][0] if self.order_field in self.params else None
- self.current_order_field_type = self.params[self.order_field_type][0] if self.order_field_type in self.params else None
+ self.current_order_field = \
+ self.params[self.order_field][0] \
+ if self.order_field in self.params else None
+ self.current_order_field_type = self.params[self.order_field_type][0] \
+ if self.order_field_type in self.params else None
self.not_sortable = not_sortable
def headers(self):
for h in self.header_defs:
params = self.params
if h[0] == self.current_order_field:
- order_type = {'asc': 'desc', 'desc': 'asc'}[self.current_order_field_type]
+ order_type = {
+ 'asc': 'desc', 'desc': 'asc'
+ }[self.current_order_field_type]
class_order = "%sending" % self.current_order_field_type
else:
order_type = self.default_order_type
class_order = ""
params[self.order_field_type] = [order_type]
params[self.order_field] = [h[0]]
- url = "?%s" % "&".join(['%s=%s' % (param, value[0]) for param, value in params.items()])
+ url = "?%s" % "&".join([
+ '%s=%s' % (param, value[0]) for param, value in params.items()
+ ])
yield {
- "class_attr": "sorted %s" % class_order if self.field_sorted(h[0]) else "",
+ "class_attr": (
+ "sorted %s" % class_order
+ if self.field_sorted(h[0]) else ""
+ ),
"sortable": self.field_sorted(h[0]),
"url": url,
"text": h[1],
def field_sorted(self, field):
return True if field not in self.not_sortable else False
+
@register.filter
def split(str, splitter):
return str.split(splitter)
+
@register.filter
def hash(h, key):
if key in h:
else:
raise Exception("%s does not exist" % key)
+
@register.filter
def is_float(v):
if type(v) == type(float()):
return True
+
@register.filter()
def contains(value, arg):
- return arg in value
+ return arg in value