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