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