rapport contrats
authorOlivier Larchevêque <olivier.larcheveque@auf.org>
Fri, 1 Jun 2012 16:43:47 +0000 (12:43 -0400)
committerOlivier Larchevêque <olivier.larcheveque@auf.org>
Fri, 1 Jun 2012 16:43:47 +0000 (12:43 -0400)
project/menu.py
project/rh/decorators.py
project/rh/templatetags/rapports.py
project/rh/test/common.py
project/rh/test/rapport.py [new file with mode: 0644]
project/rh/tests.py
project/rh/views.py

index be01a27..5926f0c 100644 (file)
@@ -13,6 +13,7 @@ from django.utils.translation import ugettext_lazy as _
 
 from admin_tools.menu import items, Menu
 from project.rh.decorators import in_drh_or_admin
+from project.rh import groups
 
 class CustomMenu(Menu):
     """
@@ -38,7 +39,11 @@ class CustomMenu(Menu):
         Use this method if you need to access the request context.
         """
         request = context['request']
-        if in_drh_or_admin(request.user):
+        user_groups = request.user.groups.all()
+        if in_drh_or_admin(request.user) or\
+           groups.grp_correspondants_rh in user_groups or\
+           groups.grp_administrateurs in user_groups or\
+           groups.grp_directeurs_bureau in user_groups:
             self.children += [
                 items.MenuItem('Rapports',
                                children=[
index b872e15..35278f6 100644 (file)
@@ -4,6 +4,21 @@ from rh.groups import grp_drh, grp_drh2
 from project.decorators import redirect_interdiction
 
 
+def in_one_of_group(groups):
+    """
+    Test si le user appartient au moins 1 des ces groupes
+    """
+    def wrapper(fn):
+        def wrapped(request, *args, **kwargs):
+            user_groups = request.user.groups.all()
+            for g in user_groups:
+                if g in groups:
+                    return fn(request, *args, **kwargs)
+            msg = u"Votre compte ne permet pas d'accéder à cette partie de l'application."
+            return redirect_interdiction(request, msg)
+        return wrapped
+    return wrapper
+
 def in_drh_or_admin(user):
     """
     Teste si un user Django fait parti du groupe DRH, DRH2 ou s'il est admin
index a7e1f70..45fd812 100644 (file)
@@ -8,7 +8,9 @@ from django.utils.http import urlencode
 
 from datamaster_modeles.models import Implantation, Region
 from rh.models import TypeContrat
-
+from project.rh import groups
+# pas de reference a DAE devrait etre refactorisé
+from dae.utils import get_employe_from_user
 
 register = Library()
 
@@ -24,7 +26,6 @@ def filter_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'])}
@@ -32,7 +33,6 @@ def filter_region(context, prefix=None):
 
 @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)}
@@ -40,8 +40,17 @@ def filter_implantation(context, prefix=None):
 
 @register.inclusion_tag('admin/filter.html', takes_context=True)
 def filter_region_contrat(context):
+    request = context['request']
+    user_groups = request.user.groups.all()
+    if groups.grp_correspondants_rh in user_groups or\
+         groups.grp_administrateurs in user_groups or\
+         groups.grp_directeurs_bureau in user_groups:
+        employe = get_employe_from_user(request.user)
+        regions = Region.objects.filter(id=employe.implantation.region.id)
+    else:
+       regions = Region.objects.all()
     return {'title': u"région",
-            'choices': prepare_choices(Region.objects.values_list('id', 'nom'), 'dossier__poste__implantation__region', context, remove=['pays', 'nord_sud'])}
+            'choices': prepare_choices(regions.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):
@@ -56,8 +65,17 @@ def filter_implantation_dossier(context):
 
 @register.inclusion_tag('admin/filter.html', takes_context=True)
 def filter_implantation_contrat(context):
+    request = context['request']
+    user_groups = request.user.groups.all()
+    if groups.grp_correspondants_rh in user_groups or\
+         groups.grp_administrateurs in user_groups or\
+         groups.grp_directeurs_bureau in user_groups:
+        employe = get_employe_from_user(request.user)
+        implantations = Implantation.objects.filter(region=employe.implantation.region)
+    else:
+       implantations = Implantation.objects.all()
     return {'title': u"implantation",
-            'choices': prepare_choices(Implantation.objects.values_list('id', 'nom'), 'dossier__poste__implantation', context)}
+            'choices': prepare_choices(implantations.values_list('id', 'nom'), 'dossier__poste__implantation', context)}
 
 
 @register.inclusion_tag('admin/filter.html', takes_context=True)
index e3215d5..a9aa4d5 100644 (file)
@@ -40,7 +40,7 @@ class RhTest(TestCase):
 
         """
         self.password = "0000"
-        today = datetime.datetime.now()
+        self.today = datetime.datetime.now()
         #########################
         # Régions / Implantations
         #########################
@@ -94,9 +94,9 @@ class RhTest(TestCase):
         self.poste_cnf_bangui.save()
 
         self.dossier_cnf_ngaoundere = rh.Dossier(poste=self.poste_cnf_ngaoundere,
-            employe=self.employe_cnf_ngaoundere, date_debut=today)
+            employe=self.employe_cnf_ngaoundere, date_debut=self.today)
         self.dossier_cnf_bangui = rh.Dossier(poste=self.poste_cnf_bangui,
-            employe=self.employe_cnf_bangui, date_debut=today)
+            employe=self.employe_cnf_bangui, date_debut=self.today)
 
         self.dossier_cnf_ngaoundere.save()
         self.dossier_cnf_bangui.save()
@@ -113,9 +113,9 @@ class RhTest(TestCase):
         self.poste_bap_ifi.save()
 
         self.dossier_bap_bureau = rh.Dossier(poste=self.poste_bap_bureau,
-            employe=self.employe_bap_bureau, date_debut=today)
+            employe=self.employe_bap_bureau, date_debut=self.today)
         self.dossier_bap_ifi = rh.Dossier(poste=self.poste_bap_ifi,
-            employe=self.employe_bap_ifi, date_debut=today)
+            employe=self.employe_bap_ifi, date_debut=self.today)
 
         self.dossier_bap_bureau.save()
         self.dossier_bap_ifi.save()
diff --git a/project/rh/test/rapport.py b/project/rh/test/rapport.py
new file mode 100644 (file)
index 0000000..5cfc339
--- /dev/null
@@ -0,0 +1,111 @@
+# -*- coding: utf-8 -*-
+
+from django.core.urlresolvers import reverse
+from project.rh.test.common import RhTest
+from project.rh import models as rh
+
+class RapportContratTest(RhTest):
+    """
+    Test l'accès au rapport des contrats
+    """
+    url = reverse('rhr_contrats')
+
+    def setUp(self):
+        super(RapportContratTest, self).setUp()
+
+        cdi = rh.TypeContrat(nom="CDI")
+        cdi.save()
+
+        contrat = rh.Contrat(
+                type_contrat=cdi,
+                date_debut=self.today,
+                dossier=self.dossier_cnf_ngaoundere,)
+        contrat.save()
+
+        contrat = rh.Contrat(
+                type_contrat=cdi,
+                date_debut=self.today,
+                dossier=self.dossier_bap_ifi)
+        contrat.save()
+
+        
+
+    def test_anonyme(self):
+        """
+        Un anonyme ne peut pas accéder à ce rapport
+        """
+        self._test_anonyme()
+        self._test_acces_ko(self.url)
+
+    def test_correspondant_rh(self):
+        """
+        Un correspondant RH peut accéder à ce rapport
+        """
+        self._test_correspondant_rh()
+        self._test_acces_ok(self.url)
+        contrats = self.client.get(self.url).context['contrats']
+        self.assertEqual(len(contrats), 1)
+
+    def test_administrateur_regional(self):
+        """
+        Un administrateur peut accéder à ce rapport
+        """
+        self._test_administrateur_regional()
+        self._test_acces_ok(self.url)
+        contrats = self.client.get(self.url).context['contrats']
+        self.assertEqual(len(contrats), 1)
+
+    def test_directeur_bureau(self):
+        """
+        Un directeur de bureau peut accéder à ce rapport
+        """
+        self._test_directeur_bureau()
+        self._test_acces_ok(self.url)
+        contrats = self.client.get(self.url).context['contrats']
+        self.assertEqual(len(contrats), 1)
+
+    def test_drh(self):
+        """
+        Un DRH peut accéder à ce rapport
+        """
+        self._test_drh()
+        self._test_acces_ok(self.url)
+        contrats = self.client.get(self.url).context['contrats']
+        self.assertEqual(len(contrats), 2)
+
+    def test_drh2(self):
+        """
+        Un DRH (2ieme niveau) peut accéder à ce rapport
+        """
+        self._test_drh2()
+        self._test_acces_ok(self.url)
+        contrats = self.client.get(self.url).context['contrats']
+        self.assertEqual(len(contrats), 2)
+
+    def _test_grp_accior(self):
+        """
+        Un membre de l'ACCIOR ne peut pas accéder à ce rapport
+        """
+        self._test_grp_accior()
+        self._test_acces_ko(self.url)
+
+    def _test_grp_abf(self):
+        """
+        Un membre de l'ABF ne peut pas accéder à ce rapport
+        """
+        self._test_grp_abf(self)
+        self._test_acces_ko(self.url)
+
+    def _test_grp_haute_direction(self):
+        """
+        Un membre de la haute direction ne peut pas accéder à ce rapport
+        """
+        self._test_grp_haute_direction()
+        self._test_acces_ko(self.url)
+
+    def _test_grp_service_utilisateurs(self):
+        """
+        Un membre du groupe service utilisateur ne peut pas accéder à ce rapport
+        """
+        self._test_grp_service_utilisateurs()
+        self._test_acces_ko(self.url)
index 1f993a6..6adc9d9 100644 (file)
@@ -2,3 +2,4 @@
 from project.rh.test.employe import *
 from project.rh.test.dossier import *
 from project.rh.test.poste import *
+from project.rh.test.rapport import *
index 8a5aa5a..915511f 100644 (file)
@@ -19,7 +19,7 @@ from django.core.servers.basehttp import FileWrapper
 
 from rh import models as rh
 from rh.lib import calc_remun
-from rh.decorators import drh_or_admin_required
+from project.rh.decorators import drh_or_admin_required, in_one_of_group
 from rh.templatetags.rapports import SortHeaders
 from rh.change_list import RechercheTemporelle
 from rh import graph as rh_graph
@@ -28,7 +28,6 @@ from rh.masse_salariale import MasseSalariale
 # pas de reference a DAE devrait etre refactorisé
 from dae.utils import get_employe_from_user
 from dae.decorators import redirect_interdiction
-from dae.workflow import grp_drh, grp_correspondants_rh
 from django.conf import settings
 from project.rh.decorators import in_drh_or_admin
 from project.rh import groups
@@ -175,7 +174,11 @@ def rapports_poste(request):
 
 
 @login_required
-@drh_or_admin_required
+@in_one_of_group((groups.grp_correspondants_rh,
+    groups.grp_administrateurs,
+    groups.grp_directeurs_bureau,
+    groups.grp_drh,
+    groups.grp_drh2))
 def rapports_contrat(request):
     if 'HTTP_REFERER' in request.META.keys():
                 referer = request.META['HTTP_REFERER']
@@ -208,6 +211,13 @@ def rapports_contrat(request):
     lookup_params = cl.purge_params(lookup_params)
     q_temporel = cl.get_q_temporel(contrats)
     q = Q(**lookup_params) & q_temporel
+    user_groups = request.user.groups.all()
+    if groups.grp_correspondants_rh in user_groups or\
+       groups.grp_administrateurs in user_groups or\
+       groups.grp_directeurs_bureau in user_groups:
+        employe = get_employe_from_user(request.user)
+        q = q & Q(dossier__poste__implantation__region=employe.implantation.region)
+
     contrats = contrats.filter(q).exclude(dossier__employe__supprime=1)
 
     if 'o' in request.GET: