[#2243] Correction du workflow
[auf_rh_dae.git] / project / dae / workflow.py
CommitLineData
8fa94e8b
OL
1# -*- encoding: utf-8 -*-
2
1b217058 3from django.contrib.auth.models import Group
8fa94e8b 4from auf.django.workflow.models import WorkflowMixin
42dfa870 5from utils import is_user_dans_services_centraux, is_user_dans_region
8fa94e8b 6
33b0b6af
OL
7def safe_create_groupe(name):
8 """
9 Création d'un groupe prédéfini. Retourne None, quand la création
10 ne peut se faire. (C'est le cas au syncdb, quand la table de groupe
11 n'a pas été crée encore).
12 """
647dc21a 13 # TODO : Refactoring : utiliser project.lib.safe_create_groupe
33b0b6af
OL
14 try:
15 grp, created = Group.objects.get_or_create(name=name)
16 except:
17 return None
18 return grp
19
1b217058 20# Groupes impliqués dans le Worflow
d8cfc3d5 21grp_correspondants_rh = safe_create_groupe(name='Correspondants RH')
33b0b6af 22grp_administrateurs = safe_create_groupe(name='Administrateurs')
33b0b6af
OL
23grp_directeurs_bureau = safe_create_groupe(name='Directeurs de bureau')
24grp_drh = safe_create_groupe(name='DRH')
d8cfc3d5 25grp_accior = safe_create_groupe(name='ACCIOR')
80c526a0 26grp_abf = safe_create_groupe(name='ABF')
33b0b6af
OL
27grp_haute_direction = safe_create_groupe(name='Haute direction')
28grp_service_utilisateurs = safe_create_groupe(name='Service utilisateurs')
1b217058 29
27d7babd
OL
30dae_groupes = (
31 grp_correspondants_rh,
32 grp_administrateurs,
33 grp_directeurs_bureau,
34 grp_drh,
35 grp_accior,
80c526a0 36 grp_abf,
27d7babd
OL
37 grp_haute_direction,
38 grp_service_utilisateurs,
39)
8fa94e8b
OL
40
41# codes états
42POSTE_ETAT_BROUILLON = 'BROUILLON'
1b217058 43POSTE_ETAT_ADMINISTRATEUR = 'ADMINISTRATEUR'
d8cfc3d5
OL
44POSTE_ETAT_DIRECTEUR_BUREAU = 'DIRECTEUR_BUREAU'
45POSTE_ETAT_SERVICE_UTILISATEURS = 'SRV_UTILISATEURS'
1b217058 46POSTE_ETAT_DRH_CONTROLE = 'DRH_CONTROLE'
d7e67bd4 47POSTE_ETAT_DEMANDE_MODIF = 'DEMANDE_MODIF'
d8cfc3d5 48POSTE_ETAT_ACCIOR = 'ACCIOR'
80c526a0 49POSTE_ETAT_ABF = 'ABF'
1b217058 50POSTE_ETAT_HAUTE_DIRECTION = 'HAUTE_DIRECTION'
d7e67bd4 51POSTE_ETAT_DEMANDE_JUSTIF = 'DEMANDE_JUSTIF'
c511cd1f 52POSTE_ETAT_REGION_FINALISATION = 'REGION_FINALISATION'
1b217058 53POSTE_ETAT_DRH_FINALISATION = 'DRH_FINALISATION'
c511cd1f 54POSTE_ETAT_FINALISE = 'FINALISE'
1b217058
OL
55
56#codes actions
57POSTE_ACTION_ENVOYER_BROUILLON = POSTE_ETAT_BROUILLON
1b217058 58POSTE_ACTION_ENVOYER_ADMINISTRATEUR = POSTE_ETAT_ADMINISTRATEUR
d8cfc3d5
OL
59POSTE_ACTION_ENVOYER_DIRECTEUR_BUREAU = POSTE_ETAT_DIRECTEUR_BUREAU
60POSTE_ACTION_ENVOYER_SRV_UTILISATEURS = POSTE_ETAT_SERVICE_UTILISATEURS
1b217058 61POSTE_ACTION_ENVOYER_DRH_CONTROLE = POSTE_ETAT_DRH_CONTROLE
d7e67bd4
EMS
62POSTE_ACTION_DEMANDE_MODIF = POSTE_ETAT_DEMANDE_MODIF
63POSTE_ACTION_RETOUR_DEMANDE_MODIF = 'RETOUR_DEMANDE_MODIF'
d8cfc3d5 64POSTE_ACTION_ENVOYER_ACCIOR = POSTE_ETAT_ACCIOR
80c526a0 65POSTE_ACTION_ENVOYER_ABF = POSTE_ETAT_ABF
1b217058 66POSTE_ACTION_ENVOYER_HAUTE_DIRECTION = POSTE_ETAT_HAUTE_DIRECTION
d7e67bd4
EMS
67POSTE_ACTION_DEMANDE_JUSTIF = POSTE_ETAT_DEMANDE_JUSTIF
68POSTE_ACTION_RETOUR_DEMANDE_JUSTIF = 'RETOUR_DEMANDE_JUSTIF'
c511cd1f 69POSTE_ACTION_ENVOYER_REGION_FINALISATION = POSTE_ETAT_REGION_FINALISATION
1b217058 70POSTE_ACTION_ENVOYER_DRH_FINALISATION = POSTE_ETAT_DRH_FINALISATION
c511cd1f 71POSTE_ACTION_FINALISER = 'FINALISER'
8fa94e8b
OL
72
73#libellés états
74POSTE_ETATS = {
3799cafc 75 POSTE_ETAT_BROUILLON : u"En rédaction",
62cfa562 76 POSTE_ETAT_ADMINISTRATEUR : u"Validation de l'adminstrateur",
d8cfc3d5
OL
77 POSTE_ETAT_DIRECTEUR_BUREAU : u"Directeur de bureau",
78 POSTE_ETAT_SERVICE_UTILISATEURS : u"Service utilisateurs",
62cfa562 79 POSTE_ETAT_DRH_CONTROLE : u"Validation DRH",
d7e67bd4 80 POSTE_ETAT_DEMANDE_MODIF : u"Demande de modification",
d8cfc3d5 81 POSTE_ETAT_ACCIOR : u"ACCIOR",
80c526a0 82 POSTE_ETAT_ABF : u"ABF",
62cfa562 83 POSTE_ETAT_HAUTE_DIRECTION : u"Validation : Secrétaire général / Recteur",
d7e67bd4 84 POSTE_ETAT_DEMANDE_JUSTIF : u"Demande de justification",
c511cd1f
EMS
85 POSTE_ETAT_REGION_FINALISATION : u'Retour à la région',
86 POSTE_ETAT_DRH_FINALISATION : u'Retour à la DRH',
87 POSTE_ETAT_FINALISE : u'Finalisée'
8fa94e8b
OL
88 }
89
56589624
OL
90#libellés états pour boutons
91POSTE_ETATS_BOUTONS = {
d8cfc3d5
OL
92 POSTE_ETAT_DIRECTEUR_BUREAU : u"Envoyer au directeur de bureau",
93 POSTE_ETAT_SERVICE_UTILISATEURS : u"Envoyer au service utilisateurs",
56589624
OL
94 POSTE_ETAT_ADMINISTRATEUR : u"Envoyer à l'adminstrateur",
95 POSTE_ETAT_DRH_CONTROLE : u"Envoyer à la DRH (validation)",
d7e67bd4 96 POSTE_ETAT_DEMANDE_MODIF : u"Envoyer une demande de modification",
871be4b0 97 POSTE_ETAT_ACCIOR : u"Envoyer à l'ACCIOR",
80c526a0 98 POSTE_ETAT_ABF : u"Envoyer à l'ABF",
56589624 99 POSTE_ETAT_HAUTE_DIRECTION : u"Envoyer à la haute direction",
d7e67bd4 100 POSTE_ETAT_DEMANDE_JUSTIF : u"Envoyer une demande de justification",
c511cd1f
EMS
101 POSTE_ETAT_REGION_FINALISATION : u"Retourner à la région pour finalisation",
102 POSTE_ETAT_DRH_FINALISATION : u'Retourner à la DRH pour finalisation',
103 POSTE_ETAT_FINALISE : u'Finaliser'
56589624
OL
104 }
105
8fa94e8b
OL
106# définition du worflow séquentiel
107POSTE_ACTIONS = {
1b217058 108 POSTE_ACTION_ENVOYER_BROUILLON : {
8fa94e8b
OL
109 'nom' : u'Créer',
110 'etat_initial' : None,
111 'etat_final' : POSTE_ETAT_BROUILLON,
112 },
1b217058
OL
113 POSTE_ACTION_ENVOYER_ADMINISTRATEUR : {
114 'nom' : u'Envoyer',
d7e67bd4 115 'etat_initial' : (POSTE_ETAT_BROUILLON,),
1b217058
OL
116 'etat_final' : POSTE_ETAT_ADMINISTRATEUR,
117 },
d8cfc3d5
OL
118 POSTE_ACTION_ENVOYER_SRV_UTILISATEURS : {
119 'nom' : u'Envoyer',
d7e67bd4 120 'etat_initial' : (POSTE_ETAT_ADMINISTRATEUR,),
d8cfc3d5
OL
121 'etat_final' : POSTE_ETAT_SERVICE_UTILISATEURS,
122 },
123 POSTE_ACTION_ENVOYER_DIRECTEUR_BUREAU : {
124 'nom' : u'Envoyer',
d7e67bd4 125 'etat_initial' : (POSTE_ETAT_ADMINISTRATEUR,),
d8cfc3d5
OL
126 'etat_final' : POSTE_ETAT_DIRECTEUR_BUREAU,
127 },
1b217058
OL
128 POSTE_ACTION_ENVOYER_DRH_CONTROLE : {
129 'nom' : u'Envoyer',
d7e67bd4 130 'etat_initial' : (POSTE_ETAT_ADMINISTRATEUR, POSTE_ETAT_DIRECTEUR_BUREAU, POSTE_ETAT_SERVICE_UTILISATEURS),
1b217058
OL
131 'etat_final' : POSTE_ETAT_DRH_CONTROLE,
132 },
d7e67bd4
EMS
133 POSTE_ACTION_DEMANDE_MODIF : {
134 'nom' : u'Envoyer',
135 'etat_initial' : (POSTE_ETAT_DRH_CONTROLE,),
136 'etat_final': POSTE_ETAT_DEMANDE_MODIF,
137 },
138 POSTE_ACTION_RETOUR_DEMANDE_MODIF : {
139 'nom': u'Retourner',
140 'etat_initial': (POSTE_ETAT_DEMANDE_MODIF,),
141 'etat_final': POSTE_ETAT_DRH_CONTROLE,
142 },
d8cfc3d5 143 POSTE_ACTION_ENVOYER_ACCIOR : {
1b217058 144 'nom' : u'Envoyer',
d7e67bd4 145 'etat_initial' : (POSTE_ETAT_DRH_CONTROLE,),
d8cfc3d5
OL
146 'etat_final' : POSTE_ETAT_ACCIOR,
147 },
80c526a0 148 POSTE_ACTION_ENVOYER_ABF : {
d8cfc3d5 149 'nom' : u'Envoyer',
d7e67bd4 150 'etat_initial' : (POSTE_ETAT_ACCIOR,),
80c526a0 151 'etat_final' : POSTE_ETAT_ABF,
1b217058
OL
152 },
153 POSTE_ACTION_ENVOYER_HAUTE_DIRECTION : {
154 'nom' : u'Envoyer',
d7e67bd4 155 'etat_initial' : (POSTE_ETAT_ABF,),
1b217058
OL
156 'etat_final' : POSTE_ETAT_HAUTE_DIRECTION,
157 },
d7e67bd4
EMS
158 POSTE_ACTION_DEMANDE_JUSTIF : {
159 'nom' : u'Envoyer',
160 'etat_initial' : (POSTE_ETAT_HAUTE_DIRECTION,),
161 'etat_final': POSTE_ETAT_DEMANDE_JUSTIF,
162 },
163 POSTE_ACTION_RETOUR_DEMANDE_JUSTIF : {
164 'nom' : u'Envoyer',
165 'etat_initial' : (POSTE_ETAT_DEMANDE_JUSTIF,),
166 'etat_final': POSTE_ETAT_HAUTE_DIRECTION,
167 },
c511cd1f 168 POSTE_ACTION_ENVOYER_REGION_FINALISATION : {
1b217058 169 'nom' : u'Envoyer',
d7e67bd4 170 'etat_initial' : (POSTE_ETAT_HAUTE_DIRECTION,),
c511cd1f
EMS
171 'etat_final' : POSTE_ETAT_REGION_FINALISATION
172 },
173 POSTE_ACTION_ENVOYER_DRH_FINALISATION : {
174 'nom' : u'Envoyer',
175 'etat_initial' : (POSTE_ETAT_REGION_FINALISATION,),
1b217058 176 'etat_final' : POSTE_ETAT_DRH_FINALISATION,
8fa94e8b 177 },
c511cd1f
EMS
178 POSTE_ACTION_FINALISER : {
179 'nom' : u'Finaliser',
180 'etat_initial' : (POSTE_ETAT_DRH_FINALISATION,),
181 'etat_final' : POSTE_ETAT_FINALISE
182 },
8fa94e8b
OL
183}
184
56589624 185
8fa94e8b
OL
186class PosteWorkflow(WorkflowMixin):
187 etat_initial = POSTE_ETAT_BROUILLON
188 etats = POSTE_ETATS
189 actions = POSTE_ACTIONS
190
191 class Meta:
192 abstract = True
193
d8cfc3d5
OL
194 def acces_directeur_bureau(self, action, request):
195 if is_user_dans_services_centraux(request.user):
196 return False
1b217058 197 for g in request.user.groups.all():
d8cfc3d5 198 if g in (grp_administrateurs, grp_drh,):
1b217058
OL
199 return True
200 return False
201
202 def acces_administrateur(self, action, request):
203 for g in request.user.groups.all():
d8cfc3d5 204 if g in (grp_correspondants_rh, grp_drh,):
1b217058
OL
205 return True
206 return False
207
208 def acces_drh_controle(self, action, request):
d7e67bd4
EMS
209 groups = request.user.groups.all()
210 return any(g in groups for g in [grp_directeurs_bureau, grp_service_utilisateurs, grp_drh]) or \
211 grp_administrateurs in groups and (action == POSTE_ACTION_RETOUR_DEMANDE_MODIF or
212 is_user_dans_region(request.user))
213
214 def acces_demande_modif(self, action, request):
215 return grp_drh in request.user.groups.all()
1b217058 216
d8cfc3d5
OL
217 def acces_srv_utilisateurs(self, action, request):
218 if not is_user_dans_services_centraux(request.user):
219 return False
220 for g in request.user.groups.all():
221 if g in (grp_administrateurs, grp_drh, ):
222 return True
223 return False
224
d8cfc3d5 225 def acces_accior(self, action, request):
1b217058
OL
226 for g in request.user.groups.all():
227 if g in (grp_drh, ):
228 return True
229 return False
230
80c526a0 231 def acces_abf(self, action, request):
d8cfc3d5
OL
232 for g in request.user.groups.all():
233 if g in (grp_accior, grp_drh, ):
234 return True
235 return False
236
1b217058
OL
237 def acces_haute_direction(self, action, request):
238 for g in request.user.groups.all():
80c526a0 239 if g in (grp_abf, grp_drh, ):
1b217058
OL
240 return True
241 return False
242
c511cd1f 243 def acces_region_finalisation(self, action, request):
72058136
EMS
244 for g in user_groups:
245 if g in (grp_administrateurs, grp_drh,):
246 return True
c511cd1f 247
1b217058 248 def acces_drh_finalisation(self, action, request):
72058136 249 return self.acces_administrateur
1b217058 250
d7e67bd4
EMS
251 def acces_demande_justif(self, action, request):
252 groups = set(request.user.groups.all())
253 return any(g in groups for g in [grp_haute_direction, grp_drh])
254
255 def acces_retour_demande_modif(self, action, request):
256 return self.acces_drh_controle(action, request)
257
258 def acces_retour_demande_justif(self, action, request):
259 return self.acces_haute_direction(action, request)
260
c511cd1f
EMS
261 def acces_finaliser(self, action, request):
262 return self.acces_drh_finalisation(action, request)
263
1b217058 264
515124ec
OL
265#codes actions
266DOSSIER_ETAT_BROUILLON = POSTE_ETAT_BROUILLON
515124ec 267DOSSIER_ETAT_ADMINISTRATEUR = POSTE_ETAT_ADMINISTRATEUR
d8cfc3d5
OL
268DOSSIER_ETAT_DIRECTEUR_BUREAU = POSTE_ETAT_DIRECTEUR_BUREAU
269DOSSIER_ETAT_SERVICE_UTILISATEURS = POSTE_ETAT_SERVICE_UTILISATEURS
515124ec 270DOSSIER_ETAT_DRH_CONTROLE = POSTE_ETAT_DRH_CONTROLE
d7e67bd4 271DOSSIER_ETAT_DEMANDE_MODIF = POSTE_ETAT_DEMANDE_MODIF
d8cfc3d5 272DOSSIER_ETAT_ACCIOR = POSTE_ETAT_ACCIOR
80c526a0 273DOSSIER_ETAT_ABF = POSTE_ETAT_ABF
515124ec 274DOSSIER_ETAT_HAUTE_DIRECTION = POSTE_ETAT_HAUTE_DIRECTION
d7e67bd4 275DOSSIER_ETAT_DEMANDE_JUSTIF = POSTE_ETAT_DEMANDE_JUSTIF
c511cd1f 276DOSSIER_ETAT_REGION_FINALISATION = POSTE_ETAT_REGION_FINALISATION
515124ec 277DOSSIER_ETAT_DRH_FINALISATION = POSTE_ETAT_DRH_FINALISATION
c511cd1f 278DOSSIER_ETAT_FINALISE = POSTE_ETAT_FINALISE
afc204bf
OL
279
280class DossierWorkflow(PosteWorkflow):
281
282 class Meta:
283 abstract = True
515124ec 284
515124ec
OL
285
286MAP_GROUPE_ETATS_A_FAIRE = {
eefe1a9e 287 grp_correspondants_rh : (POSTE_ETAT_BROUILLON, DOSSIER_ETAT_BROUILLON, ),
c511cd1f
EMS
288 grp_service_utilisateurs : (POSTE_ETAT_SERVICE_UTILISATEURS,
289 DOSSIER_ETAT_SERVICE_UTILISATEURS,),
290 grp_administrateurs : (POSTE_ETAT_ADMINISTRATEUR,
291 DOSSIER_ETAT_ADMINISTRATEUR,
292 POSTE_ETAT_DEMANDE_MODIF,
293 DOSSIER_ETAT_DEMANDE_MODIF,
294 POSTE_ETAT_REGION_FINALISATION,
295 DOSSIER_ETAT_REGION_FINALISATION,
296 ),
d8cfc3d5 297 grp_directeurs_bureau : (POSTE_ETAT_DIRECTEUR_BUREAU, DOSSIER_ETAT_DIRECTEUR_BUREAU, ),
c511cd1f
EMS
298 grp_drh : (POSTE_ETAT_DRH_CONTROLE, POSTE_ETAT_DRH_FINALISATION,
299 DOSSIER_ETAT_DRH_CONTROLE, DOSSIER_ETAT_DRH_FINALISATION,
d7e67bd4 300 POSTE_ETAT_DEMANDE_JUSTIF, DOSSIER_ETAT_DEMANDE_JUSTIF),
d8cfc3d5 301 grp_accior : (POSTE_ETAT_ACCIOR, DOSSIER_ETAT_ACCIOR, ),
80c526a0 302 grp_abf : (POSTE_ETAT_ABF, DOSSIER_ETAT_ABF, ),
3799cafc 303 grp_haute_direction : (POSTE_ETAT_HAUTE_DIRECTION, DOSSIER_ETAT_HAUTE_DIRECTION, ),
515124ec 304}
286d0aa9
OL
305
306
d7e67bd4
EMS
307ETATS_EDITABLE = (POSTE_ETAT_BROUILLON, POSTE_ETAT_ADMINISTRATEUR,
308 POSTE_ETAT_DRH_CONTROLE, POSTE_ETAT_DIRECTEUR_BUREAU,
309 POSTE_ETAT_SERVICE_UTILISATEURS,
310 POSTE_ETAT_DEMANDE_MODIF,
311 POSTE_ETAT_DEMANDE_JUSTIF,
312 DOSSIER_ETAT_BROUILLON,
313 DOSSIER_ETAT_ADMINISTRATEUR, DOSSIER_ETAT_DRH_CONTROLE,
314 DOSSIER_ETAT_DIRECTEUR_BUREAU,
315 DOSSIER_ETAT_SERVICE_UTILISATEURS,
316 DOSSIER_ETAT_DEMANDE_MODIF,
317 DOSSIER_ETAT_DEMANDE_JUSTIF,
286d0aa9
OL
318)
319
c511cd1f
EMS
320ETATS_VALIDE = (DOSSIER_ETAT_REGION_FINALISATION, DOSSIER_ETAT_DRH_FINALISATION,
321 DOSSIER_ETAT_FINALISE)