[#2206] Remplacer l'état "refusé" par les deux états "demande de modification" et...
authorEric Mc Sween <eric.mcsween@auf.org>
Thu, 27 Oct 2011 20:40:37 +0000 (16:40 -0400)
committerEric Mc Sween <eric.mcsween@auf.org>
Thu, 27 Oct 2011 20:40:37 +0000 (16:40 -0400)
project/dae/managers.py
project/dae/templates/dae/embauches_liste.html
project/dae/templates/dae/ligne_validation.html
project/dae/views.py
project/dae/workflow.py

index 857650b..6abb6f7 100644 (file)
@@ -6,8 +6,6 @@ from utils import get_employe_from_user
 from workflow import POSTE_ETAT_HAUTE_DIRECTION, \
                      POSTE_ETAT_ACCIOR, \
                      POSTE_ETAT_ABF, \
-                     POSTE_ETAT_REFUSE, \
-                     DOSSIER_ETAT_REFUSE, \
                      DOSSIER_ETAT_ACCIOR, \
                      DOSSIER_ETAT_ABF, \
                      MAP_GROUPE_ETATS_A_FAIRE
@@ -69,10 +67,6 @@ class SecurityManager(models.Manager):
         if workflowed_model and grp_service_utilisateurs in user.groups.all():
             q = q | Q(**{ self.prefixe_service : employe.service})
 
-        if workflowed_model:
-            q_non_refuse = ~Q(etat__in=(POSTE_ETAT_REFUSE, DOSSIER_ETAT_REFUSE,))
-        #    q = q & q_non_refuse
-
         liste = self.get_query_set().filter(q)
 
 
@@ -80,25 +74,25 @@ class SecurityManager(models.Manager):
         # TRAITEMENT ACCIOR
         ############################################        
         if workflowed_model and grp_accior in user.groups.all():
-            liste = liste | self.get_query_set().filter(q_non_refuse & Q(etat__in=(POSTE_ETAT_ACCIOR, DOSSIER_ETAT_ACCIOR,)))
+            liste = liste | self.get_query_set().filter(Q(etat__in=(POSTE_ETAT_ACCIOR, DOSSIER_ETAT_ACCIOR,)))
 
         ############################################
         # TRAITEMENT ABF
         ############################################        
         if workflowed_model and grp_abf in user.groups.all():
-            liste = self.get_query_set().filter(q_non_refuse)
+            liste = self.get_query_set().all()
 
         ############################################
         # TRAITEMENT HAUTE DIRECTION
         ############################################        
         if workflowed_model and grp_haute_direction in user.groups.all():
-            liste = self.get_query_set().filter(q_non_refuse)
+            liste = self.get_query_set().all()
 
         ############################################
         # TRAITEMENT DRH
         ############################################        
         if grp_drh in user.groups.all():
-            liste = self.get_query_set()
+            liste = self.get_query_set().all()
 
         return liste
 
index 6cc97fe..de7d39a 100644 (file)
     <p>Il n'y a aucune demande en cours.</p>
 {% endif %}
 
-<h2>Les demandes non retenues</h2>
-{% if embauches_non_retenues %}
-<table class="tablesorter">
-    <thead>
-    {% include "dae/embauche-header.html" %}
-    </thead>
-<tbody>
-{% for dossier in embauches_non_retenues %}
-    {% include "dae/embauche-row.html" %}
-{% endfor %}
-</tbody>
-</table>
-{% else %}
-    <p>Il n'y a aucune demande non retenue.</p>
-{% endif %}
-
-
 {% endblock %}
index 2dcc314..3c11d3b 100644 (file)
@@ -1,10 +1,16 @@
 <tr>
 <td>
-    {% if commentaire.etat_final == 'REFUSE' %}
-        {{ commentaire.owner }} a refusé la demande le {{ commentaire.date|date:"d M Y" }}
-    {% else %}
-        {{ commentaire.owner }} a validé la demande le {{ commentaire.date|date:"d M Y"}}
+    {{ commentaire.owner }} a
+    {% if commentaire.etat_final == 'DEMANDE_MODIFICATION' %}
+        fait une demande de modification
     {% endif %}
+    {% if commentaire.etat_final == 'DEMANDE_JUSTIFICATION' %}
+        fait une demande de justification
+    {% endif %}
+    {% if commentaire.etat_final != 'DEMANDE_MODIFICATION' and commentaire.etat_final != 'DEMANDE_JUSTIFICATION' %}
+        validé la demande
+    {% endif %}
+    le {{ commentaire.date|date:"d M Y"}}
 </td>
 <td>
     {% if commentaire.texte %} ({{ commentaire.texte }}){% endif %}
index 02662be..4a44efa 100644 (file)
@@ -30,7 +30,7 @@ from decorators import dae_groupe_requis, \
                        dossier_est_modifiable, \
                        poste_est_modifiable
 from forms import *
-from workflow import POSTE_ETAT_DRH_FINALISATION, DOSSIER_ETAT_REFUSE
+from workflow import POSTE_ETAT_DRH_FINALISATION
 from decorators import redirect_interdiction
 
 def devises():
@@ -324,8 +324,7 @@ def embauches_liste(request):
     """ Liste des embauches. """
     vars = dict()
     vars['embauches_a_traiter'] = dae.Dossier.objects.mes_choses_a_faire(request.user).all().order_by('-date_creation')
-    vars['embauches_en_cours'] = dae.Dossier.objects.ma_region_ou_service(request.user).filter(~Q(etat=DOSSIER_ETAT_REFUSE)).order_by('-date_creation')
-    vars['embauches_non_retenues'] = dae.Dossier.objects.ma_region_ou_service(request.user).filter(etat=DOSSIER_ETAT_REFUSE).order_by('-date_creation')
+    vars['embauches_en_cours'] = dae.Dossier.objects.ma_region_ou_service(request.user).order_by('-date_creation')
     return render_to_response('dae/embauches_liste.html', vars, RequestContext(request))
 
 def employe(request, key):
index 609edb8..47bbf6b 100644 (file)
@@ -39,63 +39,64 @@ dae_groupes = (
 )
 
 # codes états
-POSTE_ETAT_REFUSE = 'REFUSE'
 POSTE_ETAT_BROUILLON = 'BROUILLON'
 POSTE_ETAT_ADMINISTRATEUR = 'ADMINISTRATEUR'
 POSTE_ETAT_DIRECTEUR_BUREAU = 'DIRECTEUR_BUREAU'
 POSTE_ETAT_SERVICE_UTILISATEURS = 'SRV_UTILISATEURS'
 POSTE_ETAT_DRH_CONTROLE = 'DRH_CONTROLE'
+POSTE_ETAT_DEMANDE_MODIF = 'DEMANDE_MODIF'
 POSTE_ETAT_ACCIOR = 'ACCIOR'
 POSTE_ETAT_ABF = 'ABF'
 POSTE_ETAT_HAUTE_DIRECTION = 'HAUTE_DIRECTION'
+POSTE_ETAT_DEMANDE_JUSTIF = 'DEMANDE_JUSTIF'
 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_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_DEMANDE_MODIF = POSTE_ETAT_DEMANDE_MODIF
+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_HAUTE_DIRECTION = POSTE_ETAT_HAUTE_DIRECTION
+POSTE_ACTION_DEMANDE_JUSTIF = POSTE_ETAT_DEMANDE_JUSTIF
+POSTE_ACTION_RETOUR_DEMANDE_JUSTIF = 'RETOUR_DEMANDE_JUSTIF'
 POSTE_ACTION_ENVOYER_DRH_FINALISATION = POSTE_ETAT_DRH_FINALISATION
 
 #libellés états
 POSTE_ETATS = {
-    POSTE_ETAT_REFUSE : u"Refusé",
     POSTE_ETAT_BROUILLON : u"En rédaction",
     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_DEMANDE_MODIF : u"Demande de modification",
     POSTE_ETAT_ACCIOR : u"ACCIOR",
     POSTE_ETAT_ABF : u"ABF",
     POSTE_ETAT_HAUTE_DIRECTION : u"Validation : Secrétaire général / Recteur",
+    POSTE_ETAT_DEMANDE_JUSTIF : u"Demande de justification",
     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 : u"Envoyer au directeur de bureau",
     POSTE_ETAT_SERVICE_UTILISATEURS : u"Envoyer au service utilisateurs",
     POSTE_ETAT_ADMINISTRATEUR : u"Envoyer à l&#39;adminstrateur",
     POSTE_ETAT_DRH_CONTROLE : u"Envoyer à la DRH (validation)",
+    POSTE_ETAT_DEMANDE_MODIF : u"Envoyer une demande de modification",
     POSTE_ETAT_ACCIOR : u"Envoyer à l&#39;ACCIOR",
     POSTE_ETAT_ABF : u"Envoyer à l&#39;ABF",
     POSTE_ETAT_HAUTE_DIRECTION : u"Envoyer à la haute direction",
+    POSTE_ETAT_DEMANDE_JUSTIF : u"Envoyer une demande de justification",
     POSTE_ETAT_DRH_FINALISATION : u'Envoyer à la DRH (traitement)',
     }
 
 # définition du worflow séquentiel
 POSTE_ACTIONS = {
-    POSTE_ACTION_ENVOYER_REFUSE : {
-        'nom' : u'Refuser',
-        '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 : {
         'nom' : u'Créer',
         'etat_initial' : None,
@@ -103,61 +104,67 @@ POSTE_ACTIONS = {
     },
     POSTE_ACTION_ENVOYER_ADMINISTRATEUR : {
         'nom' : u'Envoyer',
-        'etat_initial' : (POSTE_ETAT_BROUILLON, POSTE_ETAT_REFUSE, ), 
+        'etat_initial' : (POSTE_ETAT_BROUILLON,), 
         'etat_final' : POSTE_ETAT_ADMINISTRATEUR,
     },
     POSTE_ACTION_ENVOYER_SRV_UTILISATEURS : {
         'nom' : u'Envoyer',
-        'etat_initial' : (POSTE_ETAT_ADMINISTRATEUR, POSTE_ETAT_REFUSE, ), 
+        'etat_initial' : (POSTE_ETAT_ADMINISTRATEUR,), 
         'etat_final' : POSTE_ETAT_SERVICE_UTILISATEURS,
     },
     POSTE_ACTION_ENVOYER_DIRECTEUR_BUREAU : {
         'nom' : u'Envoyer',
-        'etat_initial' : (POSTE_ETAT_ADMINISTRATEUR, POSTE_ETAT_REFUSE,),
+        'etat_initial' : (POSTE_ETAT_ADMINISTRATEUR,),
         'etat_final' : POSTE_ETAT_DIRECTEUR_BUREAU,
     },
     POSTE_ACTION_ENVOYER_DRH_CONTROLE : {
         'nom' : u'Envoyer',
-        'etat_initial' : (POSTE_ETAT_ADMINISTRATEUR, POSTE_ETAT_DIRECTEUR_BUREAU, POSTE_ETAT_SERVICE_UTILISATEURS, POSTE_ETAT_REFUSE, ),
+        'etat_initial' : (POSTE_ETAT_ADMINISTRATEUR, POSTE_ETAT_DIRECTEUR_BUREAU, POSTE_ETAT_SERVICE_UTILISATEURS),
         'etat_final' : POSTE_ETAT_DRH_CONTROLE,
     },
+    POSTE_ACTION_DEMANDE_MODIF : {
+        'nom' : u'Envoyer',
+        'etat_initial' : (POSTE_ETAT_DRH_CONTROLE,),
+        'etat_final': POSTE_ETAT_DEMANDE_MODIF,
+    },
+    POSTE_ACTION_RETOUR_DEMANDE_MODIF : {
+        'nom': u'Retourner',
+        'etat_initial': (POSTE_ETAT_DEMANDE_MODIF,),
+        'etat_final': POSTE_ETAT_DRH_CONTROLE,
+    },
     POSTE_ACTION_ENVOYER_ACCIOR : {
         'nom' : u'Envoyer',
-        'etat_initial' : (POSTE_ETAT_DRH_CONTROLE, POSTE_ETAT_REFUSE, ),
+        'etat_initial' : (POSTE_ETAT_DRH_CONTROLE,),
         'etat_final' : POSTE_ETAT_ACCIOR,
     },
     POSTE_ACTION_ENVOYER_ABF : {
         'nom' : u'Envoyer',
-        'etat_initial' : (POSTE_ETAT_ACCIOR, POSTE_ETAT_REFUSE, ),
+        'etat_initial' : (POSTE_ETAT_ACCIOR,),
         'etat_final' : POSTE_ETAT_ABF,
     },
     POSTE_ACTION_ENVOYER_HAUTE_DIRECTION : {
         'nom' : u'Envoyer',
-        'etat_initial' : (POSTE_ETAT_ABF, POSTE_ETAT_REFUSE, ),
+        'etat_initial' : (POSTE_ETAT_ABF,),
         'etat_final' : POSTE_ETAT_HAUTE_DIRECTION,
     },
+    POSTE_ACTION_DEMANDE_JUSTIF : {
+        'nom' : u'Envoyer',
+        'etat_initial' : (POSTE_ETAT_HAUTE_DIRECTION,),
+        'etat_final': POSTE_ETAT_DEMANDE_JUSTIF,
+    },
+    POSTE_ACTION_RETOUR_DEMANDE_JUSTIF : {
+        'nom' : u'Envoyer',
+        'etat_initial' : (POSTE_ETAT_DEMANDE_JUSTIF,),
+        'etat_final': POSTE_ETAT_HAUTE_DIRECTION,
+    },
     POSTE_ACTION_ENVOYER_DRH_FINALISATION : {
         'nom' : u'Envoyer',
-        'etat_initial' : (POSTE_ETAT_HAUTE_DIRECTION, POSTE_ETAT_REFUSE, ),
+        'etat_initial' : (POSTE_ETAT_HAUTE_DIRECTION,),
         'etat_final' : POSTE_ETAT_DRH_FINALISATION,
     },
 }
 
 
-def acces_etat_refuse(f):
-    """
-    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)
-        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
-    return inner
-
 class PosteWorkflow(WorkflowMixin):
     etat_initial = POSTE_ETAT_BROUILLON
     etats = POSTE_ETATS
@@ -166,20 +173,6 @@ class PosteWorkflow(WorkflowMixin):
     class Meta:
         abstract = True
 
-    def acces_refuse(self, action, request):
-        klass = self.__class__
-        user_groupes = request.user.groups.all()
-        if (grp_accior in user_groupes or grp_abf in user_groupes) and len(user_groupes) == 1:
-            return False
-
-        user_groupes = request.user.groups.all()
-        en_cours = klass.objects.mes_choses_a_faire(request.user).all()
-        for g, etats in MAP_GROUPE_ETATS_A_FAIRE.items():
-            if g in user_groupes and self.etat in etats and self in en_cours:
-                return True
-        return False
-
-    @acces_etat_refuse
     def acces_directeur_bureau(self, action, request):
         if is_user_dans_services_centraux(request.user):
             return False
@@ -188,21 +181,21 @@ class PosteWorkflow(WorkflowMixin):
                 return True
         return False
 
-    @acces_etat_refuse
     def acces_administrateur(self, action, request):
         for g in request.user.groups.all():
             if g in (grp_correspondants_rh, grp_drh,):
                 return True
         return False
 
-    @acces_etat_refuse
     def acces_drh_controle(self, action, request):
-        for g in request.user.groups.all():
-            if g in (grp_directeurs_bureau, grp_service_utilisateurs, grp_drh,) or g == grp_administrateurs and is_user_dans_region(request.user):
-                return True
-        return False
+        groups = request.user.groups.all()
+        return any(g in groups for g in [grp_directeurs_bureau, grp_service_utilisateurs, grp_drh]) or \
+               grp_administrateurs in groups and (action == POSTE_ACTION_RETOUR_DEMANDE_MODIF or
+                                                  is_user_dans_region(request.user))
+
+    def acces_demande_modif(self, action, request):
+        return grp_drh in request.user.groups.all()
 
-    @acces_etat_refuse
     def acces_srv_utilisateurs(self, action, request):
         if not is_user_dans_services_centraux(request.user):
             return False
@@ -211,45 +204,52 @@ class PosteWorkflow(WorkflowMixin):
                 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
 
-    @acces_etat_refuse
     def acces_abf(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_abf, grp_drh, ):
                 return True
         return False
 
-    @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, ):
                 return True
         return False
 
+    def acces_demande_justif(self, action, request):
+        groups = set(request.user.groups.all())
+        return any(g in groups for g in [grp_haute_direction, grp_drh])
+
+    def acces_retour_demande_modif(self, action, request):
+        return self.acces_drh_controle(action, request)
+
+    def acces_retour_demande_justif(self, action, request):
+        return self.acces_haute_direction(action, request)
+
 
 #codes actions
-DOSSIER_ETAT_REFUSE = POSTE_ETAT_REFUSE
 DOSSIER_ETAT_BROUILLON = POSTE_ETAT_BROUILLON
 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_DEMANDE_MODIF = POSTE_ETAT_DEMANDE_MODIF
 DOSSIER_ETAT_ACCIOR = POSTE_ETAT_ACCIOR
 DOSSIER_ETAT_ABF = POSTE_ETAT_ABF
 DOSSIER_ETAT_HAUTE_DIRECTION = POSTE_ETAT_HAUTE_DIRECTION
+DOSSIER_ETAT_DEMANDE_JUSTIF = POSTE_ETAT_DEMANDE_JUSTIF
 DOSSIER_ETAT_DRH_FINALISATION = POSTE_ETAT_DRH_FINALISATION
 
 class DossierWorkflow(PosteWorkflow):
@@ -261,16 +261,27 @@ class DossierWorkflow(PosteWorkflow):
 MAP_GROUPE_ETATS_A_FAIRE = {
     grp_correspondants_rh : (POSTE_ETAT_BROUILLON, DOSSIER_ETAT_BROUILLON, ),
     grp_service_utilisateurs : (POSTE_ETAT_SERVICE_UTILISATEURS, DOSSIER_ETAT_SERVICE_UTILISATEURS,),
-    grp_administrateurs : (POSTE_ETAT_ADMINISTRATEUR, DOSSIER_ETAT_ADMINISTRATEUR, ),
+    grp_administrateurs : (POSTE_ETAT_ADMINISTRATEUR, DOSSIER_ETAT_ADMINISTRATEUR, POSTE_ETAT_DEMANDE_MODIF,
+                           DOSSIER_ETAT_DEMANDE_MODIF),
     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_drh : (POSTE_ETAT_DRH_CONTROLE, POSTE_ETAT_DRH_FINALISATION, DOSSIER_ETAT_DRH_CONTROLE, DOSSIER_ETAT_DRH_FINALISATION,
+               POSTE_ETAT_DEMANDE_JUSTIF, DOSSIER_ETAT_DEMANDE_JUSTIF),
     grp_accior : (POSTE_ETAT_ACCIOR, DOSSIER_ETAT_ACCIOR, ),
     grp_abf : (POSTE_ETAT_ABF, DOSSIER_ETAT_ABF, ),
     grp_haute_direction : (POSTE_ETAT_HAUTE_DIRECTION, DOSSIER_ETAT_HAUTE_DIRECTION, ),
 }
 
 
-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,
+ETATS_EDITABLE = (POSTE_ETAT_BROUILLON, POSTE_ETAT_ADMINISTRATEUR,
+                  POSTE_ETAT_DRH_CONTROLE, POSTE_ETAT_DIRECTEUR_BUREAU,
+                  POSTE_ETAT_SERVICE_UTILISATEURS,
+                  POSTE_ETAT_DEMANDE_MODIF,
+                  POSTE_ETAT_DEMANDE_JUSTIF,
+                  DOSSIER_ETAT_BROUILLON,
+                  DOSSIER_ETAT_ADMINISTRATEUR, DOSSIER_ETAT_DRH_CONTROLE,
+                  DOSSIER_ETAT_DIRECTEUR_BUREAU,
+                  DOSSIER_ETAT_SERVICE_UTILISATEURS,
+                  DOSSIER_ETAT_DEMANDE_MODIF,
+                  DOSSIER_ETAT_DEMANDE_JUSTIF,
 )