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