refact ergo + page perso (vide)
[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
OL
25grp_accior = safe_create_groupe(name='ACCIOR')
26grp_afb = safe_create_groupe(name='AFB')
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,
36 grp_afb,
37 grp_haute_direction,
38 grp_service_utilisateurs,
39)
8fa94e8b
OL
40
41# codes états
3799cafc 42POSTE_ETAT_REFUSE = 'REFUSE'
8fa94e8b 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'
d8cfc3d5
OL
48POSTE_ETAT_ACCIOR = 'ACCIOR'
49POSTE_ETAT_AFB = 'AFB'
1b217058
OL
50POSTE_ETAT_HAUTE_DIRECTION = 'HAUTE_DIRECTION'
51POSTE_ETAT_DRH_FINALISATION = 'DRH_FINALISATION'
52
53#codes actions
3799cafc 54POSTE_ACTION_ENVOYER_REFUSE = POSTE_ETAT_REFUSE
1b217058 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
d8cfc3d5
OL
60POSTE_ACTION_ENVOYER_ACCIOR = POSTE_ETAT_ACCIOR
61POSTE_ACTION_ENVOYER_AFB = POSTE_ETAT_AFB
1b217058
OL
62POSTE_ACTION_ENVOYER_HAUTE_DIRECTION = POSTE_ETAT_HAUTE_DIRECTION
63POSTE_ACTION_ENVOYER_DRH_FINALISATION = POSTE_ETAT_DRH_FINALISATION
8fa94e8b
OL
64
65#libellés états
66POSTE_ETATS = {
3799cafc
OL
67 POSTE_ETAT_REFUSE : u"Refusé",
68 POSTE_ETAT_BROUILLON : u"En rédaction",
62cfa562 69 POSTE_ETAT_ADMINISTRATEUR : u"Validation de l'adminstrateur",
d8cfc3d5
OL
70 POSTE_ETAT_DIRECTEUR_BUREAU : u"Directeur de bureau",
71 POSTE_ETAT_SERVICE_UTILISATEURS : u"Service utilisateurs",
62cfa562 72 POSTE_ETAT_DRH_CONTROLE : u"Validation DRH",
d8cfc3d5
OL
73 POSTE_ETAT_ACCIOR : u"ACCIOR",
74 POSTE_ETAT_AFB : u"AFB",
62cfa562
OL
75 POSTE_ETAT_HAUTE_DIRECTION : u"Validation : Secrétaire général / Recteur",
76 POSTE_ETAT_DRH_FINALISATION : u'Retour à la DRH et région',
8fa94e8b
OL
77 }
78
56589624
OL
79#libellés états pour boutons
80POSTE_ETATS_BOUTONS = {
81 POSTE_ETAT_REFUSE : u"Refuser",
d8cfc3d5
OL
82 POSTE_ETAT_DIRECTEUR_BUREAU : u"Envoyer au directeur de bureau",
83 POSTE_ETAT_SERVICE_UTILISATEURS : u"Envoyer au service utilisateurs",
56589624
OL
84 POSTE_ETAT_ADMINISTRATEUR : u"Envoyer à l'adminstrateur",
85 POSTE_ETAT_DRH_CONTROLE : u"Envoyer à la DRH (validation)",
871be4b0
OL
86 POSTE_ETAT_ACCIOR : u"Envoyer à l'ACCIOR",
87 POSTE_ETAT_AFB : u"Envoyer à l'AFB",
56589624
OL
88 POSTE_ETAT_HAUTE_DIRECTION : u"Envoyer à la haute direction",
89 POSTE_ETAT_DRH_FINALISATION : u'Envoyer à la DRH (traitement)',
90 }
91
8fa94e8b
OL
92# définition du worflow séquentiel
93POSTE_ACTIONS = {
3799cafc
OL
94 POSTE_ACTION_ENVOYER_REFUSE : {
95 'nom' : u'Refuser',
d8cfc3d5 96 'etat_initial' : (POSTE_ETAT_DIRECTEUR_BUREAU, POSTE_ETAT_ADMINISTRATEUR, POSTE_ETAT_SERVICE_UTILISATEURS, POSTE_ETAT_DRH_CONTROLE, POSTE_ETAT_HAUTE_DIRECTION),
3799cafc
OL
97 'etat_final' : POSTE_ETAT_REFUSE,
98 },
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',
d8cfc3d5 106 'etat_initial' : (POSTE_ETAT_BROUILLON, POSTE_ETAT_REFUSE, ),
1b217058
OL
107 'etat_final' : POSTE_ETAT_ADMINISTRATEUR,
108 },
d8cfc3d5
OL
109 POSTE_ACTION_ENVOYER_SRV_UTILISATEURS : {
110 'nom' : u'Envoyer',
111 'etat_initial' : (POSTE_ETAT_ADMINISTRATEUR, POSTE_ETAT_REFUSE, ),
112 'etat_final' : POSTE_ETAT_SERVICE_UTILISATEURS,
113 },
114 POSTE_ACTION_ENVOYER_DIRECTEUR_BUREAU : {
115 'nom' : u'Envoyer',
116 'etat_initial' : (POSTE_ETAT_ADMINISTRATEUR, POSTE_ETAT_REFUSE,),
117 'etat_final' : POSTE_ETAT_DIRECTEUR_BUREAU,
118 },
1b217058
OL
119 POSTE_ACTION_ENVOYER_DRH_CONTROLE : {
120 'nom' : u'Envoyer',
42dfa870 121 'etat_initial' : (POSTE_ETAT_ADMINISTRATEUR, POSTE_ETAT_DIRECTEUR_BUREAU, POSTE_ETAT_SERVICE_UTILISATEURS, POSTE_ETAT_REFUSE, ),
1b217058
OL
122 'etat_final' : POSTE_ETAT_DRH_CONTROLE,
123 },
d8cfc3d5 124 POSTE_ACTION_ENVOYER_ACCIOR : {
1b217058 125 'nom' : u'Envoyer',
d8cfc3d5
OL
126 'etat_initial' : (POSTE_ETAT_DRH_CONTROLE, POSTE_ETAT_REFUSE, ),
127 'etat_final' : POSTE_ETAT_ACCIOR,
128 },
129 POSTE_ACTION_ENVOYER_AFB : {
130 'nom' : u'Envoyer',
131 'etat_initial' : (POSTE_ETAT_ACCIOR, POSTE_ETAT_REFUSE, ),
132 'etat_final' : POSTE_ETAT_AFB,
1b217058
OL
133 },
134 POSTE_ACTION_ENVOYER_HAUTE_DIRECTION : {
135 'nom' : u'Envoyer',
d8cfc3d5 136 'etat_initial' : (POSTE_ETAT_AFB, POSTE_ETAT_REFUSE, ),
1b217058
OL
137 'etat_final' : POSTE_ETAT_HAUTE_DIRECTION,
138 },
139 POSTE_ACTION_ENVOYER_DRH_FINALISATION : {
140 'nom' : u'Envoyer',
d8cfc3d5 141 'etat_initial' : (POSTE_ETAT_HAUTE_DIRECTION, POSTE_ETAT_REFUSE, ),
1b217058 142 'etat_final' : POSTE_ETAT_DRH_FINALISATION,
8fa94e8b
OL
143 },
144}
145
56589624 146
d8cfc3d5 147def acces_etat_refuse(f):
56589624 148 """
d8cfc3d5 149 Personne ne peut manipuler quelque chose à l'état refusé excepté la DRH et les administrateurs
56589624
OL
150 """
151 def inner(obj, action, request):
152 if obj.etat != 'REFUSE':
153 return f(obj, action, request)
d8cfc3d5
OL
154 user_groupes = request.user.groups.all()
155 if grp_drh in user_groupes or grp_administrateurs in user_groupes:
56589624
OL
156 return f(obj, action, request)
157 else:
158 return False
159 return inner
160
8fa94e8b
OL
161class PosteWorkflow(WorkflowMixin):
162 etat_initial = POSTE_ETAT_BROUILLON
163 etats = POSTE_ETATS
164 actions = POSTE_ACTIONS
165
166 class Meta:
167 abstract = True
168
3799cafc 169 def acces_refuse(self, action, request):
42dfa870 170 klass = self.__class__
d8cfc3d5 171 user_groupes = request.user.groups.all()
8ae5fbb1 172 if (grp_accior in user_groupes or grp_afb in user_groupes) and len(user_groupes) == 1:
56589624
OL
173 return False
174
175 user_groupes = request.user.groups.all()
42dfa870 176 en_cours = klass.objects.mes_choses_a_faire(request.user).all()
56589624 177 for g, etats in MAP_GROUPE_ETATS_A_FAIRE.items():
42dfa870 178 if g in user_groupes and self.etat in etats and self in en_cours:
56589624
OL
179 return True
180 return False
8fa94e8b 181
d8cfc3d5
OL
182 @acces_etat_refuse
183 def acces_directeur_bureau(self, action, request):
184 if is_user_dans_services_centraux(request.user):
185 return False
1b217058 186 for g in request.user.groups.all():
d8cfc3d5 187 if g in (grp_administrateurs, grp_drh,):
1b217058
OL
188 return True
189 return False
190
d8cfc3d5 191 @acces_etat_refuse
1b217058
OL
192 def acces_administrateur(self, action, request):
193 for g in request.user.groups.all():
d8cfc3d5 194 if g in (grp_correspondants_rh, grp_drh,):
1b217058
OL
195 return True
196 return False
197
d8cfc3d5 198 @acces_etat_refuse
1b217058
OL
199 def acces_drh_controle(self, action, request):
200 for g in request.user.groups.all():
42dfa870 201 if g in (grp_directeurs_bureau, grp_service_utilisateurs, grp_drh,) or g == grp_administrateurs and is_user_dans_region(request.user):
1b217058
OL
202 return True
203 return False
204
d8cfc3d5
OL
205 @acces_etat_refuse
206 def acces_srv_utilisateurs(self, action, request):
207 if not is_user_dans_services_centraux(request.user):
208 return False
209 for g in request.user.groups.all():
210 if g in (grp_administrateurs, grp_drh, ):
211 return True
212 return False
213
214 @acces_etat_refuse
215 def acces_accior(self, action, request):
1b217058
OL
216 for g in request.user.groups.all():
217 if g in (grp_drh, ):
218 return True
219 return False
220
d8cfc3d5
OL
221 @acces_etat_refuse
222 def acces_afb(self, action, request):
223 for g in request.user.groups.all():
224 if g in (grp_accior, grp_drh, ):
225 return True
226 return False
227
228 @acces_etat_refuse
1b217058
OL
229 def acces_haute_direction(self, action, request):
230 for g in request.user.groups.all():
d8cfc3d5 231 if g in (grp_afb, grp_drh, ):
1b217058
OL
232 return True
233 return False
234
d8cfc3d5 235 @acces_etat_refuse
1b217058
OL
236 def acces_drh_finalisation(self, action, request):
237 for g in request.user.groups.all():
238 if g in (grp_haute_direction, grp_drh, ):
239 return True
240 return False
241
242
515124ec 243#codes actions
18c6d4c0 244DOSSIER_ETAT_REFUSE = POSTE_ETAT_REFUSE
515124ec 245DOSSIER_ETAT_BROUILLON = POSTE_ETAT_BROUILLON
515124ec 246DOSSIER_ETAT_ADMINISTRATEUR = POSTE_ETAT_ADMINISTRATEUR
d8cfc3d5
OL
247DOSSIER_ETAT_DIRECTEUR_BUREAU = POSTE_ETAT_DIRECTEUR_BUREAU
248DOSSIER_ETAT_SERVICE_UTILISATEURS = POSTE_ETAT_SERVICE_UTILISATEURS
515124ec 249DOSSIER_ETAT_DRH_CONTROLE = POSTE_ETAT_DRH_CONTROLE
d8cfc3d5
OL
250DOSSIER_ETAT_ACCIOR = POSTE_ETAT_ACCIOR
251DOSSIER_ETAT_AFB = POSTE_ETAT_AFB
515124ec
OL
252DOSSIER_ETAT_HAUTE_DIRECTION = POSTE_ETAT_HAUTE_DIRECTION
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
OL
263 grp_service_utilisateurs : (POSTE_ETAT_SERVICE_UTILISATEURS, DOSSIER_ETAT_SERVICE_UTILISATEURS,),
264 grp_administrateurs : (POSTE_ETAT_ADMINISTRATEUR, DOSSIER_ETAT_ADMINISTRATEUR, ),
265 grp_directeurs_bureau : (POSTE_ETAT_DIRECTEUR_BUREAU, DOSSIER_ETAT_DIRECTEUR_BUREAU, ),
3799cafc 266 grp_drh : (POSTE_ETAT_DRH_CONTROLE, POSTE_ETAT_DRH_FINALISATION, DOSSIER_ETAT_DRH_CONTROLE, DOSSIER_ETAT_DRH_FINALISATION,),
d8cfc3d5
OL
267 grp_accior : (POSTE_ETAT_ACCIOR, DOSSIER_ETAT_ACCIOR, ),
268 grp_afb : (POSTE_ETAT_AFB, DOSSIER_ETAT_AFB, ),
3799cafc 269 grp_haute_direction : (POSTE_ETAT_HAUTE_DIRECTION, DOSSIER_ETAT_HAUTE_DIRECTION, ),
515124ec 270}
286d0aa9
OL
271
272
d8cfc3d5
OL
273ETATS_EDITABLE = (POSTE_ETAT_REFUSE, POSTE_ETAT_BROUILLON, POSTE_ETAT_ADMINISTRATEUR, POSTE_ETAT_DRH_CONTROLE, POSTE_ETAT_DIRECTEUR_BUREAU, POSTE_ETAT_SERVICE_UTILISATEURS,
274 DOSSIER_ETAT_REFUSE, DOSSIER_ETAT_BROUILLON, DOSSIER_ETAT_ADMINISTRATEUR, DOSSIER_ETAT_DRH_CONTROLE, DOSSIER_ETAT_DIRECTEUR_BUREAU, DOSSIER_ETAT_SERVICE_UTILISATEURS,
286d0aa9
OL
275)
276