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