[#2243] Correction du workflow
[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 # TODO : Refactoring : utiliser project.lib.safe_create_groupe
14 try:
15 grp, created = Group.objects.get_or_create(name=name)
16 except:
17 return None
18 return grp
19
20 # Groupes impliqués dans le Worflow
21 grp_correspondants_rh = safe_create_groupe(name='Correspondants RH')
22 grp_administrateurs = safe_create_groupe(name='Administrateurs')
23 grp_directeurs_bureau = safe_create_groupe(name='Directeurs de bureau')
24 grp_drh = safe_create_groupe(name='DRH')
25 grp_accior = safe_create_groupe(name='ACCIOR')
26 grp_abf = safe_create_groupe(name='ABF')
27 grp_haute_direction = safe_create_groupe(name='Haute direction')
28 grp_service_utilisateurs = safe_create_groupe(name='Service utilisateurs')
29
30 dae_groupes = (
31 grp_correspondants_rh,
32 grp_administrateurs,
33 grp_directeurs_bureau,
34 grp_drh,
35 grp_accior,
36 grp_abf,
37 grp_haute_direction,
38 grp_service_utilisateurs,
39 )
40
41 # codes états
42 POSTE_ETAT_BROUILLON = 'BROUILLON'
43 POSTE_ETAT_ADMINISTRATEUR = 'ADMINISTRATEUR'
44 POSTE_ETAT_DIRECTEUR_BUREAU = 'DIRECTEUR_BUREAU'
45 POSTE_ETAT_SERVICE_UTILISATEURS = 'SRV_UTILISATEURS'
46 POSTE_ETAT_DRH_CONTROLE = 'DRH_CONTROLE'
47 POSTE_ETAT_DEMANDE_MODIF = 'DEMANDE_MODIF'
48 POSTE_ETAT_ACCIOR = 'ACCIOR'
49 POSTE_ETAT_ABF = 'ABF'
50 POSTE_ETAT_HAUTE_DIRECTION = 'HAUTE_DIRECTION'
51 POSTE_ETAT_DEMANDE_JUSTIF = 'DEMANDE_JUSTIF'
52 POSTE_ETAT_REGION_FINALISATION = 'REGION_FINALISATION'
53 POSTE_ETAT_DRH_FINALISATION = 'DRH_FINALISATION'
54 POSTE_ETAT_FINALISE = 'FINALISE'
55
56 #codes actions
57 POSTE_ACTION_ENVOYER_BROUILLON = POSTE_ETAT_BROUILLON
58 POSTE_ACTION_ENVOYER_ADMINISTRATEUR = POSTE_ETAT_ADMINISTRATEUR
59 POSTE_ACTION_ENVOYER_DIRECTEUR_BUREAU = POSTE_ETAT_DIRECTEUR_BUREAU
60 POSTE_ACTION_ENVOYER_SRV_UTILISATEURS = POSTE_ETAT_SERVICE_UTILISATEURS
61 POSTE_ACTION_ENVOYER_DRH_CONTROLE = POSTE_ETAT_DRH_CONTROLE
62 POSTE_ACTION_DEMANDE_MODIF = POSTE_ETAT_DEMANDE_MODIF
63 POSTE_ACTION_RETOUR_DEMANDE_MODIF = 'RETOUR_DEMANDE_MODIF'
64 POSTE_ACTION_ENVOYER_ACCIOR = POSTE_ETAT_ACCIOR
65 POSTE_ACTION_ENVOYER_ABF = POSTE_ETAT_ABF
66 POSTE_ACTION_ENVOYER_HAUTE_DIRECTION = POSTE_ETAT_HAUTE_DIRECTION
67 POSTE_ACTION_DEMANDE_JUSTIF = POSTE_ETAT_DEMANDE_JUSTIF
68 POSTE_ACTION_RETOUR_DEMANDE_JUSTIF = 'RETOUR_DEMANDE_JUSTIF'
69 POSTE_ACTION_ENVOYER_REGION_FINALISATION = POSTE_ETAT_REGION_FINALISATION
70 POSTE_ACTION_ENVOYER_DRH_FINALISATION = POSTE_ETAT_DRH_FINALISATION
71 POSTE_ACTION_FINALISER = 'FINALISER'
72
73 #libellés états
74 POSTE_ETATS = {
75 POSTE_ETAT_BROUILLON : u"En rédaction",
76 POSTE_ETAT_ADMINISTRATEUR : u"Validation de l'adminstrateur",
77 POSTE_ETAT_DIRECTEUR_BUREAU : u"Directeur de bureau",
78 POSTE_ETAT_SERVICE_UTILISATEURS : u"Service utilisateurs",
79 POSTE_ETAT_DRH_CONTROLE : u"Validation DRH",
80 POSTE_ETAT_DEMANDE_MODIF : u"Demande de modification",
81 POSTE_ETAT_ACCIOR : u"ACCIOR",
82 POSTE_ETAT_ABF : u"ABF",
83 POSTE_ETAT_HAUTE_DIRECTION : u"Validation : Secrétaire général / Recteur",
84 POSTE_ETAT_DEMANDE_JUSTIF : u"Demande de justification",
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'
88 }
89
90 #libellés états pour boutons
91 POSTE_ETATS_BOUTONS = {
92 POSTE_ETAT_DIRECTEUR_BUREAU : u"Envoyer au directeur de bureau",
93 POSTE_ETAT_SERVICE_UTILISATEURS : u"Envoyer au service utilisateurs",
94 POSTE_ETAT_ADMINISTRATEUR : u"Envoyer à l'adminstrateur",
95 POSTE_ETAT_DRH_CONTROLE : u"Envoyer à la DRH (validation)",
96 POSTE_ETAT_DEMANDE_MODIF : u"Envoyer une demande de modification",
97 POSTE_ETAT_ACCIOR : u"Envoyer à l'ACCIOR",
98 POSTE_ETAT_ABF : u"Envoyer à l'ABF",
99 POSTE_ETAT_HAUTE_DIRECTION : u"Envoyer à la haute direction",
100 POSTE_ETAT_DEMANDE_JUSTIF : u"Envoyer une demande de justification",
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'
104 }
105
106 # définition du worflow séquentiel
107 POSTE_ACTIONS = {
108 POSTE_ACTION_ENVOYER_BROUILLON : {
109 'nom' : u'Créer',
110 'etat_initial' : None,
111 'etat_final' : POSTE_ETAT_BROUILLON,
112 },
113 POSTE_ACTION_ENVOYER_ADMINISTRATEUR : {
114 'nom' : u'Envoyer',
115 'etat_initial' : (POSTE_ETAT_BROUILLON,),
116 'etat_final' : POSTE_ETAT_ADMINISTRATEUR,
117 },
118 POSTE_ACTION_ENVOYER_SRV_UTILISATEURS : {
119 'nom' : u'Envoyer',
120 'etat_initial' : (POSTE_ETAT_ADMINISTRATEUR,),
121 'etat_final' : POSTE_ETAT_SERVICE_UTILISATEURS,
122 },
123 POSTE_ACTION_ENVOYER_DIRECTEUR_BUREAU : {
124 'nom' : u'Envoyer',
125 'etat_initial' : (POSTE_ETAT_ADMINISTRATEUR,),
126 'etat_final' : POSTE_ETAT_DIRECTEUR_BUREAU,
127 },
128 POSTE_ACTION_ENVOYER_DRH_CONTROLE : {
129 'nom' : u'Envoyer',
130 'etat_initial' : (POSTE_ETAT_ADMINISTRATEUR, POSTE_ETAT_DIRECTEUR_BUREAU, POSTE_ETAT_SERVICE_UTILISATEURS),
131 'etat_final' : POSTE_ETAT_DRH_CONTROLE,
132 },
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 },
143 POSTE_ACTION_ENVOYER_ACCIOR : {
144 'nom' : u'Envoyer',
145 'etat_initial' : (POSTE_ETAT_DRH_CONTROLE,),
146 'etat_final' : POSTE_ETAT_ACCIOR,
147 },
148 POSTE_ACTION_ENVOYER_ABF : {
149 'nom' : u'Envoyer',
150 'etat_initial' : (POSTE_ETAT_ACCIOR,),
151 'etat_final' : POSTE_ETAT_ABF,
152 },
153 POSTE_ACTION_ENVOYER_HAUTE_DIRECTION : {
154 'nom' : u'Envoyer',
155 'etat_initial' : (POSTE_ETAT_ABF,),
156 'etat_final' : POSTE_ETAT_HAUTE_DIRECTION,
157 },
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 },
168 POSTE_ACTION_ENVOYER_REGION_FINALISATION : {
169 'nom' : u'Envoyer',
170 'etat_initial' : (POSTE_ETAT_HAUTE_DIRECTION,),
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,),
176 'etat_final' : POSTE_ETAT_DRH_FINALISATION,
177 },
178 POSTE_ACTION_FINALISER : {
179 'nom' : u'Finaliser',
180 'etat_initial' : (POSTE_ETAT_DRH_FINALISATION,),
181 'etat_final' : POSTE_ETAT_FINALISE
182 },
183 }
184
185
186 class PosteWorkflow(WorkflowMixin):
187 etat_initial = POSTE_ETAT_BROUILLON
188 etats = POSTE_ETATS
189 actions = POSTE_ACTIONS
190
191 class Meta:
192 abstract = True
193
194 def acces_directeur_bureau(self, action, request):
195 if is_user_dans_services_centraux(request.user):
196 return False
197 for g in request.user.groups.all():
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 user_groups:
245 if g in (grp_administrateurs, grp_drh,):
246 return True
247
248 def acces_drh_finalisation(self, action, request):
249 return self.acces_administrateur
250
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
261 def acces_finaliser(self, action, request):
262 return self.acces_drh_finalisation(action, request)
263
264
265 #codes actions
266 DOSSIER_ETAT_BROUILLON = POSTE_ETAT_BROUILLON
267 DOSSIER_ETAT_ADMINISTRATEUR = POSTE_ETAT_ADMINISTRATEUR
268 DOSSIER_ETAT_DIRECTEUR_BUREAU = POSTE_ETAT_DIRECTEUR_BUREAU
269 DOSSIER_ETAT_SERVICE_UTILISATEURS = POSTE_ETAT_SERVICE_UTILISATEURS
270 DOSSIER_ETAT_DRH_CONTROLE = POSTE_ETAT_DRH_CONTROLE
271 DOSSIER_ETAT_DEMANDE_MODIF = POSTE_ETAT_DEMANDE_MODIF
272 DOSSIER_ETAT_ACCIOR = POSTE_ETAT_ACCIOR
273 DOSSIER_ETAT_ABF = POSTE_ETAT_ABF
274 DOSSIER_ETAT_HAUTE_DIRECTION = POSTE_ETAT_HAUTE_DIRECTION
275 DOSSIER_ETAT_DEMANDE_JUSTIF = POSTE_ETAT_DEMANDE_JUSTIF
276 DOSSIER_ETAT_REGION_FINALISATION = POSTE_ETAT_REGION_FINALISATION
277 DOSSIER_ETAT_DRH_FINALISATION = POSTE_ETAT_DRH_FINALISATION
278 DOSSIER_ETAT_FINALISE = POSTE_ETAT_FINALISE
279
280 class DossierWorkflow(PosteWorkflow):
281
282 class Meta:
283 abstract = True
284
285
286 MAP_GROUPE_ETATS_A_FAIRE = {
287 grp_correspondants_rh : (POSTE_ETAT_BROUILLON, DOSSIER_ETAT_BROUILLON, ),
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 ),
297 grp_directeurs_bureau : (POSTE_ETAT_DIRECTEUR_BUREAU, DOSSIER_ETAT_DIRECTEUR_BUREAU, ),
298 grp_drh : (POSTE_ETAT_DRH_CONTROLE, POSTE_ETAT_DRH_FINALISATION,
299 DOSSIER_ETAT_DRH_CONTROLE, DOSSIER_ETAT_DRH_FINALISATION,
300 POSTE_ETAT_DEMANDE_JUSTIF, DOSSIER_ETAT_DEMANDE_JUSTIF),
301 grp_accior : (POSTE_ETAT_ACCIOR, DOSSIER_ETAT_ACCIOR, ),
302 grp_abf : (POSTE_ETAT_ABF, DOSSIER_ETAT_ABF, ),
303 grp_haute_direction : (POSTE_ETAT_HAUTE_DIRECTION, DOSSIER_ETAT_HAUTE_DIRECTION, ),
304 }
305
306
307 ETATS_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,
318 )
319
320 ETATS_VALIDE = (DOSSIER_ETAT_REGION_FINALISATION, DOSSIER_ETAT_DRH_FINALISATION,
321 DOSSIER_ETAT_FINALISE)