Refactoring de la vue d'édition de DAE
[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'
1b217058
OL
52POSTE_ETAT_DRH_FINALISATION = 'DRH_FINALISATION'
53
54#codes actions
55POSTE_ACTION_ENVOYER_BROUILLON = POSTE_ETAT_BROUILLON
1b217058 56POSTE_ACTION_ENVOYER_ADMINISTRATEUR = POSTE_ETAT_ADMINISTRATEUR
d8cfc3d5
OL
57POSTE_ACTION_ENVOYER_DIRECTEUR_BUREAU = POSTE_ETAT_DIRECTEUR_BUREAU
58POSTE_ACTION_ENVOYER_SRV_UTILISATEURS = POSTE_ETAT_SERVICE_UTILISATEURS
1b217058 59POSTE_ACTION_ENVOYER_DRH_CONTROLE = POSTE_ETAT_DRH_CONTROLE
d7e67bd4
EMS
60POSTE_ACTION_DEMANDE_MODIF = POSTE_ETAT_DEMANDE_MODIF
61POSTE_ACTION_RETOUR_DEMANDE_MODIF = 'RETOUR_DEMANDE_MODIF'
d8cfc3d5 62POSTE_ACTION_ENVOYER_ACCIOR = POSTE_ETAT_ACCIOR
80c526a0 63POSTE_ACTION_ENVOYER_ABF = POSTE_ETAT_ABF
1b217058 64POSTE_ACTION_ENVOYER_HAUTE_DIRECTION = POSTE_ETAT_HAUTE_DIRECTION
d7e67bd4
EMS
65POSTE_ACTION_DEMANDE_JUSTIF = POSTE_ETAT_DEMANDE_JUSTIF
66POSTE_ACTION_RETOUR_DEMANDE_JUSTIF = 'RETOUR_DEMANDE_JUSTIF'
1b217058 67POSTE_ACTION_ENVOYER_DRH_FINALISATION = POSTE_ETAT_DRH_FINALISATION
8fa94e8b
OL
68
69#libellés états
70POSTE_ETATS = {
3799cafc 71 POSTE_ETAT_BROUILLON : u"En rédaction",
62cfa562 72 POSTE_ETAT_ADMINISTRATEUR : u"Validation de l'adminstrateur",
d8cfc3d5
OL
73 POSTE_ETAT_DIRECTEUR_BUREAU : u"Directeur de bureau",
74 POSTE_ETAT_SERVICE_UTILISATEURS : u"Service utilisateurs",
62cfa562 75 POSTE_ETAT_DRH_CONTROLE : u"Validation DRH",
d7e67bd4 76 POSTE_ETAT_DEMANDE_MODIF : u"Demande de modification",
d8cfc3d5 77 POSTE_ETAT_ACCIOR : u"ACCIOR",
80c526a0 78 POSTE_ETAT_ABF : u"ABF",
62cfa562 79 POSTE_ETAT_HAUTE_DIRECTION : u"Validation : Secrétaire général / Recteur",
d7e67bd4 80 POSTE_ETAT_DEMANDE_JUSTIF : u"Demande de justification",
62cfa562 81 POSTE_ETAT_DRH_FINALISATION : u'Retour à la DRH et région',
8fa94e8b
OL
82 }
83
56589624
OL
84#libellés états pour boutons
85POSTE_ETATS_BOUTONS = {
d8cfc3d5
OL
86 POSTE_ETAT_DIRECTEUR_BUREAU : u"Envoyer au directeur de bureau",
87 POSTE_ETAT_SERVICE_UTILISATEURS : u"Envoyer au service utilisateurs",
56589624
OL
88 POSTE_ETAT_ADMINISTRATEUR : u"Envoyer à l'adminstrateur",
89 POSTE_ETAT_DRH_CONTROLE : u"Envoyer à la DRH (validation)",
d7e67bd4 90 POSTE_ETAT_DEMANDE_MODIF : u"Envoyer une demande de modification",
871be4b0 91 POSTE_ETAT_ACCIOR : u"Envoyer à l'ACCIOR",
80c526a0 92 POSTE_ETAT_ABF : u"Envoyer à l'ABF",
56589624 93 POSTE_ETAT_HAUTE_DIRECTION : u"Envoyer à la haute direction",
d7e67bd4 94 POSTE_ETAT_DEMANDE_JUSTIF : u"Envoyer une demande de justification",
56589624
OL
95 POSTE_ETAT_DRH_FINALISATION : u'Envoyer à la DRH (traitement)',
96 }
97
8fa94e8b
OL
98# définition du worflow séquentiel
99POSTE_ACTIONS = {
1b217058 100 POSTE_ACTION_ENVOYER_BROUILLON : {
8fa94e8b
OL
101 'nom' : u'Créer',
102 'etat_initial' : None,
103 'etat_final' : POSTE_ETAT_BROUILLON,
104 },
1b217058
OL
105 POSTE_ACTION_ENVOYER_ADMINISTRATEUR : {
106 'nom' : u'Envoyer',
d7e67bd4 107 'etat_initial' : (POSTE_ETAT_BROUILLON,),
1b217058
OL
108 'etat_final' : POSTE_ETAT_ADMINISTRATEUR,
109 },
d8cfc3d5
OL
110 POSTE_ACTION_ENVOYER_SRV_UTILISATEURS : {
111 'nom' : u'Envoyer',
d7e67bd4 112 'etat_initial' : (POSTE_ETAT_ADMINISTRATEUR,),
d8cfc3d5
OL
113 'etat_final' : POSTE_ETAT_SERVICE_UTILISATEURS,
114 },
115 POSTE_ACTION_ENVOYER_DIRECTEUR_BUREAU : {
116 'nom' : u'Envoyer',
d7e67bd4 117 'etat_initial' : (POSTE_ETAT_ADMINISTRATEUR,),
d8cfc3d5
OL
118 'etat_final' : POSTE_ETAT_DIRECTEUR_BUREAU,
119 },
1b217058
OL
120 POSTE_ACTION_ENVOYER_DRH_CONTROLE : {
121 'nom' : u'Envoyer',
d7e67bd4 122 'etat_initial' : (POSTE_ETAT_ADMINISTRATEUR, POSTE_ETAT_DIRECTEUR_BUREAU, POSTE_ETAT_SERVICE_UTILISATEURS),
1b217058
OL
123 'etat_final' : POSTE_ETAT_DRH_CONTROLE,
124 },
d7e67bd4
EMS
125 POSTE_ACTION_DEMANDE_MODIF : {
126 'nom' : u'Envoyer',
127 'etat_initial' : (POSTE_ETAT_DRH_CONTROLE,),
128 'etat_final': POSTE_ETAT_DEMANDE_MODIF,
129 },
130 POSTE_ACTION_RETOUR_DEMANDE_MODIF : {
131 'nom': u'Retourner',
132 'etat_initial': (POSTE_ETAT_DEMANDE_MODIF,),
133 'etat_final': POSTE_ETAT_DRH_CONTROLE,
134 },
d8cfc3d5 135 POSTE_ACTION_ENVOYER_ACCIOR : {
1b217058 136 'nom' : u'Envoyer',
d7e67bd4 137 'etat_initial' : (POSTE_ETAT_DRH_CONTROLE,),
d8cfc3d5
OL
138 'etat_final' : POSTE_ETAT_ACCIOR,
139 },
80c526a0 140 POSTE_ACTION_ENVOYER_ABF : {
d8cfc3d5 141 'nom' : u'Envoyer',
d7e67bd4 142 'etat_initial' : (POSTE_ETAT_ACCIOR,),
80c526a0 143 'etat_final' : POSTE_ETAT_ABF,
1b217058
OL
144 },
145 POSTE_ACTION_ENVOYER_HAUTE_DIRECTION : {
146 'nom' : u'Envoyer',
d7e67bd4 147 'etat_initial' : (POSTE_ETAT_ABF,),
1b217058
OL
148 'etat_final' : POSTE_ETAT_HAUTE_DIRECTION,
149 },
d7e67bd4
EMS
150 POSTE_ACTION_DEMANDE_JUSTIF : {
151 'nom' : u'Envoyer',
152 'etat_initial' : (POSTE_ETAT_HAUTE_DIRECTION,),
153 'etat_final': POSTE_ETAT_DEMANDE_JUSTIF,
154 },
155 POSTE_ACTION_RETOUR_DEMANDE_JUSTIF : {
156 'nom' : u'Envoyer',
157 'etat_initial' : (POSTE_ETAT_DEMANDE_JUSTIF,),
158 'etat_final': POSTE_ETAT_HAUTE_DIRECTION,
159 },
1b217058
OL
160 POSTE_ACTION_ENVOYER_DRH_FINALISATION : {
161 'nom' : u'Envoyer',
d7e67bd4 162 'etat_initial' : (POSTE_ETAT_HAUTE_DIRECTION,),
1b217058 163 'etat_final' : POSTE_ETAT_DRH_FINALISATION,
8fa94e8b
OL
164 },
165}
166
56589624 167
8fa94e8b
OL
168class PosteWorkflow(WorkflowMixin):
169 etat_initial = POSTE_ETAT_BROUILLON
170 etats = POSTE_ETATS
171 actions = POSTE_ACTIONS
172
173 class Meta:
174 abstract = True
175
d8cfc3d5
OL
176 def acces_directeur_bureau(self, action, request):
177 if is_user_dans_services_centraux(request.user):
178 return False
1b217058 179 for g in request.user.groups.all():
d8cfc3d5 180 if g in (grp_administrateurs, grp_drh,):
1b217058
OL
181 return True
182 return False
183
184 def acces_administrateur(self, action, request):
185 for g in request.user.groups.all():
d8cfc3d5 186 if g in (grp_correspondants_rh, grp_drh,):
1b217058
OL
187 return True
188 return False
189
190 def acces_drh_controle(self, action, request):
d7e67bd4
EMS
191 groups = request.user.groups.all()
192 return any(g in groups for g in [grp_directeurs_bureau, grp_service_utilisateurs, grp_drh]) or \
193 grp_administrateurs in groups and (action == POSTE_ACTION_RETOUR_DEMANDE_MODIF or
194 is_user_dans_region(request.user))
195
196 def acces_demande_modif(self, action, request):
197 return grp_drh in request.user.groups.all()
1b217058 198
d8cfc3d5
OL
199 def acces_srv_utilisateurs(self, action, request):
200 if not is_user_dans_services_centraux(request.user):
201 return False
202 for g in request.user.groups.all():
203 if g in (grp_administrateurs, grp_drh, ):
204 return True
205 return False
206
d8cfc3d5 207 def acces_accior(self, action, request):
1b217058
OL
208 for g in request.user.groups.all():
209 if g in (grp_drh, ):
210 return True
211 return False
212
80c526a0 213 def acces_abf(self, action, request):
d8cfc3d5
OL
214 for g in request.user.groups.all():
215 if g in (grp_accior, grp_drh, ):
216 return True
217 return False
218
1b217058
OL
219 def acces_haute_direction(self, action, request):
220 for g in request.user.groups.all():
80c526a0 221 if g in (grp_abf, grp_drh, ):
1b217058
OL
222 return True
223 return False
224
225 def acces_drh_finalisation(self, action, request):
226 for g in request.user.groups.all():
227 if g in (grp_haute_direction, grp_drh, ):
228 return True
229 return False
230
d7e67bd4
EMS
231 def acces_demande_justif(self, action, request):
232 groups = set(request.user.groups.all())
233 return any(g in groups for g in [grp_haute_direction, grp_drh])
234
235 def acces_retour_demande_modif(self, action, request):
236 return self.acces_drh_controle(action, request)
237
238 def acces_retour_demande_justif(self, action, request):
239 return self.acces_haute_direction(action, request)
240
1b217058 241
515124ec
OL
242#codes actions
243DOSSIER_ETAT_BROUILLON = POSTE_ETAT_BROUILLON
515124ec 244DOSSIER_ETAT_ADMINISTRATEUR = POSTE_ETAT_ADMINISTRATEUR
d8cfc3d5
OL
245DOSSIER_ETAT_DIRECTEUR_BUREAU = POSTE_ETAT_DIRECTEUR_BUREAU
246DOSSIER_ETAT_SERVICE_UTILISATEURS = POSTE_ETAT_SERVICE_UTILISATEURS
515124ec 247DOSSIER_ETAT_DRH_CONTROLE = POSTE_ETAT_DRH_CONTROLE
d7e67bd4 248DOSSIER_ETAT_DEMANDE_MODIF = POSTE_ETAT_DEMANDE_MODIF
d8cfc3d5 249DOSSIER_ETAT_ACCIOR = POSTE_ETAT_ACCIOR
80c526a0 250DOSSIER_ETAT_ABF = POSTE_ETAT_ABF
515124ec 251DOSSIER_ETAT_HAUTE_DIRECTION = POSTE_ETAT_HAUTE_DIRECTION
d7e67bd4 252DOSSIER_ETAT_DEMANDE_JUSTIF = POSTE_ETAT_DEMANDE_JUSTIF
515124ec 253DOSSIER_ETAT_DRH_FINALISATION = POSTE_ETAT_DRH_FINALISATION
afc204bf
OL
254
255class DossierWorkflow(PosteWorkflow):
256
257 class Meta:
258 abstract = True
515124ec 259
515124ec
OL
260
261MAP_GROUPE_ETATS_A_FAIRE = {
eefe1a9e 262 grp_correspondants_rh : (POSTE_ETAT_BROUILLON, DOSSIER_ETAT_BROUILLON, ),
d8cfc3d5 263 grp_service_utilisateurs : (POSTE_ETAT_SERVICE_UTILISATEURS, DOSSIER_ETAT_SERVICE_UTILISATEURS,),
d7e67bd4
EMS
264 grp_administrateurs : (POSTE_ETAT_ADMINISTRATEUR, DOSSIER_ETAT_ADMINISTRATEUR, POSTE_ETAT_DEMANDE_MODIF,
265 DOSSIER_ETAT_DEMANDE_MODIF),
d8cfc3d5 266 grp_directeurs_bureau : (POSTE_ETAT_DIRECTEUR_BUREAU, DOSSIER_ETAT_DIRECTEUR_BUREAU, ),
d7e67bd4
EMS
267 grp_drh : (POSTE_ETAT_DRH_CONTROLE, POSTE_ETAT_DRH_FINALISATION, DOSSIER_ETAT_DRH_CONTROLE, DOSSIER_ETAT_DRH_FINALISATION,
268 POSTE_ETAT_DEMANDE_JUSTIF, DOSSIER_ETAT_DEMANDE_JUSTIF),
d8cfc3d5 269 grp_accior : (POSTE_ETAT_ACCIOR, DOSSIER_ETAT_ACCIOR, ),
80c526a0 270 grp_abf : (POSTE_ETAT_ABF, DOSSIER_ETAT_ABF, ),
3799cafc 271 grp_haute_direction : (POSTE_ETAT_HAUTE_DIRECTION, DOSSIER_ETAT_HAUTE_DIRECTION, ),
515124ec 272}
286d0aa9
OL
273
274
d7e67bd4
EMS
275ETATS_EDITABLE = (POSTE_ETAT_BROUILLON, POSTE_ETAT_ADMINISTRATEUR,
276 POSTE_ETAT_DRH_CONTROLE, POSTE_ETAT_DIRECTEUR_BUREAU,
277 POSTE_ETAT_SERVICE_UTILISATEURS,
278 POSTE_ETAT_DEMANDE_MODIF,
279 POSTE_ETAT_DEMANDE_JUSTIF,
280 DOSSIER_ETAT_BROUILLON,
281 DOSSIER_ETAT_ADMINISTRATEUR, DOSSIER_ETAT_DRH_CONTROLE,
282 DOSSIER_ETAT_DIRECTEUR_BUREAU,
283 DOSSIER_ETAT_SERVICE_UTILISATEURS,
284 DOSSIER_ETAT_DEMANDE_MODIF,
285 DOSSIER_ETAT_DEMANDE_JUSTIF,
286d0aa9
OL
286)
287