#1562, #1552, #1549, #1535
[auf_rh_dae.git] / project / dae / workflow.py
index 055b8a7..e88965b 100644 (file)
@@ -2,6 +2,7 @@
 
 from django.contrib.auth.models import Group
 from auf.django.workflow.models import WorkflowMixin
+from utils import is_user_dans_services_centraux
 
 def safe_create_groupe(name):
     """
@@ -16,37 +17,40 @@ def safe_create_groupe(name):
     return grp
 
 # Groupes impliqués dans le Worflow
+grp_correspondants_rh = safe_create_groupe(name='Correspondants RH')
 grp_administrateurs = safe_create_groupe(name='Administrateurs')
-grp_gestionnaires = safe_create_groupe(name='Gestionnaires')
 grp_directeurs_bureau = safe_create_groupe(name='Directeurs de bureau')
 grp_drh = safe_create_groupe(name='DRH')
-grp_pole_financier = safe_create_groupe(name='Pôle financier')
+grp_accior = safe_create_groupe(name='ACCIOR')
+grp_afb = safe_create_groupe(name='AFB')
 grp_haute_direction = safe_create_groupe(name='Haute direction')
 grp_service_utilisateurs = safe_create_groupe(name='Service utilisateurs')
-grp_directeurs_service = safe_create_groupe(name='Directeurs de service / pôle')
-grp_correspondants_rh = safe_create_groupe(name='Correspondants RH')
 
-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, )
+dae_groupes = (grp_administrateurs, grp_directeurs_bureau, grp_drh,
+               grp_accior, grp_afb, grp_haute_direction, grp_service_utilisateurs,
+               grp_correspondants_rh, )
 
 # codes états
 POSTE_ETAT_REFUSE = 'REFUSE'
 POSTE_ETAT_BROUILLON = 'BROUILLON'
-POSTE_ETAT_DIRECTEUR_BUREAU_OU_SERVICE = 'DIRECTEUR_BUR_SRV'
 POSTE_ETAT_ADMINISTRATEUR = 'ADMINISTRATEUR'
+POSTE_ETAT_DIRECTEUR_BUREAU = 'DIRECTEUR_BUREAU'
+POSTE_ETAT_SERVICE_UTILISATEURS = 'SRV_UTILISATEURS'
 POSTE_ETAT_DRH_CONTROLE = 'DRH_CONTROLE'
-POSTE_ETAT_POLE_FINANCIER = 'FINANCE'
+POSTE_ETAT_ACCIOR = 'ACCIOR'
+POSTE_ETAT_AFB = 'AFB'
 POSTE_ETAT_HAUTE_DIRECTION = 'HAUTE_DIRECTION'
 POSTE_ETAT_DRH_FINALISATION = 'DRH_FINALISATION'
 
 #codes actions
 POSTE_ACTION_ENVOYER_REFUSE = POSTE_ETAT_REFUSE
 POSTE_ACTION_ENVOYER_BROUILLON = POSTE_ETAT_BROUILLON
-POSTE_ACTION_ENVOYER_DIRECTEUR_BUREAU_OU_SERVICE = POSTE_ETAT_DIRECTEUR_BUREAU_OU_SERVICE
 POSTE_ACTION_ENVOYER_ADMINISTRATEUR = POSTE_ETAT_ADMINISTRATEUR
+POSTE_ACTION_ENVOYER_DIRECTEUR_BUREAU = POSTE_ETAT_DIRECTEUR_BUREAU
+POSTE_ACTION_ENVOYER_SRV_UTILISATEURS = POSTE_ETAT_SERVICE_UTILISATEURS
 POSTE_ACTION_ENVOYER_DRH_CONTROLE = POSTE_ETAT_DRH_CONTROLE
-POSTE_ACTION_ENVOYER_POLE_FINANCIER = POSTE_ETAT_POLE_FINANCIER
+POSTE_ACTION_ENVOYER_ACCIOR = POSTE_ETAT_ACCIOR
+POSTE_ACTION_ENVOYER_AFB = POSTE_ETAT_AFB
 POSTE_ACTION_ENVOYER_HAUTE_DIRECTION = POSTE_ETAT_HAUTE_DIRECTION
 POSTE_ACTION_ENVOYER_DRH_FINALISATION = POSTE_ETAT_DRH_FINALISATION
 
@@ -54,10 +58,12 @@ POSTE_ACTION_ENVOYER_DRH_FINALISATION = POSTE_ETAT_DRH_FINALISATION
 POSTE_ETATS = {
     POSTE_ETAT_REFUSE : u"Refusé",
     POSTE_ETAT_BROUILLON : u"En rédaction",
-    POSTE_ETAT_DIRECTEUR_BUREAU_OU_SERVICE : u"Directeur de bureau, pôle ou service",
     POSTE_ETAT_ADMINISTRATEUR : u"Validation de l'adminstrateur",
+    POSTE_ETAT_DIRECTEUR_BUREAU : u"Directeur de bureau",
+    POSTE_ETAT_SERVICE_UTILISATEURS : u"Service utilisateurs",
     POSTE_ETAT_DRH_CONTROLE : u"Validation DRH",
-    POSTE_ETAT_POLE_FINANCIER : u"Pôle finances",
+    POSTE_ETAT_ACCIOR : u"ACCIOR",
+    POSTE_ETAT_AFB : u"AFB",
     POSTE_ETAT_HAUTE_DIRECTION : u"Validation : Secrétaire général / Recteur",
     POSTE_ETAT_DRH_FINALISATION : u'Retour à la DRH et région',
     }
@@ -65,10 +71,12 @@ POSTE_ETATS = {
 #libellés états pour boutons
 POSTE_ETATS_BOUTONS = {
     POSTE_ETAT_REFUSE : u"Refuser",
-    POSTE_ETAT_DIRECTEUR_BUREAU_OU_SERVICE : u"Envoyer au directeur de bureau, pôle ou service",
+    POSTE_ETAT_DIRECTEUR_BUREAU : u"Envoyer au directeur de bureau",
+    POSTE_ETAT_SERVICE_UTILISATEURS : u"Envoyer au service utilisateurs",
     POSTE_ETAT_ADMINISTRATEUR : u"Envoyer à l'adminstrateur",
     POSTE_ETAT_DRH_CONTROLE : u"Envoyer à la DRH (validation)",
-    POSTE_ETAT_POLE_FINANCIER : u"Envoyer au pôle finances",
+    POSTE_ETAT_ACCIOR : u"Envoyer à l'ACCIOR",
+    POSTE_ETAT_AFB : u"Envoyer à l'AFB",
     POSTE_ETAT_HAUTE_DIRECTION : u"Envoyer à la haute direction",
     POSTE_ETAT_DRH_FINALISATION : u'Envoyer à la DRH (traitement)',
     }
@@ -77,7 +85,7 @@ POSTE_ETATS_BOUTONS = {
 POSTE_ACTIONS = {
     POSTE_ACTION_ENVOYER_REFUSE : {
         'nom' : u'Refuser',
-        'etat_initial' : (POSTE_ETAT_DIRECTEUR_BUREAU_OU_SERVICE, POSTE_ETAT_ADMINISTRATEUR, POSTE_ETAT_DRH_CONTROLE, POSTE_ETAT_POLE_FINANCIER, POSTE_ETAT_HAUTE_DIRECTION),
+        'etat_initial' : (POSTE_ETAT_DIRECTEUR_BUREAU, POSTE_ETAT_ADMINISTRATEUR, POSTE_ETAT_SERVICE_UTILISATEURS, POSTE_ETAT_DRH_CONTROLE, POSTE_ETAT_HAUTE_DIRECTION),
         'etat_final' : POSTE_ETAT_REFUSE,
     },
     POSTE_ACTION_ENVOYER_BROUILLON : {
@@ -85,47 +93,58 @@ POSTE_ACTIONS = {
         'etat_initial' : None,
         'etat_final' : POSTE_ETAT_BROUILLON,
     },
-    POSTE_ACTION_ENVOYER_DIRECTEUR_BUREAU_OU_SERVICE : {
-        'nom' : u'Envoyer',
-        'etat_initial' : POSTE_ETAT_BROUILLON,
-        'etat_final' : POSTE_ETAT_DIRECTEUR_BUREAU_OU_SERVICE,
-    },
     POSTE_ACTION_ENVOYER_ADMINISTRATEUR : {
         'nom' : u'Envoyer',
-        'etat_initial' : (POSTE_ETAT_REFUSE, POSTE_ETAT_DIRECTEUR_BUREAU_OU_SERVICE),
+        'etat_initial' : (POSTE_ETAT_BROUILLON, POSTE_ETAT_REFUSE, ), 
         'etat_final' : POSTE_ETAT_ADMINISTRATEUR,
     },
+    POSTE_ACTION_ENVOYER_SRV_UTILISATEURS : {
+        'nom' : u'Envoyer',
+        'etat_initial' : (POSTE_ETAT_ADMINISTRATEUR, POSTE_ETAT_REFUSE, ), 
+        'etat_final' : POSTE_ETAT_SERVICE_UTILISATEURS,
+    },
+    POSTE_ACTION_ENVOYER_DIRECTEUR_BUREAU : {
+        'nom' : u'Envoyer',
+        'etat_initial' : (POSTE_ETAT_ADMINISTRATEUR, POSTE_ETAT_REFUSE,),
+        'etat_final' : POSTE_ETAT_DIRECTEUR_BUREAU,
+    },
     POSTE_ACTION_ENVOYER_DRH_CONTROLE : {
         'nom' : u'Envoyer',
-        'etat_initial' : (POSTE_ETAT_REFUSE, POSTE_ETAT_DIRECTEUR_BUREAU_OU_SERVICE, POSTE_ETAT_ADMINISTRATEUR, ),
+        'etat_initial' : (POSTE_ETAT_DIRECTEUR_BUREAU, POSTE_ETAT_SERVICE_UTILISATEURS, POSTE_ETAT_REFUSE, ),
         'etat_final' : POSTE_ETAT_DRH_CONTROLE,
     },
-    POSTE_ACTION_ENVOYER_POLE_FINANCIER : {
+    POSTE_ACTION_ENVOYER_ACCIOR : {
         'nom' : u'Envoyer',
-        'etat_initial' : (POSTE_ETAT_REFUSE, POSTE_ETAT_DRH_CONTROLE, ),
-        'etat_final' : POSTE_ETAT_POLE_FINANCIER,
+        'etat_initial' : (POSTE_ETAT_DRH_CONTROLE, POSTE_ETAT_REFUSE, ),
+        'etat_final' : POSTE_ETAT_ACCIOR,
+    },
+    POSTE_ACTION_ENVOYER_AFB : {
+        'nom' : u'Envoyer',
+        'etat_initial' : (POSTE_ETAT_ACCIOR, POSTE_ETAT_REFUSE, ),
+        'etat_final' : POSTE_ETAT_AFB,
     },
     POSTE_ACTION_ENVOYER_HAUTE_DIRECTION : {
         'nom' : u'Envoyer',
-        'etat_initial' : (POSTE_ETAT_REFUSE, POSTE_ETAT_POLE_FINANCIER, ),
+        'etat_initial' : (POSTE_ETAT_AFB, POSTE_ETAT_REFUSE, ),
         'etat_final' : POSTE_ETAT_HAUTE_DIRECTION,
     },
     POSTE_ACTION_ENVOYER_DRH_FINALISATION : {
         'nom' : u'Envoyer',
-        'etat_initial' : (POSTE_ETAT_REFUSE, POSTE_ETAT_HAUTE_DIRECTION, ),
+        'etat_initial' : (POSTE_ETAT_HAUTE_DIRECTION, POSTE_ETAT_REFUSE, ),
         'etat_final' : POSTE_ETAT_DRH_FINALISATION,
     },
 }
 
 
-def refuse_sauf_pour_drh(f):
+def acces_etat_refuse(f):
     """
-    Personne ne peut manipuler quelque chose à l'état refusé excepté la DRH
+    Personne ne peut manipuler quelque chose à l'état refusé excepté la DRH et les administrateurs
     """
     def inner(obj, action, request):
         if obj.etat != 'REFUSE':
             return f(obj, action, request)
-        if grp_drh in request.user.groups.all():
+        user_groupes = request.user.groups.all()
+        if grp_drh in user_groupes or grp_administrateurs in user_groupes:
             return f(obj, action, request)
         else:
             return False
@@ -140,7 +159,8 @@ class PosteWorkflow(WorkflowMixin):
         abstract = True
 
     def acces_refuse(self, action, request):
-        if grp_pole_financier in request.user.groups.all():
+        user_groupes = request.user.groups.all()
+        if grp_accior in user_groupes or grp_afb in user_groupes:
             return False
 
         user_groupes = request.user.groups.all()
@@ -149,42 +169,60 @@ class PosteWorkflow(WorkflowMixin):
                 return True
         return False
 
-    @refuse_sauf_pour_drh
-    def acces_directeur_bur_srv(self, action, request):
+    @acces_etat_refuse
+    def acces_directeur_bureau(self, action, request):
+        if is_user_dans_services_centraux(request.user):
+            return False
         for g in request.user.groups.all():
-            if g in (grp_administrateurs, grp_gestionnaires, grp_service_utilisateurs, grp_correspondants_rh, grp_drh,):
+            if g in (grp_administrateurs, grp_drh,):
                 return True
         return False
 
-    @refuse_sauf_pour_drh
+    @acces_etat_refuse
     def acces_administrateur(self, action, request):
         for g in request.user.groups.all():
-            if g in (grp_directeurs_service, grp_drh,):
+            if g in (grp_correspondants_rh, grp_drh,):
                 return True
         return False
 
-    @refuse_sauf_pour_drh
+    @acces_etat_refuse
     def acces_drh_controle(self, action, request):
         for g in request.user.groups.all():
-            if g in (grp_directeurs_bureau, grp_administrateurs, grp_drh,):
+            if g in (grp_directeurs_bureau, grp_service_utilisateurs, grp_drh,):
                 return True
         return False
 
-    @refuse_sauf_pour_drh
-    def acces_finance(self, action, request):
+    @acces_etat_refuse
+    def acces_srv_utilisateurs(self, action, request):
+        if not is_user_dans_services_centraux(request.user):
+            return False
+        for g in request.user.groups.all():
+            if g in (grp_administrateurs, grp_drh, ):
+                return True
+        return False
+
+    @acces_etat_refuse
+    def acces_accior(self, action, request):
         for g in request.user.groups.all():
             if g in (grp_drh, ):
                 return True
         return False
 
-    @refuse_sauf_pour_drh
+    @acces_etat_refuse
+    def acces_afb(self, action, request):
+        for g in request.user.groups.all():
+            if g in (grp_accior, grp_drh, ):
+                return True
+        return False
+
+    @acces_etat_refuse
     def acces_haute_direction(self, action, request):
         for g in request.user.groups.all():
-            if g in (grp_pole_financier, grp_drh, ):
+            if g in (grp_afb, grp_drh, ):
                 return True
         return False
 
-    @refuse_sauf_pour_drh
+    @acces_etat_refuse
     def acces_drh_finalisation(self, action, request):
         for g in request.user.groups.all():
             if g in (grp_haute_direction, grp_drh, ):
@@ -195,10 +233,12 @@ class PosteWorkflow(WorkflowMixin):
 #codes actions
 DOSSIER_ETAT_REFUSE = POSTE_ETAT_REFUSE
 DOSSIER_ETAT_BROUILLON = POSTE_ETAT_BROUILLON
-DOSSIER_ETAT_DIRECTEUR_BUREAU_OU_SERVICE = POSTE_ETAT_DIRECTEUR_BUREAU_OU_SERVICE
 DOSSIER_ETAT_ADMINISTRATEUR = POSTE_ETAT_ADMINISTRATEUR
+DOSSIER_ETAT_DIRECTEUR_BUREAU = POSTE_ETAT_DIRECTEUR_BUREAU
+DOSSIER_ETAT_SERVICE_UTILISATEURS = POSTE_ETAT_SERVICE_UTILISATEURS
 DOSSIER_ETAT_DRH_CONTROLE = POSTE_ETAT_DRH_CONTROLE
-DOSSIER_ETAT_POLE_FINANCIER = POSTE_ETAT_POLE_FINANCIER
+DOSSIER_ETAT_ACCIOR = POSTE_ETAT_ACCIOR
+DOSSIER_ETAT_AFB = POSTE_ETAT_AFB
 DOSSIER_ETAT_HAUTE_DIRECTION = POSTE_ETAT_HAUTE_DIRECTION
 DOSSIER_ETAT_DRH_FINALISATION = POSTE_ETAT_DRH_FINALISATION
 
@@ -218,19 +258,18 @@ class DossierWorkflow(PosteWorkflow):
 
 
 MAP_GROUPE_ETATS_A_FAIRE = {
-    grp_gestionnaires : (),
-    grp_service_utilisateurs : (),
     grp_correspondants_rh : (),
-    grp_administrateurs : (POSTE_ETAT_ADMINISTRATEUR, DOSSIER_ETAT_ADMINISTRATEUR,),
-    grp_directeurs_bureau : (POSTE_ETAT_DIRECTEUR_BUREAU_OU_SERVICE, DOSSIER_ETAT_DIRECTEUR_BUREAU_OU_SERVICE,),
+    grp_service_utilisateurs : (POSTE_ETAT_SERVICE_UTILISATEURS, DOSSIER_ETAT_SERVICE_UTILISATEURS,),
+    grp_administrateurs : (POSTE_ETAT_ADMINISTRATEUR, DOSSIER_ETAT_ADMINISTRATEUR, ),
+    grp_directeurs_bureau : (POSTE_ETAT_DIRECTEUR_BUREAU, DOSSIER_ETAT_DIRECTEUR_BUREAU, ),
     grp_drh : (POSTE_ETAT_DRH_CONTROLE, POSTE_ETAT_DRH_FINALISATION, DOSSIER_ETAT_DRH_CONTROLE, DOSSIER_ETAT_DRH_FINALISATION,),
-    grp_pole_financier : (POSTE_ETAT_POLE_FINANCIER, DOSSIER_ETAT_POLE_FINANCIER, ),
+    grp_accior : (POSTE_ETAT_ACCIOR, DOSSIER_ETAT_ACCIOR, ),
+    grp_afb : (POSTE_ETAT_AFB, DOSSIER_ETAT_AFB, ),
     grp_haute_direction : (POSTE_ETAT_HAUTE_DIRECTION, DOSSIER_ETAT_HAUTE_DIRECTION, ),
-    grp_directeurs_service : (POSTE_ETAT_DIRECTEUR_BUREAU_OU_SERVICE, DOSSIER_ETAT_DIRECTEUR_BUREAU_OU_SERVICE,),
 }
 
 
-ETATS_EDITABLE = (POSTE_ETAT_BROUILLON, POSTE_ETAT_ADMINISTRATEUR, POSTE_ETAT_DRH_CONTROLE, POSTE_ETAT_DIRECTEUR_BUREAU_OU_SERVICE,
-                  DOSSIER_ETAT_BROUILLON, DOSSIER_ETAT_ADMINISTRATEUR, DOSSIER_ETAT_DRH_CONTROLE, DOSSIER_ETAT_DIRECTEUR_BUREAU_OU_SERVICE,
+ETATS_EDITABLE = (POSTE_ETAT_REFUSE, POSTE_ETAT_BROUILLON, POSTE_ETAT_ADMINISTRATEUR, POSTE_ETAT_DRH_CONTROLE, POSTE_ETAT_DIRECTEUR_BUREAU, POSTE_ETAT_SERVICE_UTILISATEURS, 
+                  DOSSIER_ETAT_REFUSE, DOSSIER_ETAT_BROUILLON, DOSSIER_ETAT_ADMINISTRATEUR, DOSSIER_ETAT_DRH_CONTROLE, DOSSIER_ETAT_DIRECTEUR_BUREAU, DOSSIER_ETAT_SERVICE_UTILISATEURS,
 )