#1490
[auf_rh_dae.git] / project / dae / workflow.py
index 2236691..9cda079 100644 (file)
@@ -62,6 +62,17 @@ POSTE_ETATS = {
     POSTE_ETAT_DRH_FINALISATION : u'Retour à la DRH et région',
     }
 
+#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_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_HAUTE_DIRECTION : u"Envoyer à la haute direction",
+    POSTE_ETAT_DRH_FINALISATION : u'Envoyer à la DRH (traitement)',
+    }
+
 # définition du worflow séquentiel
 POSTE_ACTIONS = {
     POSTE_ACTION_ENVOYER_REFUSE : {
@@ -81,31 +92,45 @@ POSTE_ACTIONS = {
     },
     POSTE_ACTION_ENVOYER_ADMINISTRATEUR : {
         'nom' : u'Envoyer',
-        'etat_initial' : POSTE_ETAT_DIRECTEUR_BUREAU_OU_SERVICE,
+        'etat_initial' : (POSTE_ETAT_REFUSE, POSTE_ETAT_DIRECTEUR_BUREAU_OU_SERVICE),
         'etat_final' : POSTE_ETAT_ADMINISTRATEUR,
     },
     POSTE_ACTION_ENVOYER_DRH_CONTROLE : {
         'nom' : u'Envoyer',
-        'etat_initial' : (POSTE_ETAT_DIRECTEUR_BUREAU_OU_SERVICE, POSTE_ETAT_ADMINISTRATEUR, ),
+        'etat_initial' : (POSTE_ETAT_REFUSE, POSTE_ETAT_DIRECTEUR_BUREAU_OU_SERVICE, POSTE_ETAT_ADMINISTRATEUR, ),
         'etat_final' : POSTE_ETAT_DRH_CONTROLE,
     },
     POSTE_ACTION_ENVOYER_POLE_FINANCIER : {
         'nom' : u'Envoyer',
-        'etat_initial' : POSTE_ETAT_DRH_CONTROLE,
+        'etat_initial' : (POSTE_ETAT_REFUSE, POSTE_ETAT_DRH_CONTROLE, ),
         'etat_final' : POSTE_ETAT_POLE_FINANCIER,
     },
     POSTE_ACTION_ENVOYER_HAUTE_DIRECTION : {
         'nom' : u'Envoyer',
-        'etat_initial' : POSTE_ETAT_POLE_FINANCIER,
+        'etat_initial' : (POSTE_ETAT_REFUSE, POSTE_ETAT_POLE_FINANCIER, ),
         'etat_final' : POSTE_ETAT_HAUTE_DIRECTION,
     },
     POSTE_ACTION_ENVOYER_DRH_FINALISATION : {
         'nom' : u'Envoyer',
-        'etat_initial' : POSTE_ETAT_HAUTE_DIRECTION,
+        'etat_initial' : (POSTE_ETAT_REFUSE, POSTE_ETAT_HAUTE_DIRECTION, ),
         'etat_final' : POSTE_ETAT_DRH_FINALISATION,
     },
 }
 
+
+def refuse_sauf_pour_drh(f):
+    """
+    Personne ne peut manipuler quelque chose à l'état refusé excepté la DRH
+    """
+    def inner(obj, action, request):
+        if obj.etat != 'REFUSE':
+            return f(obj, action, request)
+        if grp_drh in request.user.groups.all():
+            return f(obj, action, request)
+        else:
+            return False
+    return inner
+
 class PosteWorkflow(WorkflowMixin):
     etat_initial = POSTE_ETAT_BROUILLON
     etats = POSTE_ETATS
@@ -115,38 +140,51 @@ class PosteWorkflow(WorkflowMixin):
         abstract = True
 
     def acces_refuse(self, action, request):
-        return True
+        if grp_pole_financier in request.user.groups.all():
+            return False
+
+        user_groupes = request.user.groups.all()
+        for g, etats in MAP_GROUPE_ETATS_A_FAIRE.items():
+            if g in user_groupes and self.etat in etats:
+                return True
+        return False
 
+    @refuse_sauf_pour_drh
     def acces_directeur_bur_srv(self, action, request):
         for g in request.user.groups.all():
             if g in (grp_administrateurs, grp_gestionnaires, grp_service_utilisateurs, grp_correspondants_rh, grp_drh,):
                 return True
         return False
 
+    @refuse_sauf_pour_drh
     def acces_administrateur(self, action, request):
         for g in request.user.groups.all():
             if g in (grp_directeurs_service, grp_drh,):
                 return True
         return False
 
+    @refuse_sauf_pour_drh
     def acces_drh_controle(self, action, request):
         for g in request.user.groups.all():
             if g in (grp_directeurs_bureau, grp_administrateurs, grp_drh,):
                 return True
         return False
 
+    @refuse_sauf_pour_drh
     def acces_finance(self, action, request):
         for g in request.user.groups.all():
             if g in (grp_drh, ):
                 return True
         return False
 
+    @refuse_sauf_pour_drh
     def acces_haute_direction(self, action, request):
         for g in request.user.groups.all():
             if g in (grp_pole_financier, grp_drh, ):
                 return True
         return False
 
+    @refuse_sauf_pour_drh
     def acces_drh_finalisation(self, action, request):
         for g in request.user.groups.all():
             if g in (grp_haute_direction, grp_drh, ):