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 """
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')
d8cfc3d5 24grp_accior = safe_create_groupe(name='ACCIOR')
9a62bc55 25grp_abf = safe_create_groupe(name='ABF')
33b0b6af
OL
26grp_haute_direction = safe_create_groupe(name='Haute direction')
27grp_service_utilisateurs = safe_create_groupe(name='Service utilisateurs')
1b217058 28
27d7babd
OL
29dae_groupes = (
30 grp_correspondants_rh,
31 grp_administrateurs,
32 grp_directeurs_bureau,
33 grp_drh,
34 grp_accior,
9a62bc55 35 grp_abf,
27d7babd
OL
36 grp_haute_direction,
37 grp_service_utilisateurs,
38)
8fa94e8b
OL
39
40# codes états
41POSTE_ETAT_BROUILLON = 'BROUILLON'
1b217058 42POSTE_ETAT_ADMINISTRATEUR = 'ADMINISTRATEUR'
d8cfc3d5
OL
43POSTE_ETAT_DIRECTEUR_BUREAU = 'DIRECTEUR_BUREAU'
44POSTE_ETAT_SERVICE_UTILISATEURS = 'SRV_UTILISATEURS'
1b217058 45POSTE_ETAT_DRH_CONTROLE = 'DRH_CONTROLE'
bbb2458d 46POSTE_ETAT_DEMANDE_MODIF = 'DEMANDE_MODIF'
d8cfc3d5 47POSTE_ETAT_ACCIOR = 'ACCIOR'
9a62bc55 48POSTE_ETAT_ABF = 'ABF'
1b217058 49POSTE_ETAT_HAUTE_DIRECTION = 'HAUTE_DIRECTION'
bbb2458d 50POSTE_ETAT_DEMANDE_JUSTIF = 'DEMANDE_JUSTIF'
1b217058
OL
51POSTE_ETAT_DRH_FINALISATION = 'DRH_FINALISATION'
52
53#codes actions
54POSTE_ACTION_ENVOYER_BROUILLON = POSTE_ETAT_BROUILLON
1b217058 55POSTE_ACTION_ENVOYER_ADMINISTRATEUR = POSTE_ETAT_ADMINISTRATEUR
d8cfc3d5
OL
56POSTE_ACTION_ENVOYER_DIRECTEUR_BUREAU = POSTE_ETAT_DIRECTEUR_BUREAU
57POSTE_ACTION_ENVOYER_SRV_UTILISATEURS = POSTE_ETAT_SERVICE_UTILISATEURS
1b217058 58POSTE_ACTION_ENVOYER_DRH_CONTROLE = POSTE_ETAT_DRH_CONTROLE
bbb2458d
EMS
59POSTE_ACTION_DEMANDE_MODIF = POSTE_ETAT_DEMANDE_MODIF
60POSTE_ACTION_RETOUR_DEMANDE_MODIF = 'RETOUR_DEMANDE_MODIF'
d8cfc3d5 61POSTE_ACTION_ENVOYER_ACCIOR = POSTE_ETAT_ACCIOR
9a62bc55 62POSTE_ACTION_ENVOYER_ABF = POSTE_ETAT_ABF
1b217058 63POSTE_ACTION_ENVOYER_HAUTE_DIRECTION = POSTE_ETAT_HAUTE_DIRECTION
bbb2458d
EMS
64POSTE_ACTION_DEMANDE_JUSTIF = POSTE_ETAT_DEMANDE_JUSTIF
65POSTE_ACTION_RETOUR_DEMANDE_JUSTIF = 'RETOUR_DEMANDE_JUSTIF'
1b217058 66POSTE_ACTION_ENVOYER_DRH_FINALISATION = POSTE_ETAT_DRH_FINALISATION
8fa94e8b
OL
67
68#libellés états
69POSTE_ETATS = {
3799cafc 70 POSTE_ETAT_BROUILLON : u"En rédaction",
6a7260b4 71 POSTE_ETAT_ADMINISTRATEUR : u"Validation de l'administrateur",
d8cfc3d5
OL
72 POSTE_ETAT_DIRECTEUR_BUREAU : u"Directeur de bureau",
73 POSTE_ETAT_SERVICE_UTILISATEURS : u"Service utilisateurs",
62cfa562 74 POSTE_ETAT_DRH_CONTROLE : u"Validation DRH",
bbb2458d 75 POSTE_ETAT_DEMANDE_MODIF : u"Demande de modification",
d8cfc3d5 76 POSTE_ETAT_ACCIOR : u"ACCIOR",
9a62bc55 77 POSTE_ETAT_ABF : u"ABF",
62cfa562 78 POSTE_ETAT_HAUTE_DIRECTION : u"Validation : Secrétaire général / Recteur",
bbb2458d 79 POSTE_ETAT_DEMANDE_JUSTIF : u"Demande de justification",
62cfa562 80 POSTE_ETAT_DRH_FINALISATION : u'Retour à la DRH et région',
8fa94e8b
OL
81 }
82
56589624
OL
83#libellés états pour boutons
84POSTE_ETATS_BOUTONS = {
d8cfc3d5
OL
85 POSTE_ETAT_DIRECTEUR_BUREAU : u"Envoyer au directeur de bureau",
86 POSTE_ETAT_SERVICE_UTILISATEURS : u"Envoyer au service utilisateurs",
56589624
OL
87 POSTE_ETAT_ADMINISTRATEUR : u"Envoyer à l'adminstrateur",
88 POSTE_ETAT_DRH_CONTROLE : u"Envoyer à la DRH (validation)",
bbb2458d 89 POSTE_ETAT_DEMANDE_MODIF : u"Envoyer une demande de modification",
871be4b0 90 POSTE_ETAT_ACCIOR : u"Envoyer à l'ACCIOR",
9a62bc55 91 POSTE_ETAT_ABF : u"Envoyer à l'ABF",
56589624 92 POSTE_ETAT_HAUTE_DIRECTION : u"Envoyer à la haute direction",
bbb2458d 93 POSTE_ETAT_DEMANDE_JUSTIF : u"Envoyer une demande de justification",
56589624
OL
94 POSTE_ETAT_DRH_FINALISATION : u'Envoyer à la DRH (traitement)',
95 }
96
8fa94e8b
OL
97# définition du worflow séquentiel
98POSTE_ACTIONS = {
1b217058 99 POSTE_ACTION_ENVOYER_BROUILLON : {
8fa94e8b
OL
100 'nom' : u'Créer',
101 'etat_initial' : None,
102 'etat_final' : POSTE_ETAT_BROUILLON,
103 },
1b217058
OL
104 POSTE_ACTION_ENVOYER_ADMINISTRATEUR : {
105 'nom' : u'Envoyer',
bbb2458d 106 'etat_initial' : (POSTE_ETAT_BROUILLON,),
1b217058
OL
107 'etat_final' : POSTE_ETAT_ADMINISTRATEUR,
108 },
d8cfc3d5
OL
109 POSTE_ACTION_ENVOYER_SRV_UTILISATEURS : {
110 'nom' : u'Envoyer',
bbb2458d 111 'etat_initial' : (POSTE_ETAT_ADMINISTRATEUR,),
d8cfc3d5
OL
112 'etat_final' : POSTE_ETAT_SERVICE_UTILISATEURS,
113 },
114 POSTE_ACTION_ENVOYER_DIRECTEUR_BUREAU : {
115 'nom' : u'Envoyer',
bbb2458d 116 'etat_initial' : (POSTE_ETAT_ADMINISTRATEUR,),
d8cfc3d5
OL
117 'etat_final' : POSTE_ETAT_DIRECTEUR_BUREAU,
118 },
1b217058
OL
119 POSTE_ACTION_ENVOYER_DRH_CONTROLE : {
120 'nom' : u'Envoyer',
bbb2458d 121 'etat_initial' : (POSTE_ETAT_ADMINISTRATEUR, POSTE_ETAT_DIRECTEUR_BUREAU, POSTE_ETAT_SERVICE_UTILISATEURS),
1b217058
OL
122 'etat_final' : POSTE_ETAT_DRH_CONTROLE,
123 },
bbb2458d
EMS
124 POSTE_ACTION_DEMANDE_MODIF : {
125 'nom' : u'Envoyer',
126 'etat_initial' : (POSTE_ETAT_DRH_CONTROLE,),
127 'etat_final': POSTE_ETAT_DEMANDE_MODIF,
128 },
129 POSTE_ACTION_RETOUR_DEMANDE_MODIF : {
130 'nom': u'Retourner',
131 'etat_initial': (POSTE_ETAT_DEMANDE_MODIF,),
132 'etat_final': POSTE_ETAT_DRH_CONTROLE,
133 },
d8cfc3d5 134 POSTE_ACTION_ENVOYER_ACCIOR : {
1b217058 135 'nom' : u'Envoyer',
bbb2458d 136 'etat_initial' : (POSTE_ETAT_DRH_CONTROLE,),
d8cfc3d5
OL
137 'etat_final' : POSTE_ETAT_ACCIOR,
138 },
9a62bc55 139 POSTE_ACTION_ENVOYER_ABF : {
d8cfc3d5 140 'nom' : u'Envoyer',
bbb2458d 141 'etat_initial' : (POSTE_ETAT_ACCIOR,),
9a62bc55 142 'etat_final' : POSTE_ETAT_ABF,
1b217058
OL
143 },
144 POSTE_ACTION_ENVOYER_HAUTE_DIRECTION : {
145 'nom' : u'Envoyer',
bbb2458d 146 'etat_initial' : (POSTE_ETAT_ABF,),
1b217058
OL
147 'etat_final' : POSTE_ETAT_HAUTE_DIRECTION,
148 },
bbb2458d
EMS
149 POSTE_ACTION_DEMANDE_JUSTIF : {
150 'nom' : u'Envoyer',
151 'etat_initial' : (POSTE_ETAT_HAUTE_DIRECTION,),
152 'etat_final': POSTE_ETAT_DEMANDE_JUSTIF,
153 },
154 POSTE_ACTION_RETOUR_DEMANDE_JUSTIF : {
155 'nom' : u'Envoyer',
156 'etat_initial' : (POSTE_ETAT_DEMANDE_JUSTIF,),
157 'etat_final': POSTE_ETAT_HAUTE_DIRECTION,
158 },
1b217058
OL
159 POSTE_ACTION_ENVOYER_DRH_FINALISATION : {
160 'nom' : u'Envoyer',
bbb2458d 161 'etat_initial' : (POSTE_ETAT_HAUTE_DIRECTION,),
1b217058 162 'etat_final' : POSTE_ETAT_DRH_FINALISATION,
8fa94e8b
OL
163 },
164}
165
56589624 166
8fa94e8b
OL
167class PosteWorkflow(WorkflowMixin):
168 etat_initial = POSTE_ETAT_BROUILLON
169 etats = POSTE_ETATS
170 actions = POSTE_ACTIONS
171
172 class Meta:
173 abstract = True
174
d8cfc3d5 175 def acces_directeur_bureau(self, action, request):
2da4acc0
OL
176 user_groups = request.user.groups.all()
177 if is_user_dans_services_centraux(request.user) and grp_drh not in user_groups:
d8cfc3d5 178 return False
2da4acc0 179 for g in user_groups:
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):
bbb2458d
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
9a62bc55 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():
9a62bc55 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
bbb2458d
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
bbb2458d 248DOSSIER_ETAT_DEMANDE_MODIF = POSTE_ETAT_DEMANDE_MODIF
d8cfc3d5 249DOSSIER_ETAT_ACCIOR = POSTE_ETAT_ACCIOR
9a62bc55 250DOSSIER_ETAT_ABF = POSTE_ETAT_ABF
515124ec 251DOSSIER_ETAT_HAUTE_DIRECTION = POSTE_ETAT_HAUTE_DIRECTION
bbb2458d 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,),
bbb2458d
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, ),
bbb2458d
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, ),
9a62bc55 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
bbb2458d
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