[#2206] Remplacer l'état "refusé" par les deux états "demande de modification" et...
[auf_rh_dae.git] / project / dae / workflow.py
1 # -*- encoding: utf-8 -*-
2
3 from django.contrib.auth.models import Group
4 from auf.django.workflow.models import WorkflowMixin
5 from utils import is_user_dans_services_centraux, is_user_dans_region
6
7 def 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 # TODO : Refactoring : utiliser project.lib.safe_create_groupe
14 try:
15 grp, created = Group.objects.get_or_create(name=name)
16 except:
17 return None
18 return grp
19
20 # Groupes impliqués dans le Worflow
21 grp_correspondants_rh = safe_create_groupe(name='Correspondants RH')
22 grp_administrateurs = safe_create_groupe(name='Administrateurs')
23 grp_directeurs_bureau = safe_create_groupe(name='Directeurs de bureau')
24 grp_drh = safe_create_groupe(name='DRH')
25 grp_accior = safe_create_groupe(name='ACCIOR')
26 grp_abf = safe_create_groupe(name='ABF')
27 grp_haute_direction = safe_create_groupe(name='Haute direction')
28 grp_service_utilisateurs = safe_create_groupe(name='Service utilisateurs')
29
30 dae_groupes = (
31 grp_correspondants_rh,
32 grp_administrateurs,
33 grp_directeurs_bureau,
34 grp_drh,
35 grp_accior,
36 grp_abf,
37 grp_haute_direction,
38 grp_service_utilisateurs,
39 )
40
41 # codes états
42 POSTE_ETAT_BROUILLON = 'BROUILLON'
43 POSTE_ETAT_ADMINISTRATEUR = 'ADMINISTRATEUR'
44 POSTE_ETAT_DIRECTEUR_BUREAU = 'DIRECTEUR_BUREAU'
45 POSTE_ETAT_SERVICE_UTILISATEURS = 'SRV_UTILISATEURS'
46 POSTE_ETAT_DRH_CONTROLE = 'DRH_CONTROLE'
47 POSTE_ETAT_DEMANDE_MODIF = 'DEMANDE_MODIF'
48 POSTE_ETAT_ACCIOR = 'ACCIOR'
49 POSTE_ETAT_ABF = 'ABF'
50 POSTE_ETAT_HAUTE_DIRECTION = 'HAUTE_DIRECTION'
51 POSTE_ETAT_DEMANDE_JUSTIF = 'DEMANDE_JUSTIF'
52 POSTE_ETAT_DRH_FINALISATION = 'DRH_FINALISATION'
53
54 #codes actions
55 POSTE_ACTION_ENVOYER_BROUILLON = POSTE_ETAT_BROUILLON
56 POSTE_ACTION_ENVOYER_ADMINISTRATEUR = POSTE_ETAT_ADMINISTRATEUR
57 POSTE_ACTION_ENVOYER_DIRECTEUR_BUREAU = POSTE_ETAT_DIRECTEUR_BUREAU
58 POSTE_ACTION_ENVOYER_SRV_UTILISATEURS = POSTE_ETAT_SERVICE_UTILISATEURS
59 POSTE_ACTION_ENVOYER_DRH_CONTROLE = POSTE_ETAT_DRH_CONTROLE
60 POSTE_ACTION_DEMANDE_MODIF = POSTE_ETAT_DEMANDE_MODIF
61 POSTE_ACTION_RETOUR_DEMANDE_MODIF = 'RETOUR_DEMANDE_MODIF'
62 POSTE_ACTION_ENVOYER_ACCIOR = POSTE_ETAT_ACCIOR
63 POSTE_ACTION_ENVOYER_ABF = POSTE_ETAT_ABF
64 POSTE_ACTION_ENVOYER_HAUTE_DIRECTION = POSTE_ETAT_HAUTE_DIRECTION
65 POSTE_ACTION_DEMANDE_JUSTIF = POSTE_ETAT_DEMANDE_JUSTIF
66 POSTE_ACTION_RETOUR_DEMANDE_JUSTIF = 'RETOUR_DEMANDE_JUSTIF'
67 POSTE_ACTION_ENVOYER_DRH_FINALISATION = POSTE_ETAT_DRH_FINALISATION
68
69 #libellés états
70 POSTE_ETATS = {
71 POSTE_ETAT_BROUILLON : u"En rédaction",
72 POSTE_ETAT_ADMINISTRATEUR : u"Validation de l'adminstrateur",
73 POSTE_ETAT_DIRECTEUR_BUREAU : u"Directeur de bureau",
74 POSTE_ETAT_SERVICE_UTILISATEURS : u"Service utilisateurs",
75 POSTE_ETAT_DRH_CONTROLE : u"Validation DRH",
76 POSTE_ETAT_DEMANDE_MODIF : u"Demande de modification",
77 POSTE_ETAT_ACCIOR : u"ACCIOR",
78 POSTE_ETAT_ABF : u"ABF",
79 POSTE_ETAT_HAUTE_DIRECTION : u"Validation : Secrétaire général / Recteur",
80 POSTE_ETAT_DEMANDE_JUSTIF : u"Demande de justification",
81 POSTE_ETAT_DRH_FINALISATION : u'Retour à la DRH et région',
82 }
83
84 #libellés états pour boutons
85 POSTE_ETATS_BOUTONS = {
86 POSTE_ETAT_DIRECTEUR_BUREAU : u"Envoyer au directeur de bureau",
87 POSTE_ETAT_SERVICE_UTILISATEURS : u"Envoyer au service utilisateurs",
88 POSTE_ETAT_ADMINISTRATEUR : u"Envoyer à l'adminstrateur",
89 POSTE_ETAT_DRH_CONTROLE : u"Envoyer à la DRH (validation)",
90 POSTE_ETAT_DEMANDE_MODIF : u"Envoyer une demande de modification",
91 POSTE_ETAT_ACCIOR : u"Envoyer à l'ACCIOR",
92 POSTE_ETAT_ABF : u"Envoyer à l'ABF",
93 POSTE_ETAT_HAUTE_DIRECTION : u"Envoyer à la haute direction",
94 POSTE_ETAT_DEMANDE_JUSTIF : u"Envoyer une demande de justification",
95 POSTE_ETAT_DRH_FINALISATION : u'Envoyer à la DRH (traitement)',
96 }
97
98 # définition du worflow séquentiel
99 POSTE_ACTIONS = {
100 POSTE_ACTION_ENVOYER_BROUILLON : {
101 'nom' : u'Créer',
102 'etat_initial' : None,
103 'etat_final' : POSTE_ETAT_BROUILLON,
104 },
105 POSTE_ACTION_ENVOYER_ADMINISTRATEUR : {
106 'nom' : u'Envoyer',
107 'etat_initial' : (POSTE_ETAT_BROUILLON,),
108 'etat_final' : POSTE_ETAT_ADMINISTRATEUR,
109 },
110 POSTE_ACTION_ENVOYER_SRV_UTILISATEURS : {
111 'nom' : u'Envoyer',
112 'etat_initial' : (POSTE_ETAT_ADMINISTRATEUR,),
113 'etat_final' : POSTE_ETAT_SERVICE_UTILISATEURS,
114 },
115 POSTE_ACTION_ENVOYER_DIRECTEUR_BUREAU : {
116 'nom' : u'Envoyer',
117 'etat_initial' : (POSTE_ETAT_ADMINISTRATEUR,),
118 'etat_final' : POSTE_ETAT_DIRECTEUR_BUREAU,
119 },
120 POSTE_ACTION_ENVOYER_DRH_CONTROLE : {
121 'nom' : u'Envoyer',
122 'etat_initial' : (POSTE_ETAT_ADMINISTRATEUR, POSTE_ETAT_DIRECTEUR_BUREAU, POSTE_ETAT_SERVICE_UTILISATEURS),
123 'etat_final' : POSTE_ETAT_DRH_CONTROLE,
124 },
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 },
135 POSTE_ACTION_ENVOYER_ACCIOR : {
136 'nom' : u'Envoyer',
137 'etat_initial' : (POSTE_ETAT_DRH_CONTROLE,),
138 'etat_final' : POSTE_ETAT_ACCIOR,
139 },
140 POSTE_ACTION_ENVOYER_ABF : {
141 'nom' : u'Envoyer',
142 'etat_initial' : (POSTE_ETAT_ACCIOR,),
143 'etat_final' : POSTE_ETAT_ABF,
144 },
145 POSTE_ACTION_ENVOYER_HAUTE_DIRECTION : {
146 'nom' : u'Envoyer',
147 'etat_initial' : (POSTE_ETAT_ABF,),
148 'etat_final' : POSTE_ETAT_HAUTE_DIRECTION,
149 },
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 },
160 POSTE_ACTION_ENVOYER_DRH_FINALISATION : {
161 'nom' : u'Envoyer',
162 'etat_initial' : (POSTE_ETAT_HAUTE_DIRECTION,),
163 'etat_final' : POSTE_ETAT_DRH_FINALISATION,
164 },
165 }
166
167
168 class PosteWorkflow(WorkflowMixin):
169 etat_initial = POSTE_ETAT_BROUILLON
170 etats = POSTE_ETATS
171 actions = POSTE_ACTIONS
172
173 class Meta:
174 abstract = True
175
176 def acces_directeur_bureau(self, action, request):
177 if is_user_dans_services_centraux(request.user):
178 return False
179 for g in request.user.groups.all():
180 if g in (grp_administrateurs, grp_drh,):
181 return True
182 return False
183
184 def acces_administrateur(self, action, request):
185 for g in request.user.groups.all():
186 if g in (grp_correspondants_rh, grp_drh,):
187 return True
188 return False
189
190 def acces_drh_controle(self, action, request):
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()
198
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
207 def acces_accior(self, action, request):
208 for g in request.user.groups.all():
209 if g in (grp_drh, ):
210 return True
211 return False
212
213 def acces_abf(self, action, request):
214 for g in request.user.groups.all():
215 if g in (grp_accior, grp_drh, ):
216 return True
217 return False
218
219 def acces_haute_direction(self, action, request):
220 for g in request.user.groups.all():
221 if g in (grp_abf, grp_drh, ):
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
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
241
242 #codes actions
243 DOSSIER_ETAT_BROUILLON = POSTE_ETAT_BROUILLON
244 DOSSIER_ETAT_ADMINISTRATEUR = POSTE_ETAT_ADMINISTRATEUR
245 DOSSIER_ETAT_DIRECTEUR_BUREAU = POSTE_ETAT_DIRECTEUR_BUREAU
246 DOSSIER_ETAT_SERVICE_UTILISATEURS = POSTE_ETAT_SERVICE_UTILISATEURS
247 DOSSIER_ETAT_DRH_CONTROLE = POSTE_ETAT_DRH_CONTROLE
248 DOSSIER_ETAT_DEMANDE_MODIF = POSTE_ETAT_DEMANDE_MODIF
249 DOSSIER_ETAT_ACCIOR = POSTE_ETAT_ACCIOR
250 DOSSIER_ETAT_ABF = POSTE_ETAT_ABF
251 DOSSIER_ETAT_HAUTE_DIRECTION = POSTE_ETAT_HAUTE_DIRECTION
252 DOSSIER_ETAT_DEMANDE_JUSTIF = POSTE_ETAT_DEMANDE_JUSTIF
253 DOSSIER_ETAT_DRH_FINALISATION = POSTE_ETAT_DRH_FINALISATION
254
255 class DossierWorkflow(PosteWorkflow):
256
257 class Meta:
258 abstract = True
259
260
261 MAP_GROUPE_ETATS_A_FAIRE = {
262 grp_correspondants_rh : (POSTE_ETAT_BROUILLON, DOSSIER_ETAT_BROUILLON, ),
263 grp_service_utilisateurs : (POSTE_ETAT_SERVICE_UTILISATEURS, DOSSIER_ETAT_SERVICE_UTILISATEURS,),
264 grp_administrateurs : (POSTE_ETAT_ADMINISTRATEUR, DOSSIER_ETAT_ADMINISTRATEUR, POSTE_ETAT_DEMANDE_MODIF,
265 DOSSIER_ETAT_DEMANDE_MODIF),
266 grp_directeurs_bureau : (POSTE_ETAT_DIRECTEUR_BUREAU, DOSSIER_ETAT_DIRECTEUR_BUREAU, ),
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),
269 grp_accior : (POSTE_ETAT_ACCIOR, DOSSIER_ETAT_ACCIOR, ),
270 grp_abf : (POSTE_ETAT_ABF, DOSSIER_ETAT_ABF, ),
271 grp_haute_direction : (POSTE_ETAT_HAUTE_DIRECTION, DOSSIER_ETAT_HAUTE_DIRECTION, ),
272 }
273
274
275 ETATS_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,
286 )
287