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