Bugfix: la haute direction ne pouvait pas valider une DAE.
[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 """
13 try:
14 grp, created = Group.objects.get_or_create(name=name)
15 except:
16 return None
17 return grp
18
1b217058 19# Groupes impliqués dans le Worflow
d8cfc3d5 20grp_correspondants_rh = safe_create_groupe(name='Correspondants RH')
33b0b6af 21grp_administrateurs = safe_create_groupe(name='Administrateurs')
33b0b6af
OL
22grp_directeurs_bureau = safe_create_groupe(name='Directeurs de bureau')
23grp_drh = safe_create_groupe(name='DRH')
d8cfc3d5 24grp_accior = safe_create_groupe(name='ACCIOR')
9a62bc55 25grp_abf = safe_create_groupe(name='ABF')
33b0b6af
OL
26grp_haute_direction = safe_create_groupe(name='Haute direction')
27grp_service_utilisateurs = safe_create_groupe(name='Service utilisateurs')
1b217058 28
27d7babd
OL
29dae_groupes = (
30 grp_correspondants_rh,
31 grp_administrateurs,
32 grp_directeurs_bureau,
33 grp_drh,
34 grp_accior,
9a62bc55 35 grp_abf,
27d7babd
OL
36 grp_haute_direction,
37 grp_service_utilisateurs,
38)
8fa94e8b
OL
39
40# codes états
41POSTE_ETAT_BROUILLON = 'BROUILLON'
1b217058 42POSTE_ETAT_ADMINISTRATEUR = 'ADMINISTRATEUR'
d8cfc3d5
OL
43POSTE_ETAT_DIRECTEUR_BUREAU = 'DIRECTEUR_BUREAU'
44POSTE_ETAT_SERVICE_UTILISATEURS = 'SRV_UTILISATEURS'
1b217058 45POSTE_ETAT_DRH_CONTROLE = 'DRH_CONTROLE'
bbb2458d 46POSTE_ETAT_DEMANDE_MODIF = 'DEMANDE_MODIF'
d8cfc3d5 47POSTE_ETAT_ACCIOR = 'ACCIOR'
9a62bc55 48POSTE_ETAT_ABF = 'ABF'
1b217058 49POSTE_ETAT_HAUTE_DIRECTION = 'HAUTE_DIRECTION'
bbb2458d 50POSTE_ETAT_DEMANDE_JUSTIF = 'DEMANDE_JUSTIF'
9536ea21 51POSTE_ETAT_REGION_FINALISATION = 'REGION_FINALISATION'
1b217058 52POSTE_ETAT_DRH_FINALISATION = 'DRH_FINALISATION'
9536ea21 53POSTE_ETAT_FINALISE = 'FINALISE'
1b217058
OL
54
55#codes actions
56POSTE_ACTION_ENVOYER_BROUILLON = POSTE_ETAT_BROUILLON
1b217058 57POSTE_ACTION_ENVOYER_ADMINISTRATEUR = POSTE_ETAT_ADMINISTRATEUR
d8cfc3d5
OL
58POSTE_ACTION_ENVOYER_DIRECTEUR_BUREAU = POSTE_ETAT_DIRECTEUR_BUREAU
59POSTE_ACTION_ENVOYER_SRV_UTILISATEURS = POSTE_ETAT_SERVICE_UTILISATEURS
1b217058 60POSTE_ACTION_ENVOYER_DRH_CONTROLE = POSTE_ETAT_DRH_CONTROLE
bbb2458d
EMS
61POSTE_ACTION_DEMANDE_MODIF = POSTE_ETAT_DEMANDE_MODIF
62POSTE_ACTION_RETOUR_DEMANDE_MODIF = 'RETOUR_DEMANDE_MODIF'
d8cfc3d5 63POSTE_ACTION_ENVOYER_ACCIOR = POSTE_ETAT_ACCIOR
9a62bc55 64POSTE_ACTION_ENVOYER_ABF = POSTE_ETAT_ABF
1b217058 65POSTE_ACTION_ENVOYER_HAUTE_DIRECTION = POSTE_ETAT_HAUTE_DIRECTION
bbb2458d
EMS
66POSTE_ACTION_DEMANDE_JUSTIF = POSTE_ETAT_DEMANDE_JUSTIF
67POSTE_ACTION_RETOUR_DEMANDE_JUSTIF = 'RETOUR_DEMANDE_JUSTIF'
9536ea21 68POSTE_ACTION_ENVOYER_REGION_FINALISATION = POSTE_ETAT_REGION_FINALISATION
1b217058 69POSTE_ACTION_ENVOYER_DRH_FINALISATION = POSTE_ETAT_DRH_FINALISATION
9536ea21 70POSTE_ACTION_FINALISER = 'FINALISER'
8fa94e8b
OL
71
72#libellés états
73POSTE_ETATS = {
3799cafc 74 POSTE_ETAT_BROUILLON : u"En rédaction",
6a7260b4 75 POSTE_ETAT_ADMINISTRATEUR : u"Validation de l'administrateur",
d8cfc3d5
OL
76 POSTE_ETAT_DIRECTEUR_BUREAU : u"Directeur de bureau",
77 POSTE_ETAT_SERVICE_UTILISATEURS : u"Service utilisateurs",
62cfa562 78 POSTE_ETAT_DRH_CONTROLE : u"Validation DRH",
bbb2458d 79 POSTE_ETAT_DEMANDE_MODIF : u"Demande de modification",
d8cfc3d5 80 POSTE_ETAT_ACCIOR : u"ACCIOR",
9a62bc55 81 POSTE_ETAT_ABF : u"ABF",
62cfa562 82 POSTE_ETAT_HAUTE_DIRECTION : u"Validation : Secrétaire général / Recteur",
bbb2458d 83 POSTE_ETAT_DEMANDE_JUSTIF : u"Demande de justification",
9536ea21
EMS
84 POSTE_ETAT_REGION_FINALISATION : u'Retour à la région',
85 POSTE_ETAT_DRH_FINALISATION : u'Retour à la DRH',
86 POSTE_ETAT_FINALISE : u'Finalisée'
8fa94e8b
OL
87 }
88
56589624
OL
89#libellés états pour boutons
90POSTE_ETATS_BOUTONS = {
d8cfc3d5
OL
91 POSTE_ETAT_DIRECTEUR_BUREAU : u"Envoyer au directeur de bureau",
92 POSTE_ETAT_SERVICE_UTILISATEURS : u"Envoyer au service utilisateurs",
56589624
OL
93 POSTE_ETAT_ADMINISTRATEUR : u"Envoyer à l'adminstrateur",
94 POSTE_ETAT_DRH_CONTROLE : u"Envoyer à la DRH (validation)",
bbb2458d 95 POSTE_ETAT_DEMANDE_MODIF : u"Envoyer une demande de modification",
871be4b0 96 POSTE_ETAT_ACCIOR : u"Envoyer à l'ACCIOR",
9a62bc55 97 POSTE_ETAT_ABF : u"Envoyer à l'ABF",
56589624 98 POSTE_ETAT_HAUTE_DIRECTION : u"Envoyer à la haute direction",
bbb2458d 99 POSTE_ETAT_DEMANDE_JUSTIF : u"Envoyer une demande de justification",
9536ea21
EMS
100 POSTE_ETAT_REGION_FINALISATION : u"Retourner à la région pour finalisation",
101 POSTE_ETAT_DRH_FINALISATION : u'Retourner à la DRH pour finalisation',
102 POSTE_ETAT_FINALISE : u'Finaliser'
56589624
OL
103 }
104
8fa94e8b
OL
105# définition du worflow séquentiel
106POSTE_ACTIONS = {
1b217058 107 POSTE_ACTION_ENVOYER_BROUILLON : {
8fa94e8b
OL
108 'nom' : u'Créer',
109 'etat_initial' : None,
110 'etat_final' : POSTE_ETAT_BROUILLON,
111 },
1b217058
OL
112 POSTE_ACTION_ENVOYER_ADMINISTRATEUR : {
113 'nom' : u'Envoyer',
8684fcaa 114 'etat_initial' : (POSTE_ETAT_BROUILLON,),
1b217058
OL
115 'etat_final' : POSTE_ETAT_ADMINISTRATEUR,
116 },
d8cfc3d5
OL
117 POSTE_ACTION_ENVOYER_SRV_UTILISATEURS : {
118 'nom' : u'Envoyer',
8684fcaa 119 'etat_initial' : (POSTE_ETAT_ADMINISTRATEUR,),
d8cfc3d5
OL
120 'etat_final' : POSTE_ETAT_SERVICE_UTILISATEURS,
121 },
122 POSTE_ACTION_ENVOYER_DIRECTEUR_BUREAU : {
123 'nom' : u'Envoyer',
bbb2458d 124 'etat_initial' : (POSTE_ETAT_ADMINISTRATEUR,),
d8cfc3d5
OL
125 'etat_final' : POSTE_ETAT_DIRECTEUR_BUREAU,
126 },
1b217058
OL
127 POSTE_ACTION_ENVOYER_DRH_CONTROLE : {
128 'nom' : u'Envoyer',
bbb2458d 129 'etat_initial' : (POSTE_ETAT_ADMINISTRATEUR, POSTE_ETAT_DIRECTEUR_BUREAU, POSTE_ETAT_SERVICE_UTILISATEURS),
1b217058
OL
130 'etat_final' : POSTE_ETAT_DRH_CONTROLE,
131 },
bbb2458d
EMS
132 POSTE_ACTION_DEMANDE_MODIF : {
133 'nom' : u'Envoyer',
134 'etat_initial' : (POSTE_ETAT_DRH_CONTROLE,),
135 'etat_final': POSTE_ETAT_DEMANDE_MODIF,
136 },
137 POSTE_ACTION_RETOUR_DEMANDE_MODIF : {
138 'nom': u'Retourner',
139 'etat_initial': (POSTE_ETAT_DEMANDE_MODIF,),
140 'etat_final': POSTE_ETAT_DRH_CONTROLE,
141 },
d8cfc3d5 142 POSTE_ACTION_ENVOYER_ACCIOR : {
1b217058 143 'nom' : u'Envoyer',
bbb2458d 144 'etat_initial' : (POSTE_ETAT_DRH_CONTROLE,),
d8cfc3d5
OL
145 'etat_final' : POSTE_ETAT_ACCIOR,
146 },
9a62bc55 147 POSTE_ACTION_ENVOYER_ABF : {
d8cfc3d5 148 'nom' : u'Envoyer',
bbb2458d 149 'etat_initial' : (POSTE_ETAT_ACCIOR,),
9a62bc55 150 'etat_final' : POSTE_ETAT_ABF,
1b217058
OL
151 },
152 POSTE_ACTION_ENVOYER_HAUTE_DIRECTION : {
153 'nom' : u'Envoyer',
bbb2458d 154 'etat_initial' : (POSTE_ETAT_ABF,),
1b217058
OL
155 'etat_final' : POSTE_ETAT_HAUTE_DIRECTION,
156 },
bbb2458d
EMS
157 POSTE_ACTION_DEMANDE_JUSTIF : {
158 'nom' : u'Envoyer',
159 'etat_initial' : (POSTE_ETAT_HAUTE_DIRECTION,),
160 'etat_final': POSTE_ETAT_DEMANDE_JUSTIF,
161 },
162 POSTE_ACTION_RETOUR_DEMANDE_JUSTIF : {
163 'nom' : u'Envoyer',
164 'etat_initial' : (POSTE_ETAT_DEMANDE_JUSTIF,),
165 'etat_final': POSTE_ETAT_HAUTE_DIRECTION,
166 },
9536ea21 167 POSTE_ACTION_ENVOYER_REGION_FINALISATION : {
1b217058 168 'nom' : u'Envoyer',
bbb2458d 169 'etat_initial' : (POSTE_ETAT_HAUTE_DIRECTION,),
9536ea21
EMS
170 'etat_final' : POSTE_ETAT_REGION_FINALISATION
171 },
172 POSTE_ACTION_ENVOYER_DRH_FINALISATION : {
173 'nom' : u'Envoyer',
174 'etat_initial' : (POSTE_ETAT_REGION_FINALISATION,),
1b217058 175 'etat_final' : POSTE_ETAT_DRH_FINALISATION,
8fa94e8b 176 },
9536ea21
EMS
177 POSTE_ACTION_FINALISER : {
178 'nom' : u'Finaliser',
179 'etat_initial' : (POSTE_ETAT_DRH_FINALISATION,),
180 'etat_final' : POSTE_ETAT_FINALISE
181 },
8fa94e8b
OL
182}
183
56589624 184
8fa94e8b
OL
185class PosteWorkflow(WorkflowMixin):
186 etat_initial = POSTE_ETAT_BROUILLON
187 etats = POSTE_ETATS
188 actions = POSTE_ACTIONS
189
190 class Meta:
191 abstract = True
192
d8cfc3d5 193 def acces_directeur_bureau(self, action, request):
2da4acc0
OL
194 user_groups = request.user.groups.all()
195 if is_user_dans_services_centraux(request.user) and grp_drh not in user_groups:
d8cfc3d5 196 return False
2da4acc0 197 for g in user_groups:
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):
bbb2458d
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
9a62bc55 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():
9a62bc55 239 if g in (grp_abf, grp_drh, ):
1b217058
OL
240 return True
241 return False
242
9536ea21 243 def acces_region_finalisation(self, action, request):
8684fcaa 244 for g in request.user.groups.all():
edbedae5 245 if g in (grp_haute_direction, grp_drh,):
9e40cfbe 246 return True
9536ea21 247
1b217058 248 def acces_drh_finalisation(self, action, request):
edbedae5
EMS
249 for g in request.user.groups.all():
250 if g in (grp_drh,):
251 return True
252 return False
1b217058 253
bbb2458d
EMS
254 def acces_demande_justif(self, action, request):
255 groups = set(request.user.groups.all())
256 return any(g in groups for g in [grp_haute_direction, grp_drh])
257
258 def acces_retour_demande_modif(self, action, request):
291bbfd9
EMS
259 for g in request.user.groups.all():
260 if g in (grp_administrateurs, grp_drh,):
261 return True
262 return False
bbb2458d
EMS
263
264 def acces_retour_demande_justif(self, action, request):
291bbfd9
EMS
265 for g in request.user.groups.all():
266 if g in (grp_drh, ):
267 return True
268 return False
bbb2458d 269
9536ea21 270 def acces_finaliser(self, action, request):
291bbfd9
EMS
271 for g in request.user.groups.all():
272 if g in (grp_drh, ):
273 return True
274 return False
9536ea21 275
1b217058 276
515124ec
OL
277#codes actions
278DOSSIER_ETAT_BROUILLON = POSTE_ETAT_BROUILLON
515124ec 279DOSSIER_ETAT_ADMINISTRATEUR = POSTE_ETAT_ADMINISTRATEUR
d8cfc3d5
OL
280DOSSIER_ETAT_DIRECTEUR_BUREAU = POSTE_ETAT_DIRECTEUR_BUREAU
281DOSSIER_ETAT_SERVICE_UTILISATEURS = POSTE_ETAT_SERVICE_UTILISATEURS
515124ec 282DOSSIER_ETAT_DRH_CONTROLE = POSTE_ETAT_DRH_CONTROLE
bbb2458d 283DOSSIER_ETAT_DEMANDE_MODIF = POSTE_ETAT_DEMANDE_MODIF
d8cfc3d5 284DOSSIER_ETAT_ACCIOR = POSTE_ETAT_ACCIOR
9a62bc55 285DOSSIER_ETAT_ABF = POSTE_ETAT_ABF
515124ec 286DOSSIER_ETAT_HAUTE_DIRECTION = POSTE_ETAT_HAUTE_DIRECTION
bbb2458d 287DOSSIER_ETAT_DEMANDE_JUSTIF = POSTE_ETAT_DEMANDE_JUSTIF
9536ea21 288DOSSIER_ETAT_REGION_FINALISATION = POSTE_ETAT_REGION_FINALISATION
515124ec 289DOSSIER_ETAT_DRH_FINALISATION = POSTE_ETAT_DRH_FINALISATION
9536ea21 290DOSSIER_ETAT_FINALISE = POSTE_ETAT_FINALISE
afc204bf
OL
291
292class DossierWorkflow(PosteWorkflow):
293
294 class Meta:
295 abstract = True
515124ec 296
515124ec
OL
297
298MAP_GROUPE_ETATS_A_FAIRE = {
eefe1a9e 299 grp_correspondants_rh : (POSTE_ETAT_BROUILLON, DOSSIER_ETAT_BROUILLON, ),
9536ea21
EMS
300 grp_service_utilisateurs : (POSTE_ETAT_SERVICE_UTILISATEURS,
301 DOSSIER_ETAT_SERVICE_UTILISATEURS,),
302 grp_administrateurs : (POSTE_ETAT_ADMINISTRATEUR,
303 DOSSIER_ETAT_ADMINISTRATEUR,
304 POSTE_ETAT_DEMANDE_MODIF,
305 DOSSIER_ETAT_DEMANDE_MODIF,
306 POSTE_ETAT_REGION_FINALISATION,
307 DOSSIER_ETAT_REGION_FINALISATION,
308 ),
d8cfc3d5 309 grp_directeurs_bureau : (POSTE_ETAT_DIRECTEUR_BUREAU, DOSSIER_ETAT_DIRECTEUR_BUREAU, ),
9536ea21
EMS
310 grp_drh : (POSTE_ETAT_DRH_CONTROLE, POSTE_ETAT_DRH_FINALISATION,
311 DOSSIER_ETAT_DRH_CONTROLE, DOSSIER_ETAT_DRH_FINALISATION,
bbb2458d 312 POSTE_ETAT_DEMANDE_JUSTIF, DOSSIER_ETAT_DEMANDE_JUSTIF),
d8cfc3d5 313 grp_accior : (POSTE_ETAT_ACCIOR, DOSSIER_ETAT_ACCIOR, ),
9a62bc55 314 grp_abf : (POSTE_ETAT_ABF, DOSSIER_ETAT_ABF, ),
3799cafc 315 grp_haute_direction : (POSTE_ETAT_HAUTE_DIRECTION, DOSSIER_ETAT_HAUTE_DIRECTION, ),
515124ec 316}
286d0aa9
OL
317
318
bbb2458d
EMS
319ETATS_EDITABLE = (POSTE_ETAT_BROUILLON, POSTE_ETAT_ADMINISTRATEUR,
320 POSTE_ETAT_DRH_CONTROLE, POSTE_ETAT_DIRECTEUR_BUREAU,
321 POSTE_ETAT_SERVICE_UTILISATEURS,
322 POSTE_ETAT_DEMANDE_MODIF,
323 POSTE_ETAT_DEMANDE_JUSTIF,
324 DOSSIER_ETAT_BROUILLON,
325 DOSSIER_ETAT_ADMINISTRATEUR, DOSSIER_ETAT_DRH_CONTROLE,
326 DOSSIER_ETAT_DIRECTEUR_BUREAU,
327 DOSSIER_ETAT_SERVICE_UTILISATEURS,
328 DOSSIER_ETAT_DEMANDE_MODIF,
329 DOSSIER_ETAT_DEMANDE_JUSTIF,
286d0aa9
OL
330)
331
9536ea21
EMS
332ETATS_VALIDE = (DOSSIER_ETAT_REGION_FINALISATION, DOSSIER_ETAT_DRH_FINALISATION,
333 DOSSIER_ETAT_FINALISE)