dae+rh
[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_drh2 = safe_create_groupe(name='DRH-2')
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_drh2,
36 grp_accior,
37 grp_abf,
38 grp_haute_direction,
39 grp_service_utilisateurs,
40 )
41
42 # codes états
43 POSTE_ETAT_BROUILLON = 'BROUILLON'
44 POSTE_ETAT_ADMINISTRATEUR = 'ADMINISTRATEUR'
45 POSTE_ETAT_DIRECTEUR_BUREAU = 'DIRECTEUR_BUREAU'
46 POSTE_ETAT_SERVICE_UTILISATEURS = 'SRV_UTILISATEURS'
47 POSTE_ETAT_DRH_CONTROLE = 'DRH_CONTROLE'
48 POSTE_ETAT_DRH_2 = 'DRH_2'
49 POSTE_ETAT_DEMANDE_MODIF = 'DEMANDE_MODIF'
50 POSTE_ETAT_ACCIOR = 'ACCIOR'
51 POSTE_ETAT_ABF = 'ABF'
52 POSTE_ETAT_HAUTE_DIRECTION = 'HAUTE_DIRECTION'
53 POSTE_ETAT_DEMANDE_JUSTIF = 'DEMANDE_JUSTIF'
54 POSTE_ETAT_REGION_FINALISATION = 'REGION_FINALISATION'
55 POSTE_ETAT_DRH_FINALISATION = 'DRH_FINALISATION'
56 POSTE_ETAT_FINALISE = 'FINALISE'
57
58 #codes actions
59 POSTE_ACTION_ENVOYER_BROUILLON = POSTE_ETAT_BROUILLON
60 POSTE_ACTION_ENVOYER_ADMINISTRATEUR = POSTE_ETAT_ADMINISTRATEUR
61 POSTE_ACTION_ENVOYER_DIRECTEUR_BUREAU = POSTE_ETAT_DIRECTEUR_BUREAU
62 POSTE_ACTION_ENVOYER_SRV_UTILISATEURS = POSTE_ETAT_SERVICE_UTILISATEURS
63 POSTE_ACTION_ENVOYER_DRH_CONTROLE = POSTE_ETAT_DRH_CONTROLE
64 POSTE_ACTION_ENVOYER_DRH_2 = POSTE_ETAT_DRH_2
65 POSTE_ACTION_DEMANDE_MODIF = POSTE_ETAT_DEMANDE_MODIF
66 POSTE_ACTION_RETOUR_DEMANDE_MODIF = 'RETOUR_DEMANDE_MODIF'
67 POSTE_ACTION_ENVOYER_ACCIOR = POSTE_ETAT_ACCIOR
68 POSTE_ACTION_ENVOYER_ABF = POSTE_ETAT_ABF
69 POSTE_ACTION_ENVOYER_HAUTE_DIRECTION = POSTE_ETAT_HAUTE_DIRECTION
70 POSTE_ACTION_DEMANDE_JUSTIF = POSTE_ETAT_DEMANDE_JUSTIF
71 POSTE_ACTION_RETOUR_DEMANDE_JUSTIF = 'RETOUR_DEMANDE_JUSTIF'
72 POSTE_ACTION_ENVOYER_REGION_FINALISATION = POSTE_ETAT_REGION_FINALISATION
73 POSTE_ACTION_ENVOYER_DRH_FINALISATION = POSTE_ETAT_DRH_FINALISATION
74 POSTE_ACTION_FINALISER = 'FINALISER'
75
76 #libellés états
77 POSTE_ETATS = {
78 POSTE_ETAT_BROUILLON : u"En rédaction",
79 POSTE_ETAT_ADMINISTRATEUR : u"Validation de l'administrateur",
80 POSTE_ETAT_DIRECTEUR_BUREAU : u"Directeur de bureau",
81 POSTE_ETAT_SERVICE_UTILISATEURS : u"Service utilisateurs",
82 POSTE_ETAT_DRH_CONTROLE : u"Validation DRH",
83 POSTE_ETAT_DRH_2 : u"Validation DRH 2",
84 POSTE_ETAT_DEMANDE_MODIF : u"Demande de modification",
85 POSTE_ETAT_ACCIOR : u"ACCIOR",
86 POSTE_ETAT_ABF : u"ABF",
87 POSTE_ETAT_HAUTE_DIRECTION : u"Validation : Secrétaire général / Recteur",
88 POSTE_ETAT_DEMANDE_JUSTIF : u"Demande de justification",
89 POSTE_ETAT_REGION_FINALISATION : u'Retour à la région',
90 POSTE_ETAT_DRH_FINALISATION : u'Retour à la DRH',
91 POSTE_ETAT_FINALISE : u'Finalisée'
92 }
93
94 #libellés états pour boutons
95 POSTE_ETATS_BOUTONS = {
96 POSTE_ETAT_DIRECTEUR_BUREAU : u"Envoyer au directeur de bureau",
97 POSTE_ETAT_SERVICE_UTILISATEURS : u"Envoyer au service utilisateurs",
98 POSTE_ETAT_ADMINISTRATEUR : u"Envoyer à l'adminstrateur",
99 POSTE_ETAT_DRH_CONTROLE : u"Envoyer à la DRH (validation)",
100 POSTE_ETAT_DRH_2 : u"Envoyer à DRH 2",
101 POSTE_ETAT_DEMANDE_MODIF : u"Envoyer une demande de modification",
102 POSTE_ETAT_ACCIOR : u"Envoyer à l'ACCIOR",
103 POSTE_ETAT_ABF : u"Envoyer à l'ABF",
104 POSTE_ETAT_HAUTE_DIRECTION : u"Envoyer à la haute direction",
105 POSTE_ETAT_DEMANDE_JUSTIF : u"Envoyer une demande de justification",
106 POSTE_ETAT_REGION_FINALISATION : u"Retourner à la région pour finalisation",
107 POSTE_ETAT_DRH_FINALISATION : u'Retourner à la DRH pour finalisation',
108 POSTE_ETAT_FINALISE : u'Finaliser'
109 }
110
111 # définition du worflow séquentiel
112 POSTE_ACTIONS = {
113 POSTE_ACTION_ENVOYER_BROUILLON : {
114 'nom' : u'Créer',
115 'etat_initial' : None,
116 'etat_final' : POSTE_ETAT_BROUILLON,
117 },
118 POSTE_ACTION_ENVOYER_ADMINISTRATEUR : {
119 'nom' : u'Envoyer',
120 'etat_initial' : (POSTE_ETAT_BROUILLON,),
121 'etat_final' : POSTE_ETAT_ADMINISTRATEUR,
122 },
123 POSTE_ACTION_ENVOYER_SRV_UTILISATEURS : {
124 'nom' : u'Envoyer',
125 'etat_initial' : (POSTE_ETAT_ADMINISTRATEUR,),
126 'etat_final' : POSTE_ETAT_SERVICE_UTILISATEURS,
127 },
128 POSTE_ACTION_ENVOYER_DIRECTEUR_BUREAU : {
129 'nom' : u'Envoyer',
130 'etat_initial' : (POSTE_ETAT_ADMINISTRATEUR,),
131 'etat_final' : POSTE_ETAT_DIRECTEUR_BUREAU,
132 },
133 POSTE_ACTION_ENVOYER_DRH_CONTROLE : {
134 'nom' : u'Envoyer',
135 'etat_initial' : (POSTE_ETAT_ADMINISTRATEUR, POSTE_ETAT_DIRECTEUR_BUREAU, POSTE_ETAT_SERVICE_UTILISATEURS),
136 'etat_final' : POSTE_ETAT_DRH_CONTROLE,
137 },
138 POSTE_ACTION_ENVOYER_DRH_2 : {
139 'nom' : u'Envoyer',
140 'etat_initial' : (POSTE_ETAT_DRH_CONTROLE,),
141 'etat_final' : POSTE_ETAT_DRH_2,
142 },
143 POSTE_ACTION_DEMANDE_MODIF : {
144 'nom' : u'Envoyer',
145 'etat_initial' : (POSTE_ETAT_DRH_CONTROLE, POSTE_ETAT_DRH_2),
146 'etat_final': POSTE_ETAT_DEMANDE_MODIF,
147 },
148 POSTE_ACTION_RETOUR_DEMANDE_MODIF : {
149 'nom': u'Retourner',
150 'etat_initial': (POSTE_ETAT_DEMANDE_MODIF,),
151 'etat_final': POSTE_ETAT_DRH_CONTROLE,
152 },
153 POSTE_ACTION_ENVOYER_ACCIOR : {
154 'nom' : u'Envoyer',
155 'etat_initial' : (POSTE_ETAT_DRH_2,),
156 'etat_final' : POSTE_ETAT_ACCIOR,
157 },
158 POSTE_ACTION_ENVOYER_ABF : {
159 'nom' : u'Envoyer',
160 'etat_initial' : (POSTE_ETAT_ACCIOR,),
161 'etat_final' : POSTE_ETAT_ABF,
162 },
163 POSTE_ACTION_ENVOYER_HAUTE_DIRECTION : {
164 'nom' : u'Envoyer',
165 'etat_initial' : (POSTE_ETAT_ABF,),
166 'etat_final' : POSTE_ETAT_HAUTE_DIRECTION,
167 },
168 POSTE_ACTION_DEMANDE_JUSTIF : {
169 'nom' : u'Envoyer',
170 'etat_initial' : (POSTE_ETAT_HAUTE_DIRECTION,),
171 'etat_final': POSTE_ETAT_DEMANDE_JUSTIF,
172 },
173 POSTE_ACTION_RETOUR_DEMANDE_JUSTIF : {
174 'nom' : u'Envoyer',
175 'etat_initial' : (POSTE_ETAT_DEMANDE_JUSTIF,),
176 'etat_final': POSTE_ETAT_HAUTE_DIRECTION,
177 },
178 POSTE_ACTION_ENVOYER_REGION_FINALISATION : {
179 'nom' : u'Envoyer',
180 'etat_initial' : (POSTE_ETAT_HAUTE_DIRECTION,),
181 'etat_final' : POSTE_ETAT_REGION_FINALISATION
182 },
183 POSTE_ACTION_ENVOYER_DRH_FINALISATION : {
184 'nom' : u'Envoyer',
185 'etat_initial' : (POSTE_ETAT_REGION_FINALISATION,),
186 'etat_final' : POSTE_ETAT_DRH_FINALISATION,
187 },
188 POSTE_ACTION_FINALISER : {
189 'nom' : u'Finaliser',
190 'etat_initial' : (POSTE_ETAT_DRH_FINALISATION,),
191 'etat_final' : POSTE_ETAT_FINALISE
192 },
193 }
194
195
196 class PosteWorkflow(WorkflowMixin):
197 etat_initial = POSTE_ETAT_BROUILLON
198 etats = POSTE_ETATS
199 actions = POSTE_ACTIONS
200
201 class Meta:
202 abstract = True
203
204 def acces_directeur_bureau(self, action, request):
205 user_groups = request.user.groups.all()
206 return grp_drh in user_groups or grp_drh2 in user_groups or \
207 (is_user_dans_services_centraux(request.user) and
208 grp_administrateurs in user_groups)
209
210 def acces_administrateur(self, action, request):
211 user_groups = request.user.groups.all()
212 return grp_correspondants_rh in user_groups or grp_drh in user_groups or \
213 grp_drh2 in user_groups
214
215 def acces_drh_controle(self, action, request):
216 user_groups = request.user.groups.all()
217 return grp_directeurs_bureau in user_groups or \
218 grp_service_utilisateurs in user_groups or \
219 grp_drh in user_groups or grp_drh2 in user_groups or \
220 (grp_administrateurs in user_groups and
221 (action == POSTE_ACTION_RETOUR_DEMANDE_MODIF or
222 is_user_dans_region(request.user)))
223
224 def acces_drh_2(self, action, request):
225 user_groups = request.user.groups.all()
226 return grp_drh in user_groups
227
228 def acces_demande_modif(self, action, request):
229 user_groups = request.user.groups.all()
230 return grp_drh in user_groups or grp_drh2 in user_groups
231
232 def acces_srv_utilisateurs(self, action, request):
233 if not is_user_dans_services_centraux(request.user):
234 return False
235 user_groups = request.user.groups.all()
236 return grp_administrateurs in user_groups or grp_drh in user_groups or \
237 grp_drh2 in user_groups
238
239 def acces_accior(self, action, request):
240 user_groups = request.user.groups.all()
241 return grp_drh in user_groups or grp_drh2 in user_groups
242
243 def acces_abf(self, action, request):
244 user_groups = request.user.groups.all()
245 return grp_accior in user_groups or grp_drh in user_groups or grp_drh2 in user_groups
246
247 def acces_haute_direction(self, action, request):
248 user_groups = request.user.groups.all()
249 return grp_abf in user_groups or grp_drh in user_groups or grp_drh2 in user_groups
250
251 def acces_region_finalisation(self, action, request):
252 user_groups = request.user.groups.all()
253 return grp_haute_direction in user_groups or grp_drh in user_groups or \
254 grp_drh2 in user_groups
255
256 def acces_drh_finalisation(self, action, request):
257 user_groups = request.user.groups.all()
258 return grp_administrateurs in user_groups or \
259 grp_correspondants_rh in user_groups or \
260 grp_drh in user_groups or \
261 grp_drh2 in user_groups
262
263 def acces_demande_justif(self, action, request):
264 user_groups = request.user.groups.all()
265 return grp_haute_direction in user_groups or grp_drh in user_groups or \
266 grp_drh2 in user_groups
267
268 def acces_retour_demande_modif(self, action, request):
269 user_groups = request.user.groups.all()
270 return grp_administrateurs in user_groups or grp_drh in user_groups or \
271 grp_drh2 in user_groups
272
273 def acces_retour_demande_justif(self, action, request):
274 user_groups = request.user.groups.all()
275 return grp_drh in user_groups or grp_drh2 in user_groups
276
277 def acces_finaliser(self, action, request):
278 user_groups = request.user.groups.all()
279 return grp_drh in user_groups or grp_drh2 in user_groups
280
281
282 #codes actions
283 DOSSIER_ETAT_BROUILLON = POSTE_ETAT_BROUILLON
284 DOSSIER_ETAT_ADMINISTRATEUR = POSTE_ETAT_ADMINISTRATEUR
285 DOSSIER_ETAT_DIRECTEUR_BUREAU = POSTE_ETAT_DIRECTEUR_BUREAU
286 DOSSIER_ETAT_SERVICE_UTILISATEURS = POSTE_ETAT_SERVICE_UTILISATEURS
287 DOSSIER_ETAT_DRH_CONTROLE = POSTE_ETAT_DRH_CONTROLE
288 DOSSIER_ETAT_DRH_2 = POSTE_ETAT_DRH_2
289 DOSSIER_ETAT_DEMANDE_MODIF = POSTE_ETAT_DEMANDE_MODIF
290 DOSSIER_ETAT_ACCIOR = POSTE_ETAT_ACCIOR
291 DOSSIER_ETAT_ABF = POSTE_ETAT_ABF
292 DOSSIER_ETAT_HAUTE_DIRECTION = POSTE_ETAT_HAUTE_DIRECTION
293 DOSSIER_ETAT_DEMANDE_JUSTIF = POSTE_ETAT_DEMANDE_JUSTIF
294 DOSSIER_ETAT_REGION_FINALISATION = POSTE_ETAT_REGION_FINALISATION
295 DOSSIER_ETAT_DRH_FINALISATION = POSTE_ETAT_DRH_FINALISATION
296 DOSSIER_ETAT_FINALISE = POSTE_ETAT_FINALISE
297
298 class DossierWorkflow(PosteWorkflow):
299
300 class Meta:
301 abstract = True
302
303
304 MAP_GROUPE_ETATS_A_FAIRE = {
305 grp_correspondants_rh : (POSTE_ETAT_BROUILLON, DOSSIER_ETAT_BROUILLON,
306 POSTE_ETAT_REGION_FINALISATION,
307 DOSSIER_ETAT_REGION_FINALISATION),
308 grp_service_utilisateurs : (POSTE_ETAT_SERVICE_UTILISATEURS,
309 DOSSIER_ETAT_SERVICE_UTILISATEURS,),
310 grp_administrateurs : (POSTE_ETAT_ADMINISTRATEUR,
311 DOSSIER_ETAT_ADMINISTRATEUR,
312 POSTE_ETAT_DEMANDE_MODIF,
313 DOSSIER_ETAT_DEMANDE_MODIF,
314 POSTE_ETAT_REGION_FINALISATION,
315 DOSSIER_ETAT_REGION_FINALISATION,
316 ),
317 grp_directeurs_bureau : (POSTE_ETAT_DIRECTEUR_BUREAU, DOSSIER_ETAT_DIRECTEUR_BUREAU, ),
318 grp_drh : (POSTE_ETAT_DRH_CONTROLE, POSTE_ETAT_DRH_FINALISATION,
319 DOSSIER_ETAT_DRH_CONTROLE, DOSSIER_ETAT_DRH_FINALISATION,
320 POSTE_ETAT_DEMANDE_JUSTIF, DOSSIER_ETAT_DEMANDE_JUSTIF),
321 grp_drh2 : (POSTE_ETAT_DRH_2, DOSSIER_ETAT_DRH_2),
322 grp_accior : (POSTE_ETAT_ACCIOR, DOSSIER_ETAT_ACCIOR, ),
323 grp_abf : (POSTE_ETAT_ABF, DOSSIER_ETAT_ABF, ),
324 grp_haute_direction : (POSTE_ETAT_HAUTE_DIRECTION, DOSSIER_ETAT_HAUTE_DIRECTION, ),
325 }
326
327
328 ETATS_EDITABLE = (POSTE_ETAT_BROUILLON, POSTE_ETAT_ADMINISTRATEUR,
329 POSTE_ETAT_DRH_CONTROLE, POSTE_ETAT_DRH_2,
330 POSTE_ETAT_DIRECTEUR_BUREAU,
331 POSTE_ETAT_SERVICE_UTILISATEURS, POSTE_ETAT_DEMANDE_MODIF,
332 POSTE_ETAT_DEMANDE_JUSTIF, DOSSIER_ETAT_BROUILLON,
333 DOSSIER_ETAT_ADMINISTRATEUR, DOSSIER_ETAT_DRH_CONTROLE,
334 DOSSIER_ETAT_DRH_2, DOSSIER_ETAT_DIRECTEUR_BUREAU,
335 DOSSIER_ETAT_SERVICE_UTILISATEURS,
336 DOSSIER_ETAT_DEMANDE_MODIF, DOSSIER_ETAT_DEMANDE_JUSTIF,
337 )
338
339 ETATS_VALIDE = (DOSSIER_ETAT_REGION_FINALISATION, DOSSIER_ETAT_DRH_FINALISATION,
340 DOSSIER_ETAT_FINALISE)