)
# 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'administrateur",
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'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'ACCIOR",
POSTE_ETAT_ABF : u"Envoyer à l'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,
},
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
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):
user_groups = request.user.groups.all()
if is_user_dans_services_centraux(request.user) and grp_drh not in user_groups:
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
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):
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,
)