ajout des filtrages de region/service
authorOlivier Larchevêque <olivier.larcheveque@auf.org>
Tue, 3 May 2011 15:27:58 +0000 (11:27 -0400)
committerOlivier Larchevêque <olivier.larcheveque@auf.org>
Tue, 3 May 2011 15:27:58 +0000 (11:27 -0400)
project/dae/forms.py
project/dae/managers.py [new file with mode: 0644]
project/dae/models.py
project/dae/views.py
project/rh_v1/models.py

index ecddce0..0a36225 100644 (file)
@@ -1,14 +1,64 @@
 # -*- encoding: utf-8 -*-
 
+from django.db.models import Q
 from django import forms
 from django.forms.models import inlineformset_factory
 from django.contrib.admin import widgets as admin_widgets 
 from ajax_select.fields import AutoCompleteSelectField
 from auf.django.workflow.forms import WorkflowFormMixin
 from datamaster_modeles import models as ref
-
 from dae import models as dae
+from utils import get_employe_from_user, is_user_dans_service
 from rh_v1 import models as rh
+from workflow import grp_drh
+
+def _implantation_choices(obj, request):
+    # TRAITEMENT NORMAL
+    employe = get_employe_from_user(request.user)
+    # SERVICE
+    if is_user_dans_service(request.user):
+        q = Q(**{ 'id' : employe.implantation_id })
+    # REGION
+    else:
+        q = Q(**{ 'region' : employe.implantation.region })
+
+    # TRAITEMENT DRH
+    if grp_drh in request.user.groups.all():
+        q = Q()
+    return [('', '----------')] + [(i.id, unicode(i), )for i in ref.Implantation.objects.filter(q)]
+
+def _employe_choices(obj, request):
+    q = Q(id_rh__isnull=True) & Q(id_rh__isnull=True)
+
+    # TRAITEMENT NORMAL
+    employe = get_employe_from_user(request.user)
+    # SERVICE
+    if is_user_dans_service(request.user):
+        q_region_service = Q(implantation1=employe.implantation) | Q(implantation2=employe.implantation)
+    # REGION
+    else:
+        q_region_service = Q(implantation1__region=employe.implantation.region) | Q(implantation2__region=employe.implantation.region) 
+    # TRAITEMENT DRH
+    if grp_drh in request.user.groups.all():
+        q_region_service = Q()
+
+    # Construction de la liste des employés en puisant dans DAE (pas d'info) et dans rh_v1
+    # Pour le filtrage par région/service, on est obligé d'aller regarder le dossier rh_v1
+    # car l'information dans le modèle rh_v1.Employe n'existe pas.
+    dae_ = dae.Employe.objects.filter(id_rh__isnull=True)
+    copies = dae.Employe.objects.filter(Q(id_rh__isnull=False))
+    id_copies = [p.id_rh_id for p in copies.all()]
+    employes_ids = list(set([d.employe_id for d in rh.Dossier.objects.filter(q_region_service)]))
+    rhv1 = rh.Employe.objects.filter(id__in=employes_ids).exclude(id__in=id_copies)
+
+    def option_label(employe):
+        return "%s %s" % (employe.nom.upper(), employe.prenom.title())
+
+    return [('', 'Nouvel employé')] + \
+           sorted([('dae-%s' % p.id, option_label(p)) for p in dae_ | copies] +
+                  [('rh-%s' % p.id, option_label(p)) for p in rhv1],
+                  key=lambda t: t[1])
+
 
 def label_poste_display(poste):
     """Formate un visuel pour un poste dans une liste déroulante"""
@@ -112,7 +162,7 @@ class PosteForm(forms.ModelForm):
     valeur_point_min  = forms.ModelChoiceField(queryset=rh.ValeurPoint.actuelles.all(), required=False)
     valeur_point_max = forms.ModelChoiceField(queryset=rh.ValeurPoint.actuelles.all(), required=False)
 
-    def __init__(self, *args, **kwargs):
+    def __init__(self, request, *args, **kwargs):
         """ Mise à jour dynamique du contenu du menu des postes.
 
         Si on ne met le menu à jour de cette façon, à chaque instantiation du
@@ -125,7 +175,8 @@ class PosteForm(forms.ModelForm):
 
         """
         super(PosteForm, self).__init__(*args, **kwargs)
-        self.fields['poste'].choices = self._poste_choices()
+        self.fields['poste'].choices = self._poste_choices(request)
+        self.fields['implantation'].choices = _implantation_choices(self, request)
 
         # Quand le dae.Poste n'existe pas, on recherche dans les dossiers rhv1
         if self.instance and self.instance.id is None:
@@ -135,17 +186,17 @@ class PosteForm(forms.ModelForm):
                 self.initial['nom'] = "%s %s" % (self.initial['nom'], self.instance.get_complement_nom())
 
 
-    def _poste_choices(self):
+    def _poste_choices(self, request):
         """ Menu déroulant pour les postes.
 
         Constitué des postes de dae et des postes de rh_v1 qui n'ont pas
         d'équivalent dans dae.
 
         """
-        dae_ = dae.Poste.objects.filter(actif=True, id_rh__isnull=True)
-        copies = dae.Poste.objects.exclude(id_rh__isnull=True)
+        dae_ = dae.Poste.objects.ma_region_ou_service(request.user).filter(actif=True, id_rh__isnull=True)
+        copies = dae.Poste.objects.ma_region_ou_service(request.user).exclude(id_rh__isnull=True)
         id_copies = [p.id_rh_id for p in copies.all()]
-        rhv1 = rh.Poste.objects.filter(actif=True).exclude(id__in=id_copies)
+        rhv1 = rh.Poste.objects.ma_region_ou_service(request.user).filter(actif=True).exclude(id__in=id_copies)
         # Optimisation de la requête
         rhv1 = rhv1.select_related(depth=1)
 
@@ -216,25 +267,11 @@ class EmployeForm(forms.ModelForm):
     # La liste des choix est laissée vide. Voir Poste.__init__ pour la raison.
     employe = forms.ChoiceField(choices=(), required=False)
 
-    def __init__(self, *args, **kwargs):
+    def __init__(self, request, *args, **kwargs):
         """ Mise à jour dynamique du contenu du menu des employés. """
         super(EmployeForm, self).__init__(*args, **kwargs)
-        self.fields['employe'].choices = self._employe_choices()
-
-    def _employe_choices(self):
-        """ Menu déroulant pour les employés. """
-        dae_ = dae.Employe.objects.filter(id_rh__isnull=True)
-        copies = dae.Employe.objects.exclude(id_rh__isnull=True)
-        id_copies = [p.id_rh_id for p in copies.all()]
-        rhv1 = rh.Employe.objects.exclude(id__in=id_copies)
+        self.fields['employe'].choices = _employe_choices(self, request)
 
-        def option_label(employe):
-            return "%s %s" % (employe.nom.upper(), employe.prenom.title())
-
-        return [('', 'Nouvel employé')] + \
-               sorted([('dae-%s' % p.id, option_label(p)) for p in dae_ | copies] +
-                      [('rh-%s' % p.id, option_label(p)) for p in rhv1],
-                      key=lambda t: t[1])
 
 
 class DossierForm(forms.ModelForm):
diff --git a/project/dae/managers.py b/project/dae/managers.py
new file mode 100644 (file)
index 0000000..ad7cfc3
--- /dev/null
@@ -0,0 +1,88 @@
+# -*- encoding: utf-8 -*-
+
+from django.db import models
+from django.db.models import Q
+from utils import is_user_dans_service, get_employe_from_user
+from workflow import POSTE_ETAT_HAUTE_DIRECTION, POSTE_ETAT_POLE_FINANCIER
+from workflow import dae_groupes, \
+                     grp_administrateurs, \
+                     grp_gestionnaires, \
+                     grp_directeurs_bureau, \
+                     grp_drh, \
+                     grp_pole_financier, \
+                     grp_haute_direction, \
+                     grp_service_utilisateurs, \
+                     grp_directeurs_service, \
+                     grp_correspondants_rh
+
+class SecurityManager(models.Manager):
+
+    prefixe_implantation = None
+
+    def ma_region_ou_service(self, user):
+        """
+        Filtrage des postes en fonction du user connecté (region / service)
+        On s'intéresse aussi au groupe auquel appartient le user car certains groupes
+        peuvent tout voir.
+        """
+
+        employe = get_employe_from_user(user)
+
+        ############################################
+        # TRAITEMENT NORMAL
+        ############################################        
+
+        # SERVICE
+        if is_user_dans_service(user):
+            q = Q(**{ '%s' % self.prefixe_implantation : employe.implantation })
+        # REGION
+        else:
+            q = Q(**{ '%s__region' % self.prefixe_implantation : employe.implantation.region })
+        liste = self.get_query_set().filter(q)
+
+        ############################################
+        # TRAITEMENT POLE FINANCIER
+        ############################################        
+        if grp_pole_financier in user.groups.all():
+            liste = self.get_query_set().filter(etat=POSTE_ETAT_FINANCE)
+
+        ############################################
+        # TRAITEMENT HAUTE DIRECTION
+        ############################################        
+        if grp_haute_direction in user.groups.all():
+            liste = self.get_query_set().filter(etat=POSTE_ETAT_HAUTE_DIRECTION)
+
+        ############################################
+        # TRAITEMENT DRH
+        ############################################        
+        if grp_drh in user.groups.all():
+            liste = self.get_query_set()
+        
+        return liste
+
+
+class PosteManager(SecurityManager):
+    """
+    Chargement de tous les objets FK existants sur chaque QuerySet.
+    """
+    prefixe_implantation = "implantation"
+
+    def get_query_set(self):
+        fkeys = (
+            'id_rh',
+            'responsable',
+            'implantation',
+            'type_poste',
+            'service',
+            'classement_min',
+            'classement_max',
+            'valeur_point_min',
+            'valeur_point_max',
+        )
+        return super(PosteManager, self).get_query_set() \
+                                        .select_related(*fkeys).all()
+
+
+class DossierManager(SecurityManager):
+    prefixe_implantation = "poste__implantation"
+
index c063de2..7dbb0b2 100644 (file)
@@ -4,24 +4,11 @@ import os
 from django.conf import settings
 from django.core.files.storage import FileSystemStorage
 from django.db import models
-from django.db.models import Q
 import reversion
 from workflow import PosteWorkflow, DossierWorkflow
-from workflow import dae_groupes, \
-                     grp_administrateurs, \
-                     grp_gestionnaires, \
-                     grp_directeurs_bureau, \
-                     grp_drh, \
-                     grp_pole_financier, \
-                     grp_haute_direction, \
-                     grp_service_utilisateurs, \
-                     grp_directeurs_service, \
-                     grp_correspondants_rh
-from workflow import POSTE_ETAT_HAUTE_DIRECTION, POSTE_ETAT_POLE_FINANCIER
-
+from managers import DossierManager, PosteManager
 import datamaster_modeles.models as ref
 from rh_v1 import models as rh
-from utils import is_user_dans_service, get_employe_from_user
 
 STATUT_RESIDENCE_CHOICES = (
     ('local', 'Local'),
@@ -56,74 +43,6 @@ class PostePiece(models.Model):
     fichier = models.FileField(verbose_name="Fichier", upload_to=poste_piece_dispatch, storage=storage_prive)
 
 
-class SecurityManager(models.Manager):
-
-    prefixe_implantation = None
-
-    def ma_region_ou_service(self, user):
-        """
-        Filtrage des postes en fonction du user connecté (region / service)
-        On s'intéresse aussi au groupe auquel appartient le user car certains groupes
-        peuvent tout voir.
-        """
-
-        employe = get_employe_from_user(user)
-
-        ############################################
-        # TRAITEMENT NORMAL
-        ############################################        
-
-        # SERVICE
-        if is_user_dans_service(user):
-            q = Q(**{ '%s' % self.prefixe_implantation : employe.implantation })
-        # REGION
-        else:
-            q = Q(**{ '%s__region' % self.prefixe_implantation : employe.implantation.region })
-        liste = self.get_query_set().filter(q)
-
-        ############################################
-        # TRAITEMENT POLE FINANCIER
-        ############################################        
-        if grp_pole_financier in user.groups.all():
-            liste = self.get_query_set().filter(etat=POSTE_ETAT_FINANCE)
-
-        ############################################
-        # TRAITEMENT HAUTE DIRECTION
-        ############################################        
-        if grp_haute_direction in user.groups.all():
-            liste = self.get_query_set().filter(etat=POSTE_ETAT_HAUTE_DIRECTION)
-
-        ############################################
-        # TRAITEMENT DRH
-        ############################################        
-        if grp_drh in user.groups.all():
-            liste = self.get_query_set()
-        
-        return liste
-
-
-class PosteManager(SecurityManager):
-    """
-    Chargement de tous les objets FK existants sur chaque QuerySet.
-    """
-    prefixe_implantation = "implantation"
-
-    def get_query_set(self):
-        fkeys = (
-            'id_rh',
-            'responsable',
-            'implantation',
-            'type_poste',
-            'service',
-            'classement_min',
-            'classement_max',
-            'valeur_point_min',
-            'valeur_point_max',
-        )
-        return super(PosteManager, self).get_query_set() \
-                                        .select_related(*fkeys).all()
-
-
 class Poste(PosteWorkflow, models.Model):
     # Modèle existant
     id_rh = models.ForeignKey(rh.Poste, null=True, related_name='+',
@@ -420,9 +339,6 @@ class DossierPiece(models.Model):
     fichier = models.FileField(verbose_name="Fichier", upload_to=dossier_piece_dispatch, storage=storage_prive)
 
 
-class DossierManager(SecurityManager):
-    prefixe_implantation = "poste__implantation"
-
 class Dossier(DossierWorkflow, models.Model):
 
     # Modèle existant
index ee0d5db..065cb7e 100644 (file)
@@ -72,7 +72,7 @@ def poste(request, key=None):
 
     if request.POST:
         data.update(dict(request.POST.items()))
-        form = PosteForm(data, instance=poste)
+        form = PosteForm(data, instance=poste, request=request)
         financementForm = FinancementForm(request.POST, instance=poste)
         piecesForm = PostePieceForm(request.POST, request.FILES, instance=poste)
         if 'save' in data and form.is_valid() and piecesForm.is_valid() and financementForm.is_valid():
@@ -89,7 +89,7 @@ def poste(request, key=None):
     else:
         # 'initial' évite la validation prémature lors d'une copie de poste de
         # rh_v1 vers dae.
-        form = PosteForm(initial=data, instance=poste)
+        form = PosteForm(initial=data, instance=poste, request=request)
         piecesForm = PostePieceForm(instance=poste)
         financementForm = FinancementForm(instance=poste)
 
@@ -181,7 +181,7 @@ def embauche(request, key=None, dossier_id=None):
                 else:
                     raise Http404
 
-            employe_form = EmployeForm(request.POST, instance=employe)
+            employe_form = EmployeForm(request.POST, instance=employe, request=request)
 
             if 'save' in request.POST:
                 if employe_form.is_valid():
@@ -255,7 +255,7 @@ def embauche(request, key=None, dossier_id=None):
                 employe_form = EmployeForm(initial=data, instance=employe)
             else:
                 dossier = pre_filled_dossier(dossier_rh, 'new', poste_rh)
-                employe_form = EmployeForm()
+                employe_form = EmployeForm(request=request)
 
             dossier_form = DossierForm(instance=dossier)
             piecesForm = DossierPieceForm(instance=dossier)
@@ -304,7 +304,7 @@ def employe(request, key):
             for field in ('prenom', 'nom', 'genre'):
                 setattr(employe, field, getattr(e, field))
 
-    return HttpResponse(EmployeForm(initial=data, instance=employe).as_table())
+    return HttpResponse(EmployeForm(initial=data, instance=employe, request=request).as_table())
 
 def dossier(request, poste_key, employe_key):
     """ Récupération AJAX du dossier pour la page d'embauche. """
index cafc9cd..51250ad 100644 (file)
@@ -3,6 +3,7 @@
 import datetime
 from django.db import models
 from datamaster_modeles.models import Pays, Implantation
+from dae.managers import SecurityManager
 
 GENRE_CHOICES = (
     ('m', 'Homme'),
@@ -264,10 +265,12 @@ PROPORTION_CHOICES = (
     ('1', '1'),
 )
 
-class PosteManager(models.Manager):
+class PosteManager(SecurityManager):
     """
     Chargement de tous les objets FK existants sur chaque QuerySet.
     """
+    prefixe_implantation = 'implantation'
+
     def get_query_set(self):
         fkeys = (
             'implantation',