import avec project.
[auf_rh_dae.git] / project / workflow.py
CommitLineData
09aa8374
OL
1# -*- encoding: utf-8 -*-
2
3from django.contrib.auth.models import Group
4from auf.django.workflow.models import WorkflowMixin
75f0e87b 5from project.utils import is_user_dans_services_centraux, is_user_dans_region
09aa8374
OL
6
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
19# Groupes impliqués dans le Worflow
20grp_correspondants_rh = safe_create_groupe(name='Correspondants RH')
21grp_administrateurs = safe_create_groupe(name='Administrateurs')
22grp_directeurs_bureau = safe_create_groupe(name='Directeurs de bureau')
23grp_drh = safe_create_groupe(name='DRH')
24grp_drh2 = safe_create_groupe(name='DRH-2')
25grp_accior = safe_create_groupe(name='ACCIOR')
26grp_abf = safe_create_groupe(name='ABF')
27grp_haute_direction = safe_create_groupe(name='Haute direction')
28grp_service_utilisateurs = safe_create_groupe(name='Service utilisateurs')
29
30dae_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
43POSTE_ETAT_BROUILLON = 'BROUILLON'
44POSTE_ETAT_ADMINISTRATEUR = 'ADMINISTRATEUR'
45POSTE_ETAT_DIRECTEUR_BUREAU = 'DIRECTEUR_BUREAU'
46POSTE_ETAT_SERVICE_UTILISATEURS = 'SRV_UTILISATEURS'
47POSTE_ETAT_DRH_CONTROLE = 'DRH_CONTROLE'
48POSTE_ETAT_DRH_2 = 'DRH_2'
49POSTE_ETAT_DEMANDE_MODIF = 'DEMANDE_MODIF'
50POSTE_ETAT_ACCIOR = 'ACCIOR'
51POSTE_ETAT_ABF = 'ABF'
52POSTE_ETAT_HAUTE_DIRECTION = 'HAUTE_DIRECTION'
53POSTE_ETAT_DEMANDE_JUSTIF = 'DEMANDE_JUSTIF'
54POSTE_ETAT_REGION_FINALISATION = 'REGION_FINALISATION'
55POSTE_ETAT_DRH_FINALISATION = 'DRH_FINALISATION'
56POSTE_ETAT_FINALISE = 'FINALISE'
57
58#codes actions
59POSTE_ACTION_ENVOYER_BROUILLON = POSTE_ETAT_BROUILLON
60POSTE_ACTION_ENVOYER_ADMINISTRATEUR = POSTE_ETAT_ADMINISTRATEUR
61POSTE_ACTION_ENVOYER_DIRECTEUR_BUREAU = POSTE_ETAT_DIRECTEUR_BUREAU
62POSTE_ACTION_ENVOYER_SRV_UTILISATEURS = POSTE_ETAT_SERVICE_UTILISATEURS
63POSTE_ACTION_ENVOYER_DRH_CONTROLE = POSTE_ETAT_DRH_CONTROLE
64POSTE_ACTION_ENVOYER_DRH_2 = POSTE_ETAT_DRH_2
65POSTE_ACTION_DEMANDE_MODIF = POSTE_ETAT_DEMANDE_MODIF
66POSTE_ACTION_RETOUR_DEMANDE_MODIF = 'RETOUR_DEMANDE_MODIF'
67POSTE_ACTION_ENVOYER_ACCIOR = POSTE_ETAT_ACCIOR
68POSTE_ACTION_ENVOYER_ABF = POSTE_ETAT_ABF
69POSTE_ACTION_ENVOYER_HAUTE_DIRECTION = POSTE_ETAT_HAUTE_DIRECTION
70POSTE_ACTION_DEMANDE_JUSTIF = POSTE_ETAT_DEMANDE_JUSTIF
71POSTE_ACTION_RETOUR_DEMANDE_JUSTIF = 'RETOUR_DEMANDE_JUSTIF'
72POSTE_ACTION_ENVOYER_REGION_FINALISATION = POSTE_ETAT_REGION_FINALISATION
73POSTE_ACTION_ENVOYER_DRH_FINALISATION = POSTE_ETAT_DRH_FINALISATION
74POSTE_ACTION_FINALISER = 'FINALISER'
75
76#libellés états
77POSTE_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
95POSTE_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
112POSTE_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
196class PosteWorkflow(WorkflowMixin):
197 etat_initial = POSTE_ETAT_BROUILLON
198 etats = POSTE_ETATS
199 actions = POSTE_ACTIONS
200
201 class Meta:
202 abstract = True
203 app_label = "rh"
204
205 def acces_directeur_bureau(self, action, request):
206 user_groups = request.user.groups.all()
207 return grp_drh in user_groups or grp_drh2 in user_groups or \
208 (is_user_dans_services_centraux(request.user) and
209 grp_administrateurs in user_groups)
210
211 def acces_administrateur(self, action, request):
212 user_groups = request.user.groups.all()
213 return grp_correspondants_rh in user_groups or grp_drh in user_groups or \
214 grp_drh2 in user_groups
215
216 def acces_drh_controle(self, action, request):
217 user_groups = request.user.groups.all()
218 return grp_directeurs_bureau in user_groups or \
219 grp_service_utilisateurs in user_groups or \
220 grp_drh in user_groups or grp_drh2 in user_groups or \
221 (grp_administrateurs in user_groups and
222 (action == POSTE_ACTION_RETOUR_DEMANDE_MODIF or
223 is_user_dans_region(request.user)))
224
225 def acces_drh_2(self, action, request):
226 user_groups = request.user.groups.all()
227 return grp_drh in user_groups
228
229 def acces_demande_modif(self, action, request):
230 user_groups = request.user.groups.all()
231 return grp_drh in user_groups or grp_drh2 in user_groups
232
233 def acces_srv_utilisateurs(self, action, request):
234 if not is_user_dans_services_centraux(request.user):
235 return False
236 user_groups = request.user.groups.all()
237 return grp_administrateurs in user_groups or grp_drh in user_groups or \
238 grp_drh2 in user_groups
239
240 def acces_accior(self, action, request):
241 user_groups = request.user.groups.all()
242 return grp_drh in user_groups or grp_drh2 in user_groups
243
244 def acces_abf(self, action, request):
245 user_groups = request.user.groups.all()
246 return grp_accior in user_groups or grp_drh in user_groups or grp_drh2 in user_groups
247
248 def acces_haute_direction(self, action, request):
249 user_groups = request.user.groups.all()
250 return grp_abf in user_groups or grp_drh in user_groups or grp_drh2 in user_groups
251
252 def acces_region_finalisation(self, action, request):
253 user_groups = request.user.groups.all()
254 return grp_haute_direction in user_groups or grp_drh in user_groups or \
255 grp_drh2 in user_groups
256
257 def acces_drh_finalisation(self, action, request):
258 user_groups = request.user.groups.all()
259 return grp_administrateurs in user_groups or \
260 grp_correspondants_rh in user_groups or \
261 grp_drh in user_groups or \
262 grp_drh2 in user_groups
263
264 def acces_demande_justif(self, action, request):
265 user_groups = request.user.groups.all()
266 return grp_haute_direction in user_groups or grp_drh in user_groups or \
267 grp_drh2 in user_groups
268
269 def acces_retour_demande_modif(self, action, request):
270 user_groups = request.user.groups.all()
271 return grp_administrateurs in user_groups or grp_drh in user_groups or \
272 grp_drh2 in user_groups
273
274 def acces_retour_demande_justif(self, action, request):
275 user_groups = request.user.groups.all()
276 return grp_drh in user_groups or grp_drh2 in user_groups
277
278 def acces_finaliser(self, action, request):
279 user_groups = request.user.groups.all()
280 return grp_drh in user_groups or grp_drh2 in user_groups
281
282
283#codes actions
284DOSSIER_ETAT_BROUILLON = POSTE_ETAT_BROUILLON
285DOSSIER_ETAT_ADMINISTRATEUR = POSTE_ETAT_ADMINISTRATEUR
286DOSSIER_ETAT_DIRECTEUR_BUREAU = POSTE_ETAT_DIRECTEUR_BUREAU
287DOSSIER_ETAT_SERVICE_UTILISATEURS = POSTE_ETAT_SERVICE_UTILISATEURS
288DOSSIER_ETAT_DRH_CONTROLE = POSTE_ETAT_DRH_CONTROLE
289DOSSIER_ETAT_DRH_2 = POSTE_ETAT_DRH_2
290DOSSIER_ETAT_DEMANDE_MODIF = POSTE_ETAT_DEMANDE_MODIF
291DOSSIER_ETAT_ACCIOR = POSTE_ETAT_ACCIOR
292DOSSIER_ETAT_ABF = POSTE_ETAT_ABF
293DOSSIER_ETAT_HAUTE_DIRECTION = POSTE_ETAT_HAUTE_DIRECTION
294DOSSIER_ETAT_DEMANDE_JUSTIF = POSTE_ETAT_DEMANDE_JUSTIF
295DOSSIER_ETAT_REGION_FINALISATION = POSTE_ETAT_REGION_FINALISATION
296DOSSIER_ETAT_DRH_FINALISATION = POSTE_ETAT_DRH_FINALISATION
297DOSSIER_ETAT_FINALISE = POSTE_ETAT_FINALISE
298
299class DossierWorkflow(PosteWorkflow):
300
301 class Meta:
302 abstract = True
303 app_label = "rh"
304
305
306MAP_GROUPE_ETATS_A_FAIRE = {
307 grp_correspondants_rh : (POSTE_ETAT_BROUILLON, DOSSIER_ETAT_BROUILLON,
308 POSTE_ETAT_REGION_FINALISATION,
309 DOSSIER_ETAT_REGION_FINALISATION),
310 grp_service_utilisateurs : (POSTE_ETAT_SERVICE_UTILISATEURS,
311 DOSSIER_ETAT_SERVICE_UTILISATEURS,),
312 grp_administrateurs : (POSTE_ETAT_ADMINISTRATEUR,
313 DOSSIER_ETAT_ADMINISTRATEUR,
314 POSTE_ETAT_DEMANDE_MODIF,
315 DOSSIER_ETAT_DEMANDE_MODIF,
316 POSTE_ETAT_REGION_FINALISATION,
317 DOSSIER_ETAT_REGION_FINALISATION,
318 ),
319 grp_directeurs_bureau : (POSTE_ETAT_DIRECTEUR_BUREAU, DOSSIER_ETAT_DIRECTEUR_BUREAU, ),
320 grp_drh : (POSTE_ETAT_DRH_CONTROLE, POSTE_ETAT_DRH_FINALISATION,
321 DOSSIER_ETAT_DRH_CONTROLE, DOSSIER_ETAT_DRH_FINALISATION,
322 POSTE_ETAT_DEMANDE_JUSTIF, DOSSIER_ETAT_DEMANDE_JUSTIF),
323 grp_drh2 : (POSTE_ETAT_DRH_2, DOSSIER_ETAT_DRH_2),
324 grp_accior : (POSTE_ETAT_ACCIOR, DOSSIER_ETAT_ACCIOR, ),
325 grp_abf : (POSTE_ETAT_ABF, DOSSIER_ETAT_ABF, ),
326 grp_haute_direction : (POSTE_ETAT_HAUTE_DIRECTION, DOSSIER_ETAT_HAUTE_DIRECTION, ),
327}
328
329
330ETATS_EDITABLE = (POSTE_ETAT_BROUILLON, POSTE_ETAT_ADMINISTRATEUR,
331 POSTE_ETAT_DRH_CONTROLE, POSTE_ETAT_DRH_2,
332 POSTE_ETAT_DIRECTEUR_BUREAU,
333 POSTE_ETAT_SERVICE_UTILISATEURS, POSTE_ETAT_DEMANDE_MODIF,
334 POSTE_ETAT_DEMANDE_JUSTIF, DOSSIER_ETAT_BROUILLON,
335 DOSSIER_ETAT_ADMINISTRATEUR, DOSSIER_ETAT_DRH_CONTROLE,
336 DOSSIER_ETAT_DRH_2, DOSSIER_ETAT_DIRECTEUR_BUREAU,
337 DOSSIER_ETAT_SERVICE_UTILISATEURS,
338 DOSSIER_ETAT_DEMANDE_MODIF, DOSSIER_ETAT_DEMANDE_JUSTIF,
339)
340
341ETATS_VALIDE = (DOSSIER_ETAT_REGION_FINALISATION, DOSSIER_ETAT_DRH_FINALISATION,
342 DOSSIER_ETAT_FINALISE)