groups.HAUTE_DIRECTION,
groups.ACCIOR,
groups.ABF,
+ groups.FINANCE,
groups.SERVICE_UTILISATEURS,
)
elif g not in (
groups.ACCIOR,
groups.ABF,
+ groups.FINANCE,
groups.HAUTE_DIRECTION,
groups.DRH_NIVEAU_1,
groups.DRH_NIVEAU_2,
self._test_drh2()
self._test_acces_ok(self.url)
- def _test_grp_accior(self):
+ def test_grp_accior(self):
"""
Un membre de l'ACCIOR ne peut pas ajouter un poste
"""
self._test_grp_accior()
self._test_acces_ko(self.url)
- def _test_grp_abf(self):
+ def test_grp_abf(self):
"""
Un membre de l'ABF ne peut pas ajouter un poste
"""
- self._test_grp_abf(self)
+ self._test_grp_abf()
self._test_acces_ko(self.url)
- def _test_grp_haute_direction(self):
+ def test_grp_finance(self):
+ """
+ Un membre de Finance ne peut pas ajouter un poste
+ """
+ self._test_grp_finance()
+ self._test_acces_ko(self.url)
+
+ def test_grp_haute_direction(self):
"""
Un membre de la haute direction ne peut pas ajouter un poste
"""
self._test_grp_haute_direction()
self._test_acces_ko(self.url)
- def _test_grp_service_utilisateurs(self):
+ def test_grp_service_utilisateurs(self):
"""
Un membre du groupe service utilisateur ne peut pas ajouter un poste
"""
from project.dae.workflow import \
DOSSIER_ETAT_FINALISE, DOSSIER_ETAT_REGION_FINALISATION, \
DOSSIER_ETAT_DRH_FINALISATION, POSTE_ETAT_FINALISE
-from project.decorators import \
- redirect_interdiction, drh_or_admin_required, in_drh_or_admin
+from project.decorators import redirect_interdiction,\
+ drh_or_admin_required,\
+ in_drh_or_admin,\
+ in_one_of_group
from project.rh import models as rh
+from project import groups
# Helpers
@dae_groupe_requis
@poste_dans_ma_region_ou_service
@poste_est_modifiable
+@in_one_of_group((groups.CORRESPONDANT_RH,
+ groups.ADMINISTRATEURS,
+ groups.DIRECTEUR_DE_BUREAU,
+ groups.DRH_NIVEAU_1,
+ groups.DRH_NIVEAU_2))
def poste(request, key=None):
""" Formulaire pour un poste.
groups.DRH_NIVEAU_2,
groups.ACCIOR,
groups.ABF,
+ groups.FINANCE,
groups.HAUTE_DIRECTION,
groups.SERVICE_UTILISATEURS,
)
POSTE_ETAT_DEMANDE_MODIF = 'DEMANDE_MODIF'
POSTE_ETAT_ACCIOR = 'ACCIOR'
POSTE_ETAT_ABF = 'ABF'
+POSTE_ETAT_FINANCE = 'FINANCE'
POSTE_ETAT_HAUTE_DIRECTION = 'HAUTE_DIRECTION'
POSTE_ETAT_DEMANDE_JUSTIF = 'DEMANDE_JUSTIF'
POSTE_ETAT_REGION_FINALISATION = 'REGION_FINALISATION'
POSTE_ACTION_RETOUR_DEMANDE_MODIF = 'RETOUR_DEMANDE_MODIF'
POSTE_ACTION_ENVOYER_ACCIOR = POSTE_ETAT_ACCIOR
POSTE_ACTION_ENVOYER_ABF = POSTE_ETAT_ABF
+POSTE_ACTION_ENVOYER_FINANCE = POSTE_ETAT_FINANCE
POSTE_ACTION_ENVOYER_HAUTE_DIRECTION = POSTE_ETAT_HAUTE_DIRECTION
POSTE_ACTION_DEMANDE_JUSTIF = POSTE_ETAT_DEMANDE_JUSTIF
POSTE_ACTION_RETOUR_DEMANDE_JUSTIF = 'RETOUR_DEMANDE_JUSTIF'
POSTE_ETAT_DEMANDE_MODIF: u"Demande de modification",
POSTE_ETAT_ACCIOR: u"ACCIOR",
POSTE_ETAT_ABF: u"ABF",
+ POSTE_ETAT_FINANCE: u"Finance",
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_DEMANDE_MODIF: u"Envoyer une demande de modification",
POSTE_ETAT_ACCIOR: u"Envoyer à l'ACCIOR",
POSTE_ETAT_ABF: u"Envoyer à l'ABF",
+ POSTE_ETAT_FINANCE: u"Envoyer aux finances",
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",
'etat_initial': (POSTE_ETAT_ACCIOR, POSTE_ETAT_DRH_2),
'etat_final': POSTE_ETAT_ABF,
},
+ POSTE_ACTION_ENVOYER_FINANCE: {
+ 'nom': u'Envoyer',
+ 'etat_initial': (POSTE_ETAT_ABF, ),
+ 'etat_final': POSTE_ETAT_FINANCE,
+ },
POSTE_ACTION_ENVOYER_HAUTE_DIRECTION: {
'nom': u'Envoyer',
- 'etat_initial': (POSTE_ETAT_ABF,),
+ 'etat_initial': (POSTE_ETAT_FINANCE,),
'etat_final': POSTE_ETAT_HAUTE_DIRECTION,
},
POSTE_ACTION_DEMANDE_JUSTIF: {
return groups.ACCIOR in user_groups or groups.DRH_NIVEAU_1 in user_groups \
or groups.DRH_NIVEAU_2 in user_groups
- def acces_haute_direction(self, action, request):
+ def acces_finance(self, action, request):
user_groups = [g.name for g in request.user.groups.all()]
return groups.ABF in user_groups or groups.DRH_NIVEAU_1 in user_groups \
or groups.DRH_NIVEAU_2 in user_groups
+ def acces_haute_direction(self, action, request):
+ user_groups = [g.name for g in request.user.groups.all()]
+ return groups.FINANCE in user_groups or groups.DRH_NIVEAU_1 in user_groups \
+ or groups.DRH_NIVEAU_2 in user_groups
+
def acces_region_finalisation(self, action, request):
user_groups = [g.name for g in request.user.groups.all()]
return groups.HAUTE_DIRECTION in user_groups or groups.DRH_NIVEAU_1 in user_groups \
DOSSIER_ETAT_DEMANDE_MODIF = POSTE_ETAT_DEMANDE_MODIF
DOSSIER_ETAT_ACCIOR = POSTE_ETAT_ACCIOR
DOSSIER_ETAT_ABF = POSTE_ETAT_ABF
+DOSSIER_ETAT_FINANCE = POSTE_ETAT_FINANCE
DOSSIER_ETAT_HAUTE_DIRECTION = POSTE_ETAT_HAUTE_DIRECTION
DOSSIER_ETAT_DEMANDE_JUSTIF = POSTE_ETAT_DEMANDE_JUSTIF
DOSSIER_ETAT_REGION_FINALISATION = POSTE_ETAT_REGION_FINALISATION
groups.DRH_NIVEAU_2: (POSTE_ETAT_DRH_2, DOSSIER_ETAT_DRH_2),
groups.ACCIOR: (POSTE_ETAT_ACCIOR, DOSSIER_ETAT_ACCIOR),
groups.ABF: (POSTE_ETAT_ABF, DOSSIER_ETAT_ABF),
+ groups.FINANCE: (POSTE_ETAT_FINANCE, DOSSIER_ETAT_FINANCE),
groups.HAUTE_DIRECTION: (
POSTE_ETAT_HAUTE_DIRECTION, DOSSIER_ETAT_HAUTE_DIRECTION
),
import auf.django.references.models as ref
CORRESPONDANT_RH = 'Correspondants RH'
-ADMINISTRATEURS ='Administrateurs'
+ADMINISTRATEURS = 'Administrateurs'
DIRECTEUR_DE_BUREAU = 'Directeurs de bureau'
DRH_NIVEAU_1 = 'DRH'
DRH_NIVEAU_2 = 'DRH-2'
ACCIOR = 'ACCIOR'
ABF = 'ABF'
+FINANCE = 'Finance'
HAUTE_DIRECTION = 'Haute direction'
SERVICE_UTILISATEURS = 'Service utilisateurs'
-# Groupes impliqués dans le Worflow
-#grp_correspondants_rh = safe_create_groupe(name=CORRESPONDANT_RH)
-#grp_administrateurs = safe_create_groupe(name=ADMINISTRATEURS)
-#grp_directeurs_bureau = safe_create_groupe(name=DIRECTEUR_DE_BUREAU)
-#grp_drh = safe_create_groupe(name=DRH_NIVEAU_1)
-#grp_drh2 = safe_create_groupe(name=DRH_NIVEAU_2)
-#grp_accior = safe_create_groupe(name=ACCIOR)
-#grp_abf = safe_create_groupe(name=ABF)
-#grp_haute_direction = safe_create_groupe(name=HAUTE_DIRECTION)
-#grp_service_utilisateurs = safe_create_groupe(name=SERVICE_UTILISATEURS)
def get_employe_from_user(user):
- """
- Retourne un employé AUF à partir de son user Django.
- """
- try:
- employe = ref.Authentification.objects.get(courriel=user.email).id
- # ajouter coordonnées via ref.Employe? (courriel, tel, etc.)
- except:
- raise Exception(u"L'employé avec le courriel %s n'a pas été trouvé dans le référentiel." % user.email)
- return employe
+ """
+ Retourne un employé AUF à partir de son user Django.
+ """
+ try:
+ employe = ref.Authentification.objects.get(courriel=user.email).id
+ # ajouter coordonnées via ref.Employe? (courriel, tel, etc.)
+ except:
+ raise Exception(u"L'employé avec le courriel %s n'a pas \
+ été trouvé dans le référentiel." % user.email)
+ return employe
+
def is_user_dans_services_centraux(user):
employe = get_employe_from_user(user)
return False
return employe.implantation_id in (15, 19)
+
def is_user_dans_region(user):
return not is_user_dans_services_centraux(user)
return True
return False
+def user_can_list_obj(user):
+ if user_gere_obj_de_sa_region(user) or \
+ in_drh_or_admin(user):
+ return True
+ return False
+
def user_can_change_obj(user, obj):
if in_drh_or_admin(user) or (
user_gere_obj_de_sa_region(user) and \
from project.decorators import in_drh_or_admin
from project.rh import models as rh
from project.permissions import user_gere_obj_de_sa_region, \
+ user_can_list_obj, \
user_can_add_obj, \
user_can_change_obj, \
user_can_delete_obj, \
return user_can_add_obj(request.user)
def has_change_permission(self, request, obj=None):
- return user_can_change_obj(request.user, obj) if obj else True
+ if obj is None:
+ return user_can_list_obj(request.user)
+ else:
+ return user_can_change_obj(request.user, obj)
def has_delete_permission(self, request, obj=None):
return user_can_delete_obj(request.user, obj) if obj else True
liste = self.get_query_set().all()
############################################
+ # TRAITEMENT FINANCE
+ ############################################
+ if groups.FINANCE in groupes:
+ liste = self.get_query_set().all()
+
+ ############################################
# TRAITEMENT HAUTE DIRECTION
############################################
if groups.HAUTE_DIRECTION in groupes:
self.grp_drh2
self.grp_accior
self.grp_abf
+ self.grp_finance
self.grp_haute_direction
self.grp_service_utilisateurs
self.grp_abf = Group(name=groups.ABF)
self.grp_abf.save()
+ self.grp_finance = Group(name=groups.FINANCE)
+ self.grp_finance.save()
+
self.grp_haute_direction = Group(name=groups.HAUTE_DIRECTION)
self.grp_haute_direction.save()
response = self.client.get(url, follow=True)
is_ko = response.status_code in (403, 404) or \
'next' in response.context or \
+ 'next' in response.context['request'].GET.keys() or \
SAML_REDIRECT_FIELD_NAME in response.context['request'].GET.keys()
+
self.assertEqual(is_ko, True)
def _test_anonyme(self):
credentials = {'username': email, 'password': self.password}
self.assertTrue(self.client.login(**credentials), "login failed")
+ def _test_grp_finance(self):
+ email = "0@test.auf"
+
+ u = User.objects.get(email=email)
+ self.grp_finance.user_set.add(u)
+ self.grp_finance.save()
+
+ credentials = {'username': email, 'password': self.password}
+ self.assertTrue(self.client.login(**credentials), "login failed")
+
def _test_grp_haute_direction(self):
email = "0@test.auf"
"""
Un membre de l'ABF ne peut pas ajouter un dossier
"""
- self._test_grp_abf(self)
+ self._test_grp_abf()
+ self._test_acces_ko(self.url)
+
+ def _test_grp_finance(self):
+ """
+ Un membre de Finance ne peut pas ajouter un dossier
+ """
+ self._test_grp_finance()
self._test_acces_ko(self.url)
def _test_grp_haute_direction(self):
"""
Un membre de l'ABF ne peut pas supprimer un dossier
"""
- self._test_grp_abf(self)
+ self._test_grp_abf()
+ self._test_acces_ko(self.url)
+
+ def _test_grp_finance(self):
+ """
+ Un membre de l'ABF ne peut pas supprimer un dossier
+ """
+ self._test_grp_finance()
self._test_acces_ko(self.url)
def _test_grp_haute_direction(self):
"""
Un membre de l'ABF ne peut pas voir les dossiers
"""
- self._test_grp_abf(self)
+ self._test_grp_abf()
+ self._test_acces_ko(self.url)
+
+ def _test_grp_finance(self):
+ """
+ Un membre de Finance ne peut pas voir les dossiers
+ """
+ self._test_grp_finance()
self._test_acces_ko(self.url)
def _test_grp_haute_direction(self):
self._test_drh2()
self._test_acces_ok(self.url)
- def _test_grp_accior(self):
+ def test_grp_accior(self):
"""
Un membre de l'ACCIOR ne peut pas ajouter un employé
"""
self._test_grp_accior()
self._test_acces_ko(self.url)
- def _test_grp_abf(self):
+ def test_grp_abf(self):
"""
Un membre de l'ABF ne peut pas ajouter un employé
"""
- self._test_grp_abf(self)
+ self._test_grp_abf()
+ self._test_acces_ko(self.url)
+
+ def test_grp_finance(self):
+ """
+ Un membre de Finance ne peut pas ajouter un employé
+ """
+ self._test_grp_finance()
self._test_acces_ko(self.url)
- def _test_grp_haute_direction(self):
+ def test_grp_haute_direction(self):
"""
Un membre de la haute direction ne peut pas ajouter un employé
"""
self._test_grp_haute_direction()
self._test_acces_ko(self.url)
- def _test_grp_service_utilisateurs(self):
+ def test_grp_service_utilisateurs(self):
"""
Un membre du groupe service utilisateur ne peut pas ajouter un employé
"""
self._test_grp_accior()
self._test_acces_ko(self.url)
- def _test_grp_abf(self):
+ def test_grp_abf(self):
"""
- Un membre de l'ABF ne peut pas supprimer un employé
+ Un membre de l'ABF ne peut pas supprimer un employé
"""
- self._test_grp_abf(self)
+ self._test_grp_abf()
self._test_acces_ko(self.url)
- def _test_grp_haute_direction(self):
+ def test_grp_finance(self):
"""
- Un membre de la haute direction ne peut pas supprimer un employé
+ Un membre de Finance ne peut pas supprimer un employé
+ """
+ self._test_grp_abf()
+ self._test_acces_ko(self.url)
+
+ def test_grp_haute_direction(self):
+ """
+ Un membre de la haute direction ne peut pas supprimer un employé
"""
self._test_grp_haute_direction()
self._test_acces_ko(self.url)
- def _test_grp_service_utilisateurs(self):
+ def test_grp_service_utilisateurs(self):
"""
Un membre du groupe service utilisateur
ne peut pas supprimer un employé
self._test_drh2()
self._test_acces_ok(self.url)
- def _test_grp_accior(self):
+ def test_grp_accior(self):
"""
Un membre de l'ACCIOR ne peut pas voir les employés
"""
self._test_grp_accior()
self._test_acces_ko(self.url)
- def _test_grp_abf(self):
+ def test_grp_abf(self):
"""
Un membre de l'ABF ne peut pas voir les employés
"""
- self._test_grp_abf(self)
+ self._test_grp_abf()
+ self._test_acces_ko(self.url)
+
+ def test_grp_finance(self):
+ """
+ Un membre de Finance ne peut pas voir les employés
+ """
+ self._test_grp_finance()
self._test_acces_ko(self.url)
- def _test_grp_haute_direction(self):
+ def test_grp_haute_direction(self):
"""
Un membre de la haute direction ne peut pas voir les employés
"""
dossiers = self.client.get(self.url2).context['dossiers']
self.assertEqual(len(dossiers), 1)
- def _test_grp_accior(self):
+ def test_grp_accior(self):
"""
Un membre de l'ACCIOR ne peut pas voir les aperçus d'employés
"""
self._test_grp_accior()
self._test_acces_ko(self.url)
- def _test_grp_abf(self):
+ def test_grp_abf(self):
"""
Un membre de l'ABF ne peut pas voir les aperçus d'employés
"""
- self._test_grp_abf(self)
+ self._test_grp_abf()
self._test_acces_ko(self.url)
- def _test_grp_haute_direction(self):
+ def test_grp_finance(self):
+ """
+ Un membre de Finance ne peut pas voir les aperçus d'employés
+ """
+ self._test_grp_finance()
+ self._test_acces_ko(self.url)
+
+ def test_grp_haute_direction(self):
"""
Un membre de la haute direction ne peut pas voir
les aperçus d'employés
self._test_grp_haute_direction()
self._test_acces_ko(self.url)
- def _test_grp_service_utilisateurs(self):
+ def test_grp_service_utilisateurs(self):
"""
Un membre du groupe service utilisateur ne pas pas voir
les aperçus d'employés
self._test_grp_accior()
self._test_acces_ko(self.url)
- def _test_grp_abf(self):
+ def test_grp_abf(self):
"""
Un membre de l'ABF ne peut pas ajouter un poste
"""
- self._test_grp_abf(self)
+ self._test_grp_abf()
self._test_acces_ko(self.url)
- def _test_grp_haute_direction(self):
+ def test_grp_finance(self):
+ """
+ Un membre de Finance ne peut pas ajouter un poste
+ """
+ self._test_grp_finance()
+ self._test_acces_ko(self.url)
+
+ def test_grp_haute_direction(self):
"""
Un membre de la haute direction ne peut pas ajouter un poste
"""
self._test_grp_haute_direction()
self._test_acces_ko(self.url)
- def _test_grp_service_utilisateurs(self):
+ def test_grp_service_utilisateurs(self):
"""
Un membre du groupe service utilisateur ne peut pas ajouter un poste
"""
self._test_drh2()
self._test_acces_ok(self.url)
- def _test_grp_accior(self):
+ def test_grp_accior(self):
"""
- Un membre de l'ACCIOR ne peut pas supprimer un poste
+ Un membre de l'ACCIOR ne peut pas supprimer un poste
"""
self._test_grp_accior()
self._test_acces_ko(self.url)
- def _test_grp_abf(self):
+ def test_grp_abf(self):
+ """
+ Un membre de l'ABF ne peut pas supprimer un poste
+ """
+ self._test_grp_abf()
+ self._test_acces_ko(self.url)
+
+ def test_grp_finance(self):
"""
- Un membre de l'ABF ne peut pas supprimer un poste
+ Un membre de Finance ne peut pas supprimer un poste
"""
- self._test_grp_abf(self)
+ self._test_grp_finance()
self._test_acces_ko(self.url)
- def _test_grp_haute_direction(self):
+ def test_grp_haute_direction(self):
"""
Un membre de la haute direction ne peut pas supprimer un poste
"""
self._test_grp_haute_direction()
self._test_acces_ko(self.url)
- def _test_grp_service_utilisateurs(self):
+ def test_grp_service_utilisateurs(self):
"""
Un membre du groupe service utilisateur ne peut pas supprimer un poste
"""
self._test_drh2()
self._test_acces_ok(self.url)
- def _test_grp_accior(self):
+ def test_grp_accior(self):
"""
Un membre de l'ACCIOR ne peut pas voir les postes
"""
self._test_grp_accior()
self._test_acces_ko(self.url)
- def _test_grp_abf(self):
+ def test_grp_abf(self):
"""
Un membre de l'ABF ne peut pas voir les postes
"""
- self._test_grp_abf(self)
+ self._test_grp_abf()
+ self._test_acces_ko(self.url)
+
+ def test_grp_finance(self):
+ """
+ Un membre de Finance ne peut pas voir les postes
+ """
+ self._test_grp_finance()
self._test_acces_ko(self.url)
- def _test_grp_haute_direction(self):
+ def test_grp_haute_direction(self):
"""
Un membre de la haute direction ne peut pas voir les postes
"""
self._test_grp_haute_direction()
self._test_acces_ko(self.url)
- def _test_grp_service_utilisateurs(self):
+ def test_grp_service_utilisateurs(self):
"""
Un membre du groupe service utilisateur ne peut pas voir les postes
"""
contrats = self.client.get(self.url).context['contrats']
self.assertEqual(len(contrats), 2)
- def _test_grp_accior(self):
+ 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):
+ def test_grp_abf(self):
"""
Un membre de l'ABF ne peut pas accéder à ce rapport
"""
- self._test_grp_abf(self)
+ self._test_grp_abf()
self._test_acces_ko(self.url)
- def _test_grp_haute_direction(self):
+ def test_grp_finance(self):
+ """
+ Un membre de Finance ne peut pas accéder à ce rapport
+ """
+ self._test_grp_finance()
+ 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):
+ def test_grp_service_utilisateurs(self):
"""
Un membre du groupe service utilisateur ne peut pas accéder à ce rapport
"""
"""
self._test_drh2()
self._test_acces_ok(self.url)
- # todo TEST rapport
- def _test_grp_accior(self):
+ 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):
+ def test_grp_abf(self):
"""
Un membre de l'ABF ne peut pas accéder à ce rapport
"""
- self._test_grp_abf(self)
+ self._test_grp_abf()
+ self._test_acces_ko(self.url)
+
+ def test_grp_finance(self):
+ """
+ Un membre de Finance ne peut pas accéder à ce rapport
+ """
+ self._test_grp_finance()
self._test_acces_ko(self.url)
- def _test_grp_haute_direction(self):
+ 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):
+ def test_grp_service_utilisateurs(self):
"""
Un membre du groupe service utilisateur ne peut pas accéder à ce rapport
"""
for url in self.urls:
self._test_acces_ok(url)
- def _test_grp_accior(self):
+ def test_grp_accior(self):
"""
Un membre de l'ACCIOR ne peut pas accéder à ce rapport
"""
for url in self.urls:
self._test_acces_ko(url)
- def _test_grp_abf(self):
+ def test_grp_abf(self):
"""
Un membre de l'ABF ne peut pas accéder à ce rapport
"""
- self._test_grp_abf(self)
+ self._test_grp_abf()
+ for url in self.urls:
+ self._test_acces_ko(url)
+
+ def test_grp_finance(self):
+ """
+ Un membre de Finance ne peut pas accéder à ce rapport
+ """
+ self._test_grp_abf()
for url in self.urls:
self._test_acces_ko(url)
- def _test_grp_haute_direction(self):
+ def test_grp_haute_direction(self):
"""
Un membre de la haute direction ne peut pas accéder à ce rapport
"""
for url in self.urls:
self._test_acces_ko(url)
- def _test_grp_service_utilisateurs(self):
+ def test_grp_service_utilisateurs(self):
"""
Un membre du groupe service utilisateur ne peut pas accéder à ce rapport
"""