#1490
authorOlivier Larchevêque <olivier.larcheveque@auf.org>
Tue, 24 May 2011 16:30:11 +0000 (12:30 -0400)
committerOlivier Larchevêque <olivier.larcheveque@auf.org>
Tue, 24 May 2011 16:30:11 +0000 (12:30 -0400)
buildout.cfg
project/dae/forms.py
project/dae/templates/dae/embauche_consulter.html
project/dae/templates/dae/poste_consulter.html
project/dae/workflow.py

index 22dfa48..f67e761 100644 (file)
@@ -36,7 +36,7 @@ south = 0.7
 auf.django.skin = 0.15dev
 auf.django.auth = 0.5.2dev
 django-reversion = 1.3.3
-auf.django.workflow = 0.10dev
+auf.django.workflow = 0.12dev
 django-ajax-selects = 1.1.4
 
 #reportlab = 2.5
index a4d5bd2..137ef94 100644 (file)
@@ -10,7 +10,7 @@ from datamaster_modeles import models as ref
 from dae import models as dae
 from utils import get_employe_from_user, is_user_dans_service
 from rh_v1 import models as rh
-from workflow import grp_drh
+from workflow import grp_drh, POSTE_ETATS_BOUTONS
 
 def _implantation_choices(obj, request):
     # TRAITEMENT NORMAL
@@ -276,23 +276,21 @@ class DossierForm(forms.ModelForm):
                        contrat_date_fin=admin_widgets.AdminDateWidget(),
                     )
 
-WF_HELP_TEXT = """Ce champs affiche par défaut l'étape de traitement de la demande.
-La liste déroulante vous permet de sélectionner l'étape suivante."""
 WF_HELP_TEXT = ""
 
 class PosteWorkflowForm(WorkflowFormMixin):
-   
+    bouton_libelles = POSTE_ETATS_BOUTONS
     class Meta:
         fields = ('etat', )
         model = dae.Poste
-
+   
     def __init__(self, *args, **kwargs):
         super(self.__class__, self).__init__(*args, **kwargs)
         self.fields['etat'].help_text = WF_HELP_TEXT
 
 
 class DossierWorkflowForm(WorkflowFormMixin):
-    
+    bouton_libelles = POSTE_ETATS_BOUTONS # meme workflow que poste...
     class Meta:
         fields = ('etat', )
         model = dae.Dossier
index ac2dca2..c8ddbda 100644 (file)
   </ul>
 
   <h2>Votre validation (ou commentaire)</h2>
-  <p>Ce dossier est présentement à l'état <span class="note">{{ poste.get_etat_display }}</span>.</p>
-  <ul>
-      <li>Si vous laissez le statut actuel, votre commentaire sera enregistré.</li>
-      <li>Si vous sélectionnez un autre statut, votre action sera considérée comme une validation, mais vous pourrez toujours ajouter un commentaire par la suite.</li>
-  </ul>
+  <p>Ce dossier est actuellement à l'état <span class="note">{{ dossier.get_etat_display }}</span>.</p>
   
   <form action="" method="post">
   <table>
-  {{ validationForm }}
+  {{ validationForm.commentaire }}
   </table>
-  <input type="submit" value="valider" />
+  {{ validationForm.get_input_etats_as_buttons|safe }}
   </form>
   </fieldset>
     
index e2afdaf..ccfa91b 100644 (file)
@@ -29,18 +29,14 @@ Demande d'autorisation d'embauche
 {% endfor %}
 </ul>
 
-<h2>Votre validation (ou commentaire)</h2>
-<p>Ce poste est présentement à l'état <span class="note">{{ poste.get_etat_display }}</span>.</p>
-<ul>
-    <li>Si vous laissez le statut actuel, votre commentaire sera enregistré.</li>
-    <li>Si vous sélectionnez un autre statut, votre action sera considérée comme une validation, mais vous pourrez toujours ajouter un commentaire par la suite.</li>
-</ul>
+<h2>Votre validation</h2>
+<p>Le poste est actuellement à l'état :  <span class="note">{{ poste.get_etat_display }}</span>.</p>
 
 <form action="" method="post">
 <table>
-{{ validationForm }}
+{{ validationForm.commentaire }}
 </table>
-<input type="submit" value="valider" />
+{{ validationForm.get_input_etats_as_buttons|safe }}
 </form>
 </fieldset>
 
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&#39;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, ):