[#2190] S'assurer que les gens ne voient pas des comparaisons salariales qu'ils ne...
authorEric Mc Sween <eric.mcsween@auf.org>
Tue, 8 Nov 2011 21:57:54 +0000 (16:57 -0500)
committerEric Mc Sween <eric.mcsween@auf.org>
Tue, 8 Nov 2011 21:58:34 +0000 (16:58 -0500)
project/dae/forms.py
project/dae/managers.py
project/dae/models.py
project/dae/templates/dae/embauche.html
project/dae/templates/dae/embauche_consulter.html
project/dae/templates/dae/poste.html
project/dae/views.py

index 8b29cab..92adb60 100644 (file)
@@ -2,7 +2,7 @@
 
 from django.db.models import Q, Max
 from django import forms
-from django.forms.models import inlineformset_factory
+from django.forms.models import inlineformset_factory, modelformset_factory
 from django.contrib.admin import widgets as admin_widgets
 from ajax_select.fields import AutoCompleteSelectField
 from auf.django.workflow.forms import WorkflowFormMixin
@@ -83,22 +83,24 @@ class DossierComparaisonForm(forms.ModelForm):
     recherche = AutoCompleteSelectField('dossiers', required=False)
     poste = forms.CharField(max_length=255, widget=forms.TextInput(attrs={'size':'60'}))
 
-    class Model:
+    class Meta:
         model = dae.DossierComparaison
+        exclude = ('dossier',)
 
-DossierComparaisonForm = inlineformset_factory(
-    dae.Dossier, dae.DossierComparaison, extra=3, max_num=3, form=DossierComparaisonForm
+DossierComparaisonFormSet = modelformset_factory(
+    dae.DossierComparaison, extra=3, max_num=3, form=DossierComparaisonForm
 )
 
 class PosteComparaisonForm(forms.ModelForm):
     
     recherche = AutoCompleteSelectField('postes', required=False)
 
-    class Model:
+    class Meta:
         model = dae.PosteComparaison
+        exclude = ('poste',)
 
-PosteComparaisonForm = inlineformset_factory(
-    dae.Poste, dae.PosteComparaison, extra=3, max_num=3, form=PosteComparaisonForm
+PosteComparaisonFormSet = modelformset_factory(
+    dae.PosteComparaison, extra=3, max_num=3, form=PosteComparaisonForm
 )
 
 class FlexibleRemunForm(forms.ModelForm):
index 5a5c833..7d8bf60 100644 (file)
@@ -53,14 +53,6 @@ class SecurityManager(models.Manager):
         On s'intéresse aussi au groupe auquel appartient le user car certains groupes
         peuvent tout voir.
         """
-        # On s'assure que le manager travaille sur un modèle avec WF, autrement
-        # on ne teste pas sur l'état
-        try:
-            self.model._meta.get_field_by_name('etat')
-            workflowed_model = True
-        except:
-            workflowed_model = False
-
         employe = get_employe_from_user(user)
 
         ############################################
@@ -70,8 +62,7 @@ class SecurityManager(models.Manager):
         q = Q(**{ self.prefixe_implantation : employe.implantation.region })
 
         # SERVICE
-        if self.prefixe_service and workflowed_model and \
-           grp_service_utilisateurs in user.groups.all():
+        if self.prefixe_service and grp_service_utilisateurs in user.groups.all():
             q = q | Q(**{ self.prefixe_service : employe.service})
 
         liste = self.get_query_set().filter(q)
@@ -79,19 +70,19 @@ class SecurityManager(models.Manager):
         ############################################
         # TRAITEMENT ACCIOR
         ############################################
-        if workflowed_model and grp_accior in user.groups.all():
+        if grp_accior in user.groups.all():
             liste = self.get_query_set().all()
 
         ############################################
         # TRAITEMENT ABF
         ############################################
-        if workflowed_model and grp_abf in user.groups.all():
+        if grp_abf in user.groups.all():
             liste = self.get_query_set().all()
 
         ############################################
         # TRAITEMENT HAUTE DIRECTION
         ############################################
-        if workflowed_model and grp_haute_direction in user.groups.all():
+        if grp_haute_direction in user.groups.all():
             liste = self.get_query_set().all()
 
         ############################################
@@ -148,3 +139,7 @@ class DossierManager(SecurityManager):
 class PosteComparaisonManager(SecurityManager):
     use_for_related_fields = True
     prefixe_implantation = "implantation__region"
+
+class DossierComparaisonManager(SecurityManager):
+    use_for_related_fields = True
+    prefixe_implantation = "implantation__region"
index 93d0198..de8b6f3 100644 (file)
@@ -8,7 +8,8 @@ import reversion
 from workflow import PosteWorkflow, DossierWorkflow
 from workflow import DOSSIER_ETAT_DRH_FINALISATION, DOSSIER_ETAT_REGION_FINALISATION, \
                      DOSSIER_ETAT_FINALISE
-from managers import DossierManager, PosteManager, PosteComparaisonManager
+from managers import DossierManager, PosteManager, PosteComparaisonManager, \
+                     DossierComparaisonManager
 import datamaster_modeles.models as ref
 from rh_v1 import models as rh
 
@@ -715,6 +716,8 @@ class DossierComparaison(models.Model):
     montant = models.IntegerField(null=True)
     devise = models.ForeignKey(rh.Devise, default=5, related_name='+', null=True, blank=True)
 
+    objects = DossierComparaisonManager()
+
     def taux_devise(self):
         if self.devise.code == 'EUR':
           return 1
index 8457678..472a6bb 100644 (file)
     <fieldset>
     <h2>Comparaison salariale</h2>
     <span class="info">dans la région pour les employés occupant un poste similaire</span>
-    {% for f in dossiersComparaisonsForm.management_form %}
-        {{ f }}
-    {% endfor %}
+    {{ comparaisons_formset.management_form }}
 
-    {% for f in dossiersComparaisonsForm.forms %}
+    {% for f in comparaisons_formset.forms %}
         <table>
         {% for field in f %}
             {% if field.is_hidden %}{{ field }}{% endif %}
index 6202fa3..5b4ac45 100644 (file)
@@ -62,7 +62,7 @@
           <th>Salaire</th>
           <th>Salaire EUR</th>
       </tr>
-      {% for dc in dossier.comparaisons.all %}
+      {% for dc in comparaisons %}
       <tr>
           <td>{{ dc.classement|default:"" }}</td>
           <td>{{ dc.statut|default:"" }}</td>
index 74639c2..8176846 100644 (file)
@@ -297,11 +297,9 @@ Demande d'autorisation d'embauche
 
     <fieldset>
     <h2>Éléments de comparaison (interne)</h2>
-    {% for f in postesComparaisonsForm.management_form %}
-        {{ f }}
-    {% endfor %}
-    
-    {% for f in postesComparaisonsForm.forms %}
+    {{ comparaisons_formset.management_form }}
+
+    {% for f in comparaisons_formset.forms %}
         <table>
         {% for field in f %}
             {% if field.is_hidden %}{{ field }}{% endif %}
index c61edad..5c53bb9 100644 (file)
@@ -148,15 +148,24 @@ def poste(request, key=None):
         form = PosteForm(data, instance=poste, request=request)
         financementForm = FinancementForm(request.POST, instance=poste)
         piecesForm = PostePieceForm(request.POST, request.FILES, instance=poste)
-        postesComparaisonsForm = PosteComparaisonForm(request.POST, instance=poste)
-        if form.is_valid() and piecesForm.is_valid() and financementForm.is_valid() and postesComparaisonsForm.is_valid():
+        comparaisons_formset = PosteComparaisonFormSet(
+            request.POST,
+            queryset=poste.comparaisons_internes.ma_region_ou_service(request.user)
+        )
+        if form.is_valid() and piecesForm.is_valid() and financementForm.is_valid() and \
+           comparaisons_formset.is_valid():
             poste = form.save()
             piecesForm.instance = poste
             piecesForm.save()
             financementForm.instance = poste
             financementForm.save()
-            postesComparaisonsForm.instance = poste
-            postesComparaisonsForm.save()
+
+            # Ne remplacer que les comparaisons de ma région
+            comparaisons = comparaisons_formset.save(commit=False)
+            for comparaison in comparaisons:
+                comparaison.poste = poste
+                comparaison.save()
+
             messages.add_message(request, messages.SUCCESS, "Le poste %s a été sauvegardé." % poste)
             if request.POST.has_key('save'):
                 return redirect('poste_consulter', key='dae-%s' % poste.id)
@@ -172,9 +181,15 @@ def poste(request, key=None):
         form = PosteForm(initial=data, instance=poste, request=request)
         piecesForm = PostePieceForm(instance=poste)
         financementForm = FinancementForm(instance=poste)
-        postesComparaisonsForm = PosteComparaisonForm(instance=poste)
+        comparaisons_formset = PosteComparaisonFormSet(
+            queryset=poste.comparaisons_internes.ma_region_ou_service(request.user)
+        )
 
-    vars.update(dict(form=form, poste=poste, poste_key=key, piecesForm=piecesForm, financementForm=financementForm, postesComparaisonsForm=postesComparaisonsForm))
+    vars.update(dict(
+        form=form, poste=poste, poste_key=key, piecesForm=piecesForm,
+        financementForm=financementForm,
+        comparaisons_formset=comparaisons_formset
+    ))
 
     return render_to_response('dae/poste.html', vars, RequestContext(request))
 
@@ -222,11 +237,13 @@ def embauche_consulter(request, dossier_id):
         validationForm = DossierWorkflowForm(instance=dossier, request=request)
 
     comparaisons_internes = dossier.poste.comparaisons_internes.ma_region_ou_service(request.user)
+    comparaisons = dossier.comparaisons.ma_region_ou_service(request.user)
     vars = {
         'dossier': dossier,
         'validationForm': validationForm,
-        'comparaisons_internes': comparaisons_internes
-        }
+        'comparaisons_internes': comparaisons_internes,
+        'comparaisons': comparaisons
+    }
 
     mode = request.GET.get('mode', None)
     if mode is None:
@@ -286,17 +303,26 @@ def embauche(request, key=None, dossier_id=None):
 
         dossier_form = DossierForm(request.POST, instance=dossier)
         piecesForm = DossierPieceForm(request.POST, request.FILES, instance=dossier)
-        dossiersComparaisonsForm = DossierComparaisonForm(request.POST, instance=dossier)
+        comparaisons_formset = DossierComparaisonFormSet(
+            request.POST,
+            queryset=dossier.comparaisons.ma_region_ou_service(request.user)
+        )
         remunForm = RemunForm(request.POST, instance=dossier)
 
         if dossier_form.is_valid() and \
            piecesForm.is_valid() and \
-           dossiersComparaisonsForm.is_valid() and \
+           comparaisons_formset.is_valid() and \
            remunForm.is_valid():
             employe.save()
             piecesForm.save()
-            dossiersComparaisonsForm.save()
             remunForm.save()
+
+            # Ne remplacer que les comparaisons de ma région
+            comparaisons = comparaisons_formset.save(commit=False)
+            for comparaison in comparaisons:
+                comparaison.dossier = dossier
+                comparaison.save()
+
             messages.success(request, "Le dossier %s a été sauvegardé." % dossier)
             if request.POST.has_key('save'):
                 return redirect('embauche_consulter', dossier_id=dossier.id)
@@ -321,7 +347,9 @@ def embauche(request, key=None, dossier_id=None):
 
         dossier_form = DossierForm(instance=dossier)
         piecesForm = DossierPieceForm(instance=dossier)
-        dossiersComparaisonsForm = DossierComparaisonForm(instance=dossier)
+        comparaisons_formset = DossierComparaisonFormSet(
+            queryset=dossier.comparaisons.ma_region_ou_service(request.user)
+        )
         remunForm = RemunForm(instance=dossier)
 
     comparaisons_internes = dossier.poste.comparaisons_internes.ma_region_ou_service(request.user)
@@ -332,7 +360,7 @@ def embauche(request, key=None, dossier_id=None):
         'dossier': dossier,
         'piecesForm': piecesForm,
         'remunForm': remunForm,
-        'dossiersComparaisonsForm': dossiersComparaisonsForm,
+        'comparaisons_formset': comparaisons_formset,
         'forms': dict(employe=employe_form, dossier=dossier_form, ),
         'comparaisons_internes': comparaisons_internes
     }, RequestContext(request))