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