protection etat WF
[auf_rh_dae.git] / project / dae / workflow.py
index 4960cb2..6bfab83 100644 (file)
 # -*- encoding: utf-8 -*-
 
+from django.contrib.auth.models import Group
 from auf.django.workflow.models import WorkflowMixin
 
-#codes actions
-POSTE_ACTION_CREER = 'CREER'
-POSTE_ACTION_TERMINER = 'TERMINER'
+def safe_create_groupe(name):
+    """
+    Création d'un groupe prédéfini. Retourne None, quand la création
+    ne peut se faire. (C'est le cas au syncdb, quand la table de groupe
+    n'a pas été crée encore).
+    """
+    try:
+        grp, created = Group.objects.get_or_create(name=name)
+    except:
+        return None
+    return grp
+
+# Groupes impliqués dans le Worflow
+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_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, )
 
 # codes états
 POSTE_ETAT_BROUILLON = 'BROUILLON'
-POSTE_ETAT_TERMINE = 'TERMINE'
+POSTE_ETAT_DIRECTEUR_BUREAU_OU_SERVICE = 'DIRECTEUR_BUR_SRV'
+POSTE_ETAT_ADMINISTRATEUR = 'ADMINISTRATEUR'
+POSTE_ETAT_DRH_CONTROLE = 'DRH_CONTROLE'
+POSTE_ETAT_POLE_FINANCIER = 'FINANCE'
+POSTE_ETAT_HAUTE_DIRECTION = 'HAUTE_DIRECTION'
+POSTE_ETAT_DRH_FINALISATION = 'DRH_FINALISATION'
+
+ETATS_EDITABLE = (POSTE_ETAT_BROUILLON, POSTE_ETAT_ADMINISTRATEUR, POSTE_ETAT_DRH_CONTROLE)
+
+#codes actions
+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_DRH_CONTROLE = POSTE_ETAT_DRH_CONTROLE
+POSTE_ACTION_ENVOYER_POLE_FINANCIER = POSTE_ETAT_POLE_FINANCIER
+POSTE_ACTION_ENVOYER_HAUTE_DIRECTION = POSTE_ETAT_HAUTE_DIRECTION
+POSTE_ACTION_ENVOYER_DRH_FINALISATION = POSTE_ETAT_DRH_FINALISATION
 
 #libellés états
 POSTE_ETATS = {
-    POSTE_ETAT_BROUILLON : u'Brouillon',
-    POSTE_ETAT_TERMINE : u'Terminé',
+    POSTE_ETAT_BROUILLON : u"Proposition",
+    POSTE_ETAT_DIRECTEUR_BUREAU_OU_SERVICE : u"Directeur de bureau, pôle ou service",
+    POSTE_ETAT_ADMINISTRATEUR : u"Validation de l'adminstrateur",
+    POSTE_ETAT_DRH_CONTROLE : u"Validation DRH",
+    POSTE_ETAT_POLE_FINANCIER : u"Pôle finances",
+    POSTE_ETAT_HAUTE_DIRECTION : u"Validation : Secrétaire général / Recteur",
+    POSTE_ETAT_DRH_FINALISATION : u'Retour à la DRH et région',
     }
 
 # définition du worflow séquentiel
 POSTE_ACTIONS = {
-    POSTE_ACTION_CREER : {
+    POSTE_ACTION_ENVOYER_BROUILLON : {
         'nom' : u'Créer',
         'etat_initial' : None,
         'etat_final' : POSTE_ETAT_BROUILLON,
     },
-    POSTE_ACTION_TERMINER : {
-        'nom' : u'Créer',
+    POSTE_ACTION_ENVOYER_DIRECTEUR_BUREAU_OU_SERVICE : {
+        'nom' : u'Envoyer',
         'etat_initial' : POSTE_ETAT_BROUILLON,
-        'etat_final' : POSTE_ETAT_TERMINE,
+        'etat_final' : POSTE_ETAT_DIRECTEUR_BUREAU_OU_SERVICE,
+    },
+    POSTE_ACTION_ENVOYER_ADMINISTRATEUR : {
+        'nom' : u'Envoyer',
+        'etat_initial' : 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_final' : POSTE_ETAT_DRH_CONTROLE,
+    },
+    POSTE_ACTION_ENVOYER_POLE_FINANCIER : {
+        'nom' : u'Envoyer',
+        'etat_initial' : 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_final' : POSTE_ETAT_HAUTE_DIRECTION,
+    },
+    POSTE_ACTION_ENVOYER_DRH_FINALISATION : {
+        'nom' : u'Envoyer',
+        'etat_initial' : POSTE_ETAT_HAUTE_DIRECTION,
+        'etat_final' : POSTE_ETAT_DRH_FINALISATION,
     },
 }
 
@@ -38,11 +108,44 @@ class PosteWorkflow(WorkflowMixin):
     class Meta:
         abstract = True
 
-    def acces_creer(self, action, request):
-        return True
 
-    def acces_terminer(self, action, request):
-        return True
+    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
+
+    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
+
+    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
+
+    def acces_finance(self, action, request):
+        for g in request.user.groups.all():
+            if g in (grp_drh, ):
+                return True
+        return False
+
+    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
+
+    def acces_drh_finalisation(self, action, request):
+        for g in request.user.groups.all():
+            if g in (grp_haute_direction, grp_drh, ):
+                return True
+        return False
+
+
 
 class DossierWorkflow(PosteWorkflow):