Typo
[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 """
13 try:
14 grp, created = Group.objects.get_or_create(name=name)
15 except:
16 return None
17 return grp
18
1b217058 19# Groupes impliqués dans le Worflow
d8cfc3d5 20grp_correspondants_rh = safe_create_groupe(name='Correspondants RH')
33b0b6af 21grp_administrateurs = safe_create_groupe(name='Administrateurs')
33b0b6af
OL
22grp_directeurs_bureau = safe_create_groupe(name='Directeurs de bureau')
23grp_drh = safe_create_groupe(name='DRH')
5aaaef6b 24grp_drh2 = safe_create_groupe(name='DRH-2')
d8cfc3d5 25grp_accior = safe_create_groupe(name='ACCIOR')
9a62bc55 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,
5aaaef6b 35 grp_drh2,
27d7babd 36 grp_accior,
9a62bc55 37 grp_abf,
27d7babd
OL
38 grp_haute_direction,
39 grp_service_utilisateurs,
40)
8fa94e8b
OL
41
42# codes états
43POSTE_ETAT_BROUILLON = 'BROUILLON'
1b217058 44POSTE_ETAT_ADMINISTRATEUR = 'ADMINISTRATEUR'
d8cfc3d5
OL
45POSTE_ETAT_DIRECTEUR_BUREAU = 'DIRECTEUR_BUREAU'
46POSTE_ETAT_SERVICE_UTILISATEURS = 'SRV_UTILISATEURS'
1b217058 47POSTE_ETAT_DRH_CONTROLE = 'DRH_CONTROLE'
5aaaef6b 48POSTE_ETAT_DRH_2 = 'DRH_2'
bbb2458d 49POSTE_ETAT_DEMANDE_MODIF = 'DEMANDE_MODIF'
d8cfc3d5 50POSTE_ETAT_ACCIOR = 'ACCIOR'
9a62bc55 51POSTE_ETAT_ABF = 'ABF'
1b217058 52POSTE_ETAT_HAUTE_DIRECTION = 'HAUTE_DIRECTION'
bbb2458d 53POSTE_ETAT_DEMANDE_JUSTIF = 'DEMANDE_JUSTIF'
9536ea21 54POSTE_ETAT_REGION_FINALISATION = 'REGION_FINALISATION'
1b217058 55POSTE_ETAT_DRH_FINALISATION = 'DRH_FINALISATION'
9536ea21 56POSTE_ETAT_FINALISE = 'FINALISE'
1b217058
OL
57
58#codes actions
59POSTE_ACTION_ENVOYER_BROUILLON = POSTE_ETAT_BROUILLON
1b217058 60POSTE_ACTION_ENVOYER_ADMINISTRATEUR = POSTE_ETAT_ADMINISTRATEUR
d8cfc3d5
OL
61POSTE_ACTION_ENVOYER_DIRECTEUR_BUREAU = POSTE_ETAT_DIRECTEUR_BUREAU
62POSTE_ACTION_ENVOYER_SRV_UTILISATEURS = POSTE_ETAT_SERVICE_UTILISATEURS
1b217058 63POSTE_ACTION_ENVOYER_DRH_CONTROLE = POSTE_ETAT_DRH_CONTROLE
5aaaef6b 64POSTE_ACTION_ENVOYER_DRH_2 = POSTE_ETAT_DRH_2
bbb2458d
EMS
65POSTE_ACTION_DEMANDE_MODIF = POSTE_ETAT_DEMANDE_MODIF
66POSTE_ACTION_RETOUR_DEMANDE_MODIF = 'RETOUR_DEMANDE_MODIF'
d8cfc3d5 67POSTE_ACTION_ENVOYER_ACCIOR = POSTE_ETAT_ACCIOR
9a62bc55 68POSTE_ACTION_ENVOYER_ABF = POSTE_ETAT_ABF
1b217058 69POSTE_ACTION_ENVOYER_HAUTE_DIRECTION = POSTE_ETAT_HAUTE_DIRECTION
bbb2458d
EMS
70POSTE_ACTION_DEMANDE_JUSTIF = POSTE_ETAT_DEMANDE_JUSTIF
71POSTE_ACTION_RETOUR_DEMANDE_JUSTIF = 'RETOUR_DEMANDE_JUSTIF'
9536ea21 72POSTE_ACTION_ENVOYER_REGION_FINALISATION = POSTE_ETAT_REGION_FINALISATION
1b217058 73POSTE_ACTION_ENVOYER_DRH_FINALISATION = POSTE_ETAT_DRH_FINALISATION
9536ea21 74POSTE_ACTION_FINALISER = 'FINALISER'
8fa94e8b
OL
75
76#libellés états
77POSTE_ETATS = {
3799cafc 78 POSTE_ETAT_BROUILLON : u"En rédaction",
6a7260b4 79 POSTE_ETAT_ADMINISTRATEUR : u"Validation de l'administrateur",
d8cfc3d5
OL
80 POSTE_ETAT_DIRECTEUR_BUREAU : u"Directeur de bureau",
81 POSTE_ETAT_SERVICE_UTILISATEURS : u"Service utilisateurs",
62cfa562 82 POSTE_ETAT_DRH_CONTROLE : u"Validation DRH",
5aaaef6b 83 POSTE_ETAT_DRH_2 : u"Validation DRH 2",
bbb2458d 84 POSTE_ETAT_DEMANDE_MODIF : u"Demande de modification",
d8cfc3d5 85 POSTE_ETAT_ACCIOR : u"ACCIOR",
9a62bc55 86 POSTE_ETAT_ABF : u"ABF",
62cfa562 87 POSTE_ETAT_HAUTE_DIRECTION : u"Validation : Secrétaire général / Recteur",
bbb2458d 88 POSTE_ETAT_DEMANDE_JUSTIF : u"Demande de justification",
9536ea21
EMS
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'
8fa94e8b
OL
92 }
93
56589624
OL
94#libellés états pour boutons
95POSTE_ETATS_BOUTONS = {
d8cfc3d5
OL
96 POSTE_ETAT_DIRECTEUR_BUREAU : u"Envoyer au directeur de bureau",
97 POSTE_ETAT_SERVICE_UTILISATEURS : u"Envoyer au service utilisateurs",
56589624
OL
98 POSTE_ETAT_ADMINISTRATEUR : u"Envoyer à l'adminstrateur",
99 POSTE_ETAT_DRH_CONTROLE : u"Envoyer à la DRH (validation)",
5aaaef6b 100 POSTE_ETAT_DRH_2 : u"Envoyer à DRH 2",
bbb2458d 101 POSTE_ETAT_DEMANDE_MODIF : u"Envoyer une demande de modification",
871be4b0 102 POSTE_ETAT_ACCIOR : u"Envoyer à l'ACCIOR",
9a62bc55 103 POSTE_ETAT_ABF : u"Envoyer à l'ABF",
56589624 104 POSTE_ETAT_HAUTE_DIRECTION : u"Envoyer à la haute direction",
bbb2458d 105 POSTE_ETAT_DEMANDE_JUSTIF : u"Envoyer une demande de justification",
9536ea21
EMS
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'
56589624
OL
109 }
110
8fa94e8b
OL
111# définition du worflow séquentiel
112POSTE_ACTIONS = {
1b217058 113 POSTE_ACTION_ENVOYER_BROUILLON : {
8fa94e8b
OL
114 'nom' : u'Créer',
115 'etat_initial' : None,
116 'etat_final' : POSTE_ETAT_BROUILLON,
117 },
1b217058
OL
118 POSTE_ACTION_ENVOYER_ADMINISTRATEUR : {
119 'nom' : u'Envoyer',
8684fcaa 120 'etat_initial' : (POSTE_ETAT_BROUILLON,),
1b217058
OL
121 'etat_final' : POSTE_ETAT_ADMINISTRATEUR,
122 },
d8cfc3d5
OL
123 POSTE_ACTION_ENVOYER_SRV_UTILISATEURS : {
124 'nom' : u'Envoyer',
8684fcaa 125 'etat_initial' : (POSTE_ETAT_ADMINISTRATEUR,),
d8cfc3d5
OL
126 'etat_final' : POSTE_ETAT_SERVICE_UTILISATEURS,
127 },
128 POSTE_ACTION_ENVOYER_DIRECTEUR_BUREAU : {
129 'nom' : u'Envoyer',
bbb2458d 130 'etat_initial' : (POSTE_ETAT_ADMINISTRATEUR,),
d8cfc3d5
OL
131 'etat_final' : POSTE_ETAT_DIRECTEUR_BUREAU,
132 },
1b217058
OL
133 POSTE_ACTION_ENVOYER_DRH_CONTROLE : {
134 'nom' : u'Envoyer',
bbb2458d 135 'etat_initial' : (POSTE_ETAT_ADMINISTRATEUR, POSTE_ETAT_DIRECTEUR_BUREAU, POSTE_ETAT_SERVICE_UTILISATEURS),
1b217058
OL
136 'etat_final' : POSTE_ETAT_DRH_CONTROLE,
137 },
5aaaef6b 138 POSTE_ACTION_ENVOYER_DRH_2 : {
bbb2458d
EMS
139 'nom' : u'Envoyer',
140 'etat_initial' : (POSTE_ETAT_DRH_CONTROLE,),
5aaaef6b
EMS
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),
bbb2458d
EMS
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 },
d8cfc3d5 153 POSTE_ACTION_ENVOYER_ACCIOR : {
1b217058 154 'nom' : u'Envoyer',
5aaaef6b 155 'etat_initial' : (POSTE_ETAT_DRH_2,),
d8cfc3d5
OL
156 'etat_final' : POSTE_ETAT_ACCIOR,
157 },
9a62bc55 158 POSTE_ACTION_ENVOYER_ABF : {
d8cfc3d5 159 'nom' : u'Envoyer',
bbb2458d 160 'etat_initial' : (POSTE_ETAT_ACCIOR,),
9a62bc55 161 'etat_final' : POSTE_ETAT_ABF,
1b217058
OL
162 },
163 POSTE_ACTION_ENVOYER_HAUTE_DIRECTION : {
164 'nom' : u'Envoyer',
bbb2458d 165 'etat_initial' : (POSTE_ETAT_ABF,),
1b217058
OL
166 'etat_final' : POSTE_ETAT_HAUTE_DIRECTION,
167 },
bbb2458d
EMS
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 },
9536ea21 178 POSTE_ACTION_ENVOYER_REGION_FINALISATION : {
1b217058 179 'nom' : u'Envoyer',
bbb2458d 180 'etat_initial' : (POSTE_ETAT_HAUTE_DIRECTION,),
9536ea21
EMS
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,),
1b217058 186 'etat_final' : POSTE_ETAT_DRH_FINALISATION,
8fa94e8b 187 },
9536ea21
EMS
188 POSTE_ACTION_FINALISER : {
189 'nom' : u'Finaliser',
190 'etat_initial' : (POSTE_ETAT_DRH_FINALISATION,),
191 'etat_final' : POSTE_ETAT_FINALISE
192 },
8fa94e8b
OL
193}
194
56589624 195
8fa94e8b
OL
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
d8cfc3d5 204 def acces_directeur_bureau(self, action, request):
2da4acc0 205 user_groups = request.user.groups.all()
5aaaef6b
EMS
206 return grp_drh in user_groups or grp_drh2 in user_groups or \
207 (is_user_dans_services_centraux(request.user) and
208 grp_administrateurs in user_groups)
1b217058
OL
209
210 def acces_administrateur(self, action, request):
5aaaef6b
EMS
211 user_groups = request.user.groups.all()
212 return grp_correspondants_rh in user_groups or grp_drh in user_groups or \
213 grp_drh2 in user_groups
1b217058
OL
214
215 def acces_drh_controle(self, action, request):
5aaaef6b
EMS
216 user_groups = request.user.groups.all()
217 return grp_directeurs_bureau in user_groups or \
218 grp_service_utilisateurs in user_groups or \
219 grp_drh in user_groups or grp_drh2 in user_groups or \
220 (grp_administrateurs in user_groups and
221 (action == POSTE_ACTION_RETOUR_DEMANDE_MODIF or
222 is_user_dans_region(request.user)))
223
224 def acces_drh_2(self, action, request):
225 user_groups = request.user.groups.all()
226 return grp_drh in user_groups
bbb2458d
EMS
227
228 def acces_demande_modif(self, action, request):
5aaaef6b
EMS
229 user_groups = request.user.groups.all()
230 return grp_drh in user_groups or grp_drh2 in user_groups
1b217058 231
d8cfc3d5
OL
232 def acces_srv_utilisateurs(self, action, request):
233 if not is_user_dans_services_centraux(request.user):
234 return False
5aaaef6b 235 user_groups = request.user.groups.all()
dceb5455 236 return grp_administrateurs in user_groups or grp_drh in user_groups or \
25524bf7 237 grp_drh2 in user_groups
d8cfc3d5 238
d8cfc3d5 239 def acces_accior(self, action, request):
5aaaef6b
EMS
240 user_groups = request.user.groups.all()
241 return grp_drh in user_groups or grp_drh2 in user_groups
1b217058 242
9a62bc55 243 def acces_abf(self, action, request):
5aaaef6b
EMS
244 user_groups = request.user.groups.all()
245 return grp_accior in user_groups or grp_drh in user_groups or grp_drh2 in user_groups
d8cfc3d5 246
1b217058 247 def acces_haute_direction(self, action, request):
5aaaef6b
EMS
248 user_groups = request.user.groups.all()
249 return grp_abf in user_groups or grp_drh in user_groups or grp_drh2 in user_groups
1b217058 250
9536ea21 251 def acces_region_finalisation(self, action, request):
5aaaef6b
EMS
252 user_groups = request.user.groups.all()
253 return grp_haute_direction in user_groups or grp_drh in user_groups or \
254 grp_drh2 in user_groups
9536ea21 255
1b217058 256 def acces_drh_finalisation(self, action, request):
5aaaef6b 257 user_groups = request.user.groups.all()
25524bf7
EMS
258 return grp_administrateurs in user_groups or \
259 grp_correspondants_rh in user_groups or \
260 grp_drh in user_groups or \
261 grp_drh2 in user_groups
1b217058 262
bbb2458d 263 def acces_demande_justif(self, action, request):
5aaaef6b
EMS
264 user_groups = request.user.groups.all()
265 return grp_haute_direction in user_groups or grp_drh in user_groups or \
266 grp_drh2 in user_groups
bbb2458d
EMS
267
268 def acces_retour_demande_modif(self, action, request):
5aaaef6b
EMS
269 user_groups = request.user.groups.all()
270 return grp_administrateurs in user_groups or grp_drh in user_groups or \
271 grp_drh2 in user_groups
bbb2458d
EMS
272
273 def acces_retour_demande_justif(self, action, request):
5aaaef6b
EMS
274 user_groups = request.user.groups.all()
275 return grp_drh in user_groups or grp_drh2 in user_groups
bbb2458d 276
9536ea21 277 def acces_finaliser(self, action, request):
5aaaef6b
EMS
278 user_groups = request.user.groups.all()
279 return grp_drh in user_groups or grp_drh2 in user_groups
9536ea21 280
1b217058 281
515124ec
OL
282#codes actions
283DOSSIER_ETAT_BROUILLON = POSTE_ETAT_BROUILLON
515124ec 284DOSSIER_ETAT_ADMINISTRATEUR = POSTE_ETAT_ADMINISTRATEUR
d8cfc3d5
OL
285DOSSIER_ETAT_DIRECTEUR_BUREAU = POSTE_ETAT_DIRECTEUR_BUREAU
286DOSSIER_ETAT_SERVICE_UTILISATEURS = POSTE_ETAT_SERVICE_UTILISATEURS
515124ec 287DOSSIER_ETAT_DRH_CONTROLE = POSTE_ETAT_DRH_CONTROLE
5aaaef6b 288DOSSIER_ETAT_DRH_2 = POSTE_ETAT_DRH_2
bbb2458d 289DOSSIER_ETAT_DEMANDE_MODIF = POSTE_ETAT_DEMANDE_MODIF
d8cfc3d5 290DOSSIER_ETAT_ACCIOR = POSTE_ETAT_ACCIOR
9a62bc55 291DOSSIER_ETAT_ABF = POSTE_ETAT_ABF
515124ec 292DOSSIER_ETAT_HAUTE_DIRECTION = POSTE_ETAT_HAUTE_DIRECTION
bbb2458d 293DOSSIER_ETAT_DEMANDE_JUSTIF = POSTE_ETAT_DEMANDE_JUSTIF
9536ea21 294DOSSIER_ETAT_REGION_FINALISATION = POSTE_ETAT_REGION_FINALISATION
515124ec 295DOSSIER_ETAT_DRH_FINALISATION = POSTE_ETAT_DRH_FINALISATION
9536ea21 296DOSSIER_ETAT_FINALISE = POSTE_ETAT_FINALISE
afc204bf
OL
297
298class DossierWorkflow(PosteWorkflow):
299
300 class Meta:
301 abstract = True
515124ec 302
515124ec
OL
303
304MAP_GROUPE_ETATS_A_FAIRE = {
25524bf7
EMS
305 grp_correspondants_rh : (POSTE_ETAT_BROUILLON, DOSSIER_ETAT_BROUILLON,
306 POSTE_ETAT_REGION_FINALISATION,
307 DOSSIER_ETAT_REGION_FINALISATION),
9536ea21
EMS
308 grp_service_utilisateurs : (POSTE_ETAT_SERVICE_UTILISATEURS,
309 DOSSIER_ETAT_SERVICE_UTILISATEURS,),
310 grp_administrateurs : (POSTE_ETAT_ADMINISTRATEUR,
311 DOSSIER_ETAT_ADMINISTRATEUR,
312 POSTE_ETAT_DEMANDE_MODIF,
313 DOSSIER_ETAT_DEMANDE_MODIF,
314 POSTE_ETAT_REGION_FINALISATION,
315 DOSSIER_ETAT_REGION_FINALISATION,
316 ),
d8cfc3d5 317 grp_directeurs_bureau : (POSTE_ETAT_DIRECTEUR_BUREAU, DOSSIER_ETAT_DIRECTEUR_BUREAU, ),
9536ea21
EMS
318 grp_drh : (POSTE_ETAT_DRH_CONTROLE, POSTE_ETAT_DRH_FINALISATION,
319 DOSSIER_ETAT_DRH_CONTROLE, DOSSIER_ETAT_DRH_FINALISATION,
bbb2458d 320 POSTE_ETAT_DEMANDE_JUSTIF, DOSSIER_ETAT_DEMANDE_JUSTIF),
5aaaef6b 321 grp_drh2 : (POSTE_ETAT_DRH_2, DOSSIER_ETAT_DRH_2),
d8cfc3d5 322 grp_accior : (POSTE_ETAT_ACCIOR, DOSSIER_ETAT_ACCIOR, ),
9a62bc55 323 grp_abf : (POSTE_ETAT_ABF, DOSSIER_ETAT_ABF, ),
3799cafc 324 grp_haute_direction : (POSTE_ETAT_HAUTE_DIRECTION, DOSSIER_ETAT_HAUTE_DIRECTION, ),
515124ec 325}
286d0aa9
OL
326
327
bbb2458d 328ETATS_EDITABLE = (POSTE_ETAT_BROUILLON, POSTE_ETAT_ADMINISTRATEUR,
5aaaef6b
EMS
329 POSTE_ETAT_DRH_CONTROLE, POSTE_ETAT_DRH_2,
330 POSTE_ETAT_DIRECTEUR_BUREAU,
331 POSTE_ETAT_SERVICE_UTILISATEURS, POSTE_ETAT_DEMANDE_MODIF,
332 POSTE_ETAT_DEMANDE_JUSTIF, DOSSIER_ETAT_BROUILLON,
bbb2458d 333 DOSSIER_ETAT_ADMINISTRATEUR, DOSSIER_ETAT_DRH_CONTROLE,
5aaaef6b 334 DOSSIER_ETAT_DRH_2, DOSSIER_ETAT_DIRECTEUR_BUREAU,
bbb2458d 335 DOSSIER_ETAT_SERVICE_UTILISATEURS,
5aaaef6b 336 DOSSIER_ETAT_DEMANDE_MODIF, DOSSIER_ETAT_DEMANDE_JUSTIF,
286d0aa9
OL
337)
338
9536ea21
EMS
339ETATS_VALIDE = (DOSSIER_ETAT_REGION_FINALISATION, DOSSIER_ETAT_DRH_FINALISATION,
340 DOSSIER_ETAT_FINALISE)