PEP8
authorEric Mc Sween <eric.mcsween@auf.org>
Thu, 24 May 2012 18:38:53 +0000 (14:38 -0400)
committerEric Mc Sween <eric.mcsween@auf.org>
Wed, 30 May 2012 16:32:53 +0000 (12:32 -0400)
project/dae/catalogues.py
project/dae/decorators.py
project/dae/managers.py
project/dae/workflow.py
project/lib.py
project/recrutement/admin.py
project/recrutement/models.py
project/recrutement/workflow.py
project/rh/decorators.py
project/rh/graph.py
project/rh/templatetags/rapports.py

index 16cbdcf..743f1bd 100644 (file)
@@ -1,18 +1,22 @@
 # -*- 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) |
@@ -22,11 +26,14 @@ class Responsable(object):
 
     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
@@ -36,21 +43,29 @@ class Responsable(object):
                 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'
 
@@ -60,10 +75,11 @@ class Dossier(object):
             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
@@ -75,28 +91,37 @@ class Dossier(object):
         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
@@ -108,14 +133,21 @@ class Poste(object):
         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)
index 0d8d55f..d98f7fe 100644 (file)
@@ -1,16 +1,13 @@
 # -*- 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):
     """
@@ -21,38 +18,47 @@ 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
@@ -75,27 +81,32 @@ def poste_dans_ma_region_ou_service(fn):
         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
@@ -103,26 +114,32 @@ def dossier_dans_ma_region_ou_service(fn):
             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é
@@ -134,12 +151,13 @@ def employe_dans_ma_region_ou_service(fn):
         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)
@@ -148,12 +166,14 @@ def dossier_est_modifiable(fn):
             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)
@@ -161,13 +181,16 @@ def poste_est_modifiable(fn):
             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
@@ -178,7 +201,8 @@ def get_contrat(fn):
         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
index c639906..ebed47b 100644 (file)
@@ -1,21 +1,17 @@
 # -*- 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):
@@ -31,8 +27,12 @@ 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:
@@ -42,14 +42,18 @@ class TodoManagerMixin(object):
 
         return qs
 
+
 class DossierManager(RHDossierManager, TodoManagerMixin):
     pass
 
+
 class PosteManager(RHPosteManager, TodoManagerMixin):
     pass
 
+
 class PosteComparaisonManager(RHPosteComparaisonManager, TodoManagerMixin):
     pass
 
+
 class DossierComparaisonManager(RHDossierComparaisonManager, TodoManagerMixin):
     pass
index b22924e..ed166a6 100644 (file)
@@ -1,9 +1,13 @@
 # -*- 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'
@@ -41,120 +45,123 @@ POSTE_ACTION_FINALISER = 'FINALISER'
 
 #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&#39;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&#39;ACCIOR",
-    POSTE_ETAT_ABF : u"Envoyer à l&#39;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&#39;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&#39;ACCIOR",
+    POSTE_ETAT_ABF: u"Envoyer à l&#39;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
     },
 }
 
@@ -170,13 +177,13 @@ class PosteWorkflow(WorkflowMixin):
     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()
@@ -199,8 +206,8 @@ class PosteWorkflow(WorkflowMixin):
         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()
@@ -208,16 +215,18 @@ class PosteWorkflow(WorkflowMixin):
 
     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()
@@ -228,13 +237,13 @@ class PosteWorkflow(WorkflowMixin):
 
     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()
@@ -261,6 +270,7 @@ DOSSIER_ETAT_REGION_FINALISATION = POSTE_ETAT_REGION_FINALISATION
 DOSSIER_ETAT_DRH_FINALISATION = POSTE_ETAT_DRH_FINALISATION
 DOSSIER_ETAT_FINALISE = POSTE_ETAT_FINALISE
 
+
 class DossierWorkflow(PosteWorkflow):
 
     class Meta:
@@ -268,39 +278,48 @@ class DossierWorkflow(PosteWorkflow):
 
 
 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
+)
index a1a5481..10ca2cd 100644 (file)
@@ -1,12 +1,14 @@
 # -*- 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
@@ -16,13 +18,13 @@ def get_employe_from_user(user):
         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)
@@ -30,7 +32,8 @@ def get_employe_from_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
@@ -40,9 +43,8 @@ def safe_create_groupe(name=None, id=None):
     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
-
index 8551126..55a3985 100644 (file)
@@ -7,24 +7,30 @@ from django.contrib import admin
 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
@@ -34,10 +40,13 @@ class OrderedChangeList(admin.views.main.ChangeList):
         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', ]
@@ -50,18 +59,22 @@ class OffreEmploiAdmin(VersionAdmin):
         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
@@ -69,10 +82,9 @@ class OffreEmploiAdmin(VersionAdmin):
         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']
@@ -84,9 +96,9 @@ class OffreEmploiAdmin(VersionAdmin):
         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']
@@ -99,9 +111,9 @@ class OffreEmploiAdmin(VersionAdmin):
             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']
@@ -111,14 +123,16 @@ class OffreEmploiAdmin(VersionAdmin):
             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 \
@@ -133,8 +147,12 @@ class OffreEmploiAdmin(VersionAdmin):
 
         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()
@@ -149,7 +167,7 @@ class OffreEmploiAdmin(VersionAdmin):
             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()
@@ -160,7 +178,7 @@ class OffreEmploiAdmin(VersionAdmin):
             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()
@@ -171,36 +189,39 @@ class OffreEmploiAdmin(VersionAdmin):
             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):
@@ -230,12 +251,14 @@ class ProxyOffreEmploiAdmin(OffreEmploiAdmin):
 
         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
@@ -247,7 +270,8 @@ class CandidatEvaluationInlineFormSet(BaseInlineFormSet):
     """
     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
@@ -256,17 +280,18 @@ class CandidatEvaluationInline(admin.TabularInline):
     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',
@@ -279,17 +304,23 @@ class CandidatAdmin(VersionAdmin):
             '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', )
         }),
@@ -301,8 +332,7 @@ class CandidatAdmin(VersionAdmin):
     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"
@@ -321,19 +351,22 @@ class CandidatAdmin(VersionAdmin):
         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
@@ -341,17 +374,19 @@ class CandidatAdmin(VersionAdmin):
         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"
 
@@ -361,7 +396,7 @@ class CandidatAdmin(VersionAdmin):
 
         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:
@@ -370,7 +405,7 @@ class CandidatAdmin(VersionAdmin):
         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:
@@ -380,7 +415,9 @@ class CandidatAdmin(VersionAdmin):
         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 = ""
@@ -396,7 +433,7 @@ class CandidatAdmin(VersionAdmin):
             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()
@@ -408,7 +445,7 @@ class CandidatAdmin(VersionAdmin):
             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()
@@ -427,15 +464,15 @@ class CandidatAdmin(VersionAdmin):
 
     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 \
@@ -454,33 +491,40 @@ class CandidatAdmin(VersionAdmin):
             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, )
 
@@ -512,23 +556,24 @@ class ProxyCandidatAdmin(CandidatAdmin):
     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", {
@@ -550,7 +595,7 @@ class EvaluateurAdmin(VersionAdmin):
                 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()
@@ -559,7 +604,7 @@ class EvaluateurAdmin(VersionAdmin):
                 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()
@@ -568,17 +613,20 @@ class EvaluateurAdmin(VersionAdmin):
                 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', )
         }),
     )
 
@@ -602,32 +650,33 @@ class CandidatEvaluationAdmin(admin.ModelAdmin):
         """
         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
@@ -641,16 +690,16 @@ class CandidatEvaluationAdmin(admin.ModelAdmin):
             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
 
@@ -680,10 +729,11 @@ class CandidatEvaluationAdmin(admin.ModelAdmin):
 
     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 \
@@ -694,7 +744,7 @@ class CandidatEvaluationAdmin(admin.ModelAdmin):
             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', ))
@@ -720,8 +770,9 @@ class MesCandidatEvaluationAdmin(CandidatEvaluationAdmin):
             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', ))
index 0b84870..25020ad 100644 (file)
@@ -29,18 +29,21 @@ HELP_TEXT_TAGS_ACCEPTES = "Pour le texte, les variables disponibles sont : \
                             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
@@ -56,6 +59,7 @@ class Candidat(emploi.Candidat):
             moyenne_votes = "Non disponible"
         return moyenne_votes
 
+
 class OffreEmploi(emploi.OffreEmploi):
     class Meta:
         proxy = True
@@ -65,12 +69,14 @@ class CandidatPiece(emploi.CandidatPiece):
     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
@@ -80,6 +86,7 @@ class ProxyOffreEmploi(emploi.OffreEmploi):
     def __unicode__(self):
         return '%s [%s] - View' % (self.nom, self.id)
 
+
 class ProxyCandidat(emploi.Candidat):
     class Meta:
         proxy = True
@@ -89,6 +96,7 @@ class ProxyCandidat(emploi.Candidat):
     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")
 
@@ -98,6 +106,7 @@ class Evaluateur(models.Model):
     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)
@@ -107,6 +116,7 @@ def sync_add_groupe_evaluateur(sender, **kwargs):
         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']
@@ -115,13 +125,13 @@ def sync_delete_groupe_evaluateur(sender, **kwargs):
 
 
 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'
@@ -135,6 +145,7 @@ class CandidatEvaluation(models.Model):
             return u"non disponible"
         return u"%s %s" % (self.note, self.commentaire,)
 
+
 class MesCandidatEvaluation(CandidatEvaluation):
 
     class Meta:
@@ -149,34 +160,40 @@ TEMPLATE_CHOICES = (
     ('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"
index f0ae148..2d729a4 100644 (file)
@@ -1,7 +1,8 @@
 # -*- 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')
index b872e15..6dcf2b4 100644 (file)
@@ -1,6 +1,6 @@
 # -*- 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
 
 
@@ -16,6 +16,7 @@ def in_drh_or_admin(user):
     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
@@ -25,7 +26,8 @@ def drh_or_admin_required(fn):
         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
index c4e267f..263b4e6 100644 (file)
@@ -1,13 +1,14 @@
 # -*- 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(
@@ -16,15 +17,16 @@ def bind_poste_to_graph(graph, postes_by_id):
                 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)
@@ -36,10 +38,16 @@ def bind_poste_to_graph(graph, postes_by_id):
 
     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()):
@@ -49,22 +57,21 @@ def organigramme_postes_cluster(cluster_filter, titre=u"Organigramme", cluster_t
 
     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:
@@ -75,17 +82,19 @@ def organigramme_postes_cluster(cluster_filter, titre=u"Organigramme", cluster_t
     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
index a7e1f70..bb33965 100644 (file)
@@ -2,12 +2,12 @@
 
 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()
@@ -18,130 +18,204 @@ COMBLE_CHOICES = (('c', 'Comblé'), ('n', 'Vacant'))
 
 @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():
@@ -159,13 +233,19 @@ def get_query_string(request, new_params=None, remove=None):
 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
 
 
@@ -173,19 +253,25 @@ def prepare_choices_date(field_name, context, links, remove=[]):
     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
@@ -194,24 +280,34 @@ class SortHeaders:
         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],
@@ -221,10 +317,12 @@ class SortHeaders:
     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:
@@ -232,11 +330,13 @@ def hash(h, key):
     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