conflit réglé merge master et regionalisation
[auf_rh_dae.git] / project / rh / views.py
index fed110b..5ad33ba 100644 (file)
@@ -18,11 +18,11 @@ from django.shortcuts import render, get_object_or_404
 
 from auf.django.references import models as ref
 
+from project import groups
+from project.decorators import drh_or_admin_required, in_one_of_group
 from project.decorators import redirect_interdiction
-from project.decorators import drh_or_admin_required
 from project.decorators import region_protected
 from project.groups import get_employe_from_user
-from project.groups import grp_drh, grp_correspondants_rh
 
 from project.rh import models as rh
 from project.rh import graph as rh_graph
@@ -33,6 +33,7 @@ from project.rh.templatetags.rapports import SortHeaders
 
 
 @login_required
+@drh_or_admin_required
 def profil(request):
     """Profil personnel de l'employé - éditable"""
     employe = get_employe_from_user(user)
@@ -44,6 +45,7 @@ def profil(request):
 
 
 @login_required
+@drh_or_admin_required
 def employes_liste(request):
     """Liste des employés."""
     today = date.today()
@@ -59,6 +61,7 @@ def employes_liste(request):
 
 
 @login_required
+@drh_or_admin_required
 def employe(request, id):
     """Information publique sur un employé."""
     try:
@@ -73,7 +76,11 @@ def employe(request, id):
 
 
 @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']
@@ -95,6 +102,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:
@@ -130,15 +144,20 @@ def rapports_contrat(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_masse_salariale(request):
 
     class RechercheTemporelle(forms.Form):
-        CHOICE_ANNEES = range(
-            rh.Remuneration.objects.exclude(date_debut=None)
-            .order_by('date_debut')[0].date_debut.year,
-            date.today().year + 1
-        )
+        remunerations = rh.Remuneration.objects.exclude(date_debut=None)
+        if len(remunerations) > 0:
+            annee_debut = remunerations.order_by('date_debut')[0].date_debut.year
+        else:
+            annee_debut = 1982
+        CHOICE_ANNEES = range(annee_debut, date.today().year + 1)
 
         annee = forms.CharField(
             initial=date.today().year,
@@ -147,15 +166,26 @@ def rapports_masse_salariale(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 = ref.Region.objects.filter(id=employe.implantation.region.id)
+            implantations = ref.Implantation.objects.filter(region=employe.implantation.region)
+        else:
+            regions = ref.Region.objects.all()
+            implantations = ref.Implantation.objects.all()
+
         region = forms.CharField(
                 widget=forms.Select(choices=[('', '')] +
-                    [(i.id, i) for i in ref.Region.objects.all()]
+                    [(i.id, i) for i in regions]
                 )
             )
 
         implantation = forms.CharField(
                 widget=forms.Select(choices=[('', '')] +
-                    [(i.id, i) for i in ref.Implantation.objects.all()]
+                    [(i.id, i) for i in implantations]
                 )
             )
 
@@ -184,6 +214,15 @@ def rapports_masse_salariale(request):
     if region:
         custom_filter['dossier__poste__implantation__region'] = region
 
+    # on force la région dans tous les cas pour les membres de ce groupe
+    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)
+        custom_filter['dossier__poste__implantation__region'] = employe.implantation.region.id
+
+
     c = {
             'title': 'Rapport de masse salariale',
             'form': form,
@@ -239,10 +278,23 @@ def rapports_masse_salariale(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_employes_sans_contrat(request):
     lookup_params = get_lookup_params(request)
 
+    # régionalisation
+    user_groups = request.user.groups.all()
+    q_region = Q()
+    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_region = Q(poste__implantation__region=employe.implantation.region)
+
     # contrats échus
     contrats_echus = rh.Contrat.objects.filter(
             date_fin__lt=date.today()
@@ -251,8 +303,8 @@ def rapports_employes_sans_contrat(request):
         )
 
     # dossiers en cours sans contrat
-    dossiers_sans_contrat = rh.Dossier.objects.filter(
-            Q(date_fin=None) | Q(date_fin__gt=date.today()),
+    dossiers_sans_contrat = rh.Dossier.objects.filter(q_region & (
+            Q(date_fin=None) | Q(date_fin__gt=date.today())),
         ).exclude(
             date_debut__gt=date.today()
         ).filter(
@@ -393,21 +445,21 @@ def poste_apercu(request, poste_id):
     }
     return render(request, 'admin/rh/poste/apercu.html', c)
 
-
+@region_protected(rh.Employe)
 def employe_apercu(request, employe_id):
     employe = get_object_or_404(rh.Employe, pk=employe_id)
     user_groups = request.user.groups.all()
     dossiers = None
 
-    if request.user.is_superuser or \
-       grp_drh in user_groups:
+    if in_drh_or_admin(request.user):
         q = Q(employe=employe)
-    if grp_correspondants_rh in user_groups:
-        regions = [
-            d.poste.implantation.region for d in employe.rh_dossiers.all()
-        ]
-        q = Q(employe=employe) & Q(implantation__region__in=regions)
 
+    if groups.grp_correspondants_rh in user_groups or\
+       groups.grp_administrateurs in user_groups or\
+       groups.grp_directeurs_bureau in user_groups:
+        employe_connecte = get_employe_from_user(request.user)
+        q = Q(employe=employe) & Q(poste__implantation__region=employe_connecte.implantation.region)
+    
     dossiers = rh.Dossier.objects.filter(q).order_by('-date_debut')
 
     c = {
@@ -421,7 +473,11 @@ def employe_apercu(request, employe_id):
 
 
 @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 organigrammes_employe(request, id, level="all"):
 
     poste = get_object_or_404(rh.Poste, pk=id)
@@ -503,7 +559,11 @@ def organigrammes_employe(request, id, level="all"):
 
 
 @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 organigrammes_service(request, id):
 
     service = get_object_or_404(rh.Service, pk=id)
@@ -522,7 +582,11 @@ def organigrammes_service(request, id):
 
 
 @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 organigrammes_implantation(request, id):
 
     implantation = get_object_or_404(ref.Implantation, pk=id)
@@ -541,7 +605,11 @@ def organigrammes_implantation(request, id):
 
 
 @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 organigrammes_region(request, id):
 
     region = get_object_or_404(ref.Region, pk=id)