Bugfix: la haute direction ne pouvait pas valider une DAE.
[auf_rh_dae.git] / project / dae / workflow.py
1 # -*- encoding: utf-8 -*-
2
3 from django.contrib.auth.models import Group
4 from auf.django.workflow.models import WorkflowMixin
5 from utils import is_user_dans_services_centraux, is_user_dans_region
6
7 def 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
19 # Groupes impliqués dans le Worflow
20 grp_correspondants_rh = safe_create_groupe(name='Correspondants RH')
21 grp_administrateurs = safe_create_groupe(name='Administrateurs')
22 grp_directeurs_bureau = safe_create_groupe(name='Directeurs de bureau')
23 grp_drh = safe_create_groupe(name='DRH')
24 grp_accior = safe_create_groupe(name='ACCIOR')
25 grp_abf = safe_create_groupe(name='ABF')
26 grp_haute_direction = safe_create_groupe(name='Haute direction')
27 grp_service_utilisateurs = safe_create_groupe(name='Service utilisateurs')
28
29 dae_groupes = (
30 grp_correspondants_rh,
31 grp_administrateurs,
32 grp_directeurs_bureau,
33 grp_drh,
34 grp_accior,
35 grp_abf,
36 grp_haute_direction,
37 grp_service_utilisateurs,
38 )
39
40 # codes états
41 POSTE_ETAT_BROUILLON = 'BROUILLON'
42 POSTE_ETAT_ADMINISTRATEUR = 'ADMINISTRATEUR'
43 POSTE_ETAT_DIRECTEUR_BUREAU = 'DIRECTEUR_BUREAU'
44 POSTE_ETAT_SERVICE_UTILISATEURS = 'SRV_UTILISATEURS'
45 POSTE_ETAT_DRH_CONTROLE = 'DRH_CONTROLE'
46 POSTE_ETAT_DEMANDE_MODIF = 'DEMANDE_MODIF'
47 POSTE_ETAT_ACCIOR = 'ACCIOR'
48 POSTE_ETAT_ABF = 'ABF'
49 POSTE_ETAT_HAUTE_DIRECTION = 'HAUTE_DIRECTION'
50 POSTE_ETAT_DEMANDE_JUSTIF = 'DEMANDE_JUSTIF'
51 POSTE_ETAT_REGION_FINALISATION = 'REGION_FINALISATION'
52 POSTE_ETAT_DRH_FINALISATION = 'DRH_FINALISATION'
53 POSTE_ETAT_FINALISE = 'FINALISE'
54
55 #codes actions
56 POSTE_ACTION_ENVOYER_BROUILLON = POSTE_ETAT_BROUILLON
57 POSTE_ACTION_ENVOYER_ADMINISTRATEUR = POSTE_ETAT_ADMINISTRATEUR
58 POSTE_ACTION_ENVOYER_DIRECTEUR_BUREAU = POSTE_ETAT_DIRECTEUR_BUREAU
59 POSTE_ACTION_ENVOYER_SRV_UTILISATEURS = POSTE_ETAT_SERVICE_UTILISATEURS
60 POSTE_ACTION_ENVOYER_DRH_CONTROLE = POSTE_ETAT_DRH_CONTROLE
61 POSTE_ACTION_DEMANDE_MODIF = POSTE_ETAT_DEMANDE_MODIF
62 POSTE_ACTION_RETOUR_DEMANDE_MODIF = 'RETOUR_DEMANDE_MODIF'
63 POSTE_ACTION_ENVOYER_ACCIOR = POSTE_ETAT_ACCIOR
64 POSTE_ACTION_ENVOYER_ABF = POSTE_ETAT_ABF
65 POSTE_ACTION_ENVOYER_HAUTE_DIRECTION = POSTE_ETAT_HAUTE_DIRECTION
66 POSTE_ACTION_DEMANDE_JUSTIF = POSTE_ETAT_DEMANDE_JUSTIF
67 POSTE_ACTION_RETOUR_DEMANDE_JUSTIF = 'RETOUR_DEMANDE_JUSTIF'
68 POSTE_ACTION_ENVOYER_REGION_FINALISATION = POSTE_ETAT_REGION_FINALISATION
69 POSTE_ACTION_ENVOYER_DRH_FINALISATION = POSTE_ETAT_DRH_FINALISATION
70 POSTE_ACTION_FINALISER = 'FINALISER'
71
72 #libellés états
73 POSTE_ETATS = {
74 POSTE_ETAT_BROUILLON : u"En rédaction",
75 POSTE_ETAT_ADMINISTRATEUR : u"Validation de l'administrateur",
76 POSTE_ETAT_DIRECTEUR_BUREAU : u"Directeur de bureau",
77 POSTE_ETAT_SERVICE_UTILISATEURS : u"Service utilisateurs",
78 POSTE_ETAT_DRH_CONTROLE : u"Validation DRH",
79 POSTE_ETAT_DEMANDE_MODIF : u"Demande de modification",
80 POSTE_ETAT_ACCIOR : u"ACCIOR",
81 POSTE_ETAT_ABF : u"ABF",
82 POSTE_ETAT_HAUTE_DIRECTION : u"Validation : Secrétaire général / Recteur",
83 POSTE_ETAT_DEMANDE_JUSTIF : u"Demande de justification",
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'
87 }
88
89 #libellés états pour boutons
90 POSTE_ETATS_BOUTONS = {
91 POSTE_ETAT_DIRECTEUR_BUREAU : u"Envoyer au directeur de bureau",
92 POSTE_ETAT_SERVICE_UTILISATEURS : u"Envoyer au service utilisateurs",
93 POSTE_ETAT_ADMINISTRATEUR : u"Envoyer à l'adminstrateur",
94 POSTE_ETAT_DRH_CONTROLE : u"Envoyer à la DRH (validation)",
95 POSTE_ETAT_DEMANDE_MODIF : u"Envoyer une demande de modification",
96 POSTE_ETAT_ACCIOR : u"Envoyer à l'ACCIOR",
97 POSTE_ETAT_ABF : u"Envoyer à l'ABF",
98 POSTE_ETAT_HAUTE_DIRECTION : u"Envoyer à la haute direction",
99 POSTE_ETAT_DEMANDE_JUSTIF : u"Envoyer une demande de justification",
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'
103 }
104
105 # définition du worflow séquentiel
106 POSTE_ACTIONS = {
107 POSTE_ACTION_ENVOYER_BROUILLON : {
108 'nom' : u'Créer',
109 'etat_initial' : None,
110 'etat_final' : POSTE_ETAT_BROUILLON,
111 },
112 POSTE_ACTION_ENVOYER_ADMINISTRATEUR : {
113 'nom' : u'Envoyer',
114 'etat_initial' : (POSTE_ETAT_BROUILLON,),
115 'etat_final' : POSTE_ETAT_ADMINISTRATEUR,
116 },
117 POSTE_ACTION_ENVOYER_SRV_UTILISATEURS : {
118 'nom' : u'Envoyer',
119 'etat_initial' : (POSTE_ETAT_ADMINISTRATEUR,),
120 'etat_final' : POSTE_ETAT_SERVICE_UTILISATEURS,
121 },
122 POSTE_ACTION_ENVOYER_DIRECTEUR_BUREAU : {
123 'nom' : u'Envoyer',
124 'etat_initial' : (POSTE_ETAT_ADMINISTRATEUR,),
125 'etat_final' : POSTE_ETAT_DIRECTEUR_BUREAU,
126 },
127 POSTE_ACTION_ENVOYER_DRH_CONTROLE : {
128 'nom' : u'Envoyer',
129 'etat_initial' : (POSTE_ETAT_ADMINISTRATEUR, POSTE_ETAT_DIRECTEUR_BUREAU, POSTE_ETAT_SERVICE_UTILISATEURS),
130 'etat_final' : POSTE_ETAT_DRH_CONTROLE,
131 },
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 },
142 POSTE_ACTION_ENVOYER_ACCIOR : {
143 'nom' : u'Envoyer',
144 'etat_initial' : (POSTE_ETAT_DRH_CONTROLE,),
145 'etat_final' : POSTE_ETAT_ACCIOR,
146 },
147 POSTE_ACTION_ENVOYER_ABF : {
148 'nom' : u'Envoyer',
149 'etat_initial' : (POSTE_ETAT_ACCIOR,),
150 'etat_final' : POSTE_ETAT_ABF,
151 },
152 POSTE_ACTION_ENVOYER_HAUTE_DIRECTION : {
153 'nom' : u'Envoyer',
154 'etat_initial' : (POSTE_ETAT_ABF,),
155 'etat_final' : POSTE_ETAT_HAUTE_DIRECTION,
156 },
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 },
167 POSTE_ACTION_ENVOYER_REGION_FINALISATION : {
168 'nom' : u'Envoyer',
169 'etat_initial' : (POSTE_ETAT_HAUTE_DIRECTION,),
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,),
175 'etat_final' : POSTE_ETAT_DRH_FINALISATION,
176 },
177 POSTE_ACTION_FINALISER : {
178 'nom' : u'Finaliser',
179 'etat_initial' : (POSTE_ETAT_DRH_FINALISATION,),
180 'etat_final' : POSTE_ETAT_FINALISE
181 },
182 }
183
184
185 class PosteWorkflow(WorkflowMixin):
186 etat_initial = POSTE_ETAT_BROUILLON
187 etats = POSTE_ETATS
188 actions = POSTE_ACTIONS
189
190 class Meta:
191 abstract = True
192
193 def acces_directeur_bureau(self, action, request):
194 user_groups = request.user.groups.all()
195 if is_user_dans_services_centraux(request.user) and grp_drh not in user_groups:
196 return False
197 for g in user_groups:
198 if g in (grp_administrateurs, grp_drh,):
199 return True
200 return False
201
202 def acces_administrateur(self, action, request):
203 for g in request.user.groups.all():
204 if g in (grp_correspondants_rh, grp_drh,):
205 return True
206 return False
207
208 def acces_drh_controle(self, action, request):
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()
216
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
225 def acces_accior(self, action, request):
226 for g in request.user.groups.all():
227 if g in (grp_drh, ):
228 return True
229 return False
230
231 def acces_abf(self, action, request):
232 for g in request.user.groups.all():
233 if g in (grp_accior, grp_drh, ):
234 return True
235 return False
236
237 def acces_haute_direction(self, action, request):
238 for g in request.user.groups.all():
239 if g in (grp_abf, grp_drh, ):
240 return True
241 return False
242
243 def acces_region_finalisation(self, action, request):
244 for g in request.user.groups.all():
245 if g in (grp_haute_direction, grp_drh,):
246 return True
247
248 def acces_drh_finalisation(self, action, request):
249 for g in request.user.groups.all():
250 if g in (grp_drh,):
251 return True
252 return False
253
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):
259 for g in request.user.groups.all():
260 if g in (grp_administrateurs, grp_drh,):
261 return True
262 return False
263
264 def acces_retour_demande_justif(self, action, request):
265 for g in request.user.groups.all():
266 if g in (grp_drh, ):
267 return True
268 return False
269
270 def acces_finaliser(self, action, request):
271 for g in request.user.groups.all():
272 if g in (grp_drh, ):
273 return True
274 return False
275
276
277 #codes actions
278 DOSSIER_ETAT_BROUILLON = POSTE_ETAT_BROUILLON
279 DOSSIER_ETAT_ADMINISTRATEUR = POSTE_ETAT_ADMINISTRATEUR
280 DOSSIER_ETAT_DIRECTEUR_BUREAU = POSTE_ETAT_DIRECTEUR_BUREAU
281 DOSSIER_ETAT_SERVICE_UTILISATEURS = POSTE_ETAT_SERVICE_UTILISATEURS
282 DOSSIER_ETAT_DRH_CONTROLE = POSTE_ETAT_DRH_CONTROLE
283 DOSSIER_ETAT_DEMANDE_MODIF = POSTE_ETAT_DEMANDE_MODIF
284 DOSSIER_ETAT_ACCIOR = POSTE_ETAT_ACCIOR
285 DOSSIER_ETAT_ABF = POSTE_ETAT_ABF
286 DOSSIER_ETAT_HAUTE_DIRECTION = POSTE_ETAT_HAUTE_DIRECTION
287 DOSSIER_ETAT_DEMANDE_JUSTIF = POSTE_ETAT_DEMANDE_JUSTIF
288 DOSSIER_ETAT_REGION_FINALISATION = POSTE_ETAT_REGION_FINALISATION
289 DOSSIER_ETAT_DRH_FINALISATION = POSTE_ETAT_DRH_FINALISATION
290 DOSSIER_ETAT_FINALISE = POSTE_ETAT_FINALISE
291
292 class DossierWorkflow(PosteWorkflow):
293
294 class Meta:
295 abstract = True
296
297
298 MAP_GROUPE_ETATS_A_FAIRE = {
299 grp_correspondants_rh : (POSTE_ETAT_BROUILLON, DOSSIER_ETAT_BROUILLON, ),
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 ),
309 grp_directeurs_bureau : (POSTE_ETAT_DIRECTEUR_BUREAU, DOSSIER_ETAT_DIRECTEUR_BUREAU, ),
310 grp_drh : (POSTE_ETAT_DRH_CONTROLE, POSTE_ETAT_DRH_FINALISATION,
311 DOSSIER_ETAT_DRH_CONTROLE, DOSSIER_ETAT_DRH_FINALISATION,
312 POSTE_ETAT_DEMANDE_JUSTIF, DOSSIER_ETAT_DEMANDE_JUSTIF),
313 grp_accior : (POSTE_ETAT_ACCIOR, DOSSIER_ETAT_ACCIOR, ),
314 grp_abf : (POSTE_ETAT_ABF, DOSSIER_ETAT_ABF, ),
315 grp_haute_direction : (POSTE_ETAT_HAUTE_DIRECTION, DOSSIER_ETAT_HAUTE_DIRECTION, ),
316 }
317
318
319 ETATS_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,
330 )
331
332 ETATS_VALIDE = (DOSSIER_ETAT_REGION_FINALISATION, DOSSIER_ETAT_DRH_FINALISATION,
333 DOSSIER_ETAT_FINALISE)