1 # -*- encoding: utf-8 -*-
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
7 def safe_create_groupe(name
):
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).
13 # TODO : Refactoring : utiliser project.lib.safe_create_groupe
15 grp
, created
= Group
.objects
.get_or_create(name
=name
)
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')
31 grp_correspondants_rh
,
33 grp_directeurs_bureau
,
38 grp_service_utilisateurs
,
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'
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'
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'
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'
106 # définition du worflow séquentiel
108 POSTE_ACTION_ENVOYER_BROUILLON
: {
110 'etat_initial' : None,
111 'etat_final' : POSTE_ETAT_BROUILLON
,
113 POSTE_ACTION_ENVOYER_ADMINISTRATEUR
: {
115 'etat_initial' : (POSTE_ETAT_BROUILLON
,),
116 'etat_final' : POSTE_ETAT_ADMINISTRATEUR
,
118 POSTE_ACTION_ENVOYER_SRV_UTILISATEURS
: {
120 'etat_initial' : (POSTE_ETAT_ADMINISTRATEUR
,),
121 'etat_final' : POSTE_ETAT_SERVICE_UTILISATEURS
,
123 POSTE_ACTION_ENVOYER_DIRECTEUR_BUREAU
: {
125 'etat_initial' : (POSTE_ETAT_ADMINISTRATEUR
,),
126 'etat_final' : POSTE_ETAT_DIRECTEUR_BUREAU
,
128 POSTE_ACTION_ENVOYER_DRH_CONTROLE
: {
130 'etat_initial' : (POSTE_ETAT_ADMINISTRATEUR
, POSTE_ETAT_DIRECTEUR_BUREAU
, POSTE_ETAT_SERVICE_UTILISATEURS
),
131 'etat_final' : POSTE_ETAT_DRH_CONTROLE
,
133 POSTE_ACTION_DEMANDE_MODIF
: {
135 'etat_initial' : (POSTE_ETAT_DRH_CONTROLE
,),
136 'etat_final': POSTE_ETAT_DEMANDE_MODIF
,
138 POSTE_ACTION_RETOUR_DEMANDE_MODIF
: {
140 'etat_initial': (POSTE_ETAT_DEMANDE_MODIF
,),
141 'etat_final': POSTE_ETAT_DRH_CONTROLE
,
143 POSTE_ACTION_ENVOYER_ACCIOR
: {
145 'etat_initial' : (POSTE_ETAT_DRH_CONTROLE
,),
146 'etat_final' : POSTE_ETAT_ACCIOR
,
148 POSTE_ACTION_ENVOYER_ABF
: {
150 'etat_initial' : (POSTE_ETAT_ACCIOR
,),
151 'etat_final' : POSTE_ETAT_ABF
,
153 POSTE_ACTION_ENVOYER_HAUTE_DIRECTION
: {
155 'etat_initial' : (POSTE_ETAT_ABF
,),
156 'etat_final' : POSTE_ETAT_HAUTE_DIRECTION
,
158 POSTE_ACTION_DEMANDE_JUSTIF
: {
160 'etat_initial' : (POSTE_ETAT_HAUTE_DIRECTION
,),
161 'etat_final': POSTE_ETAT_DEMANDE_JUSTIF
,
163 POSTE_ACTION_RETOUR_DEMANDE_JUSTIF
: {
165 'etat_initial' : (POSTE_ETAT_DEMANDE_JUSTIF
,),
166 'etat_final': POSTE_ETAT_HAUTE_DIRECTION
,
168 POSTE_ACTION_ENVOYER_REGION_FINALISATION
: {
170 'etat_initial' : (POSTE_ETAT_HAUTE_DIRECTION
,),
171 'etat_final' : POSTE_ETAT_REGION_FINALISATION
173 POSTE_ACTION_ENVOYER_DRH_FINALISATION
: {
175 'etat_initial' : (POSTE_ETAT_REGION_FINALISATION
,),
176 'etat_final' : POSTE_ETAT_DRH_FINALISATION
,
178 POSTE_ACTION_FINALISER
: {
179 'nom' : u
'Finaliser',
180 'etat_initial' : (POSTE_ETAT_DRH_FINALISATION
,),
181 'etat_final' : POSTE_ETAT_FINALISE
186 class PosteWorkflow(WorkflowMixin
):
187 etat_initial
= POSTE_ETAT_BROUILLON
189 actions
= POSTE_ACTIONS
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
:
198 for g
in user_groups
:
199 if g
in (grp_administrateurs
, grp_drh
,):
203 def acces_administrateur(self
, action
, request
):
204 for g
in request
.user
.groups
.all():
205 if g
in (grp_correspondants_rh
, grp_drh
,):
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
))
215 def acces_demande_modif(self
, action
, request
):
216 return grp_drh
in request
.user
.groups
.all()
218 def acces_srv_utilisateurs(self
, action
, request
):
219 if not is_user_dans_services_centraux(request
.user
):
221 for g
in request
.user
.groups
.all():
222 if g
in (grp_administrateurs
, grp_drh
, ):
226 def acces_accior(self
, action
, request
):
227 for g
in request
.user
.groups
.all():
232 def acces_abf(self
, action
, request
):
233 for g
in request
.user
.groups
.all():
234 if g
in (grp_accior
, grp_drh
, ):
238 def acces_haute_direction(self
, action
, request
):
239 for g
in request
.user
.groups
.all():
240 if g
in (grp_abf
, grp_drh
, ):
244 def acces_region_finalisation(self
, action
, request
):
245 for g
in request
.user
.groups
.all():
246 if g
in (grp_haute_direction
, grp_drh
,):
249 def acces_drh_finalisation(self
, action
, request
):
250 for g
in request
.user
.groups
.all():
255 def acces_demande_justif(self
, action
, request
):
256 groups
= set(request
.user
.groups
.all())
257 return any(g
in groups
for g
in [grp_haute_direction
, grp_drh
])
259 def acces_retour_demande_modif(self
, action
, request
):
260 for g
in request
.user
.groups
.all():
261 if g
in (grp_administrateurs
, grp_drh
,):
265 def acces_retour_demande_justif(self
, action
, request
):
266 for g
in request
.user
.groups
.all():
271 def acces_finaliser(self
, action
, request
):
272 for g
in request
.user
.groups
.all():
279 DOSSIER_ETAT_BROUILLON
= POSTE_ETAT_BROUILLON
280 DOSSIER_ETAT_ADMINISTRATEUR
= POSTE_ETAT_ADMINISTRATEUR
281 DOSSIER_ETAT_DIRECTEUR_BUREAU
= POSTE_ETAT_DIRECTEUR_BUREAU
282 DOSSIER_ETAT_SERVICE_UTILISATEURS
= POSTE_ETAT_SERVICE_UTILISATEURS
283 DOSSIER_ETAT_DRH_CONTROLE
= POSTE_ETAT_DRH_CONTROLE
284 DOSSIER_ETAT_DEMANDE_MODIF
= POSTE_ETAT_DEMANDE_MODIF
285 DOSSIER_ETAT_ACCIOR
= POSTE_ETAT_ACCIOR
286 DOSSIER_ETAT_ABF
= POSTE_ETAT_ABF
287 DOSSIER_ETAT_HAUTE_DIRECTION
= POSTE_ETAT_HAUTE_DIRECTION
288 DOSSIER_ETAT_DEMANDE_JUSTIF
= POSTE_ETAT_DEMANDE_JUSTIF
289 DOSSIER_ETAT_REGION_FINALISATION
= POSTE_ETAT_REGION_FINALISATION
290 DOSSIER_ETAT_DRH_FINALISATION
= POSTE_ETAT_DRH_FINALISATION
291 DOSSIER_ETAT_FINALISE
= POSTE_ETAT_FINALISE
293 class DossierWorkflow(PosteWorkflow
):
299 MAP_GROUPE_ETATS_A_FAIRE
= {
300 grp_correspondants_rh
: (POSTE_ETAT_BROUILLON
, DOSSIER_ETAT_BROUILLON
, ),
301 grp_service_utilisateurs
: (POSTE_ETAT_SERVICE_UTILISATEURS
,
302 DOSSIER_ETAT_SERVICE_UTILISATEURS
,),
303 grp_administrateurs
: (POSTE_ETAT_ADMINISTRATEUR
,
304 DOSSIER_ETAT_ADMINISTRATEUR
,
305 POSTE_ETAT_DEMANDE_MODIF
,
306 DOSSIER_ETAT_DEMANDE_MODIF
,
307 POSTE_ETAT_REGION_FINALISATION
,
308 DOSSIER_ETAT_REGION_FINALISATION
,
310 grp_directeurs_bureau
: (POSTE_ETAT_DIRECTEUR_BUREAU
, DOSSIER_ETAT_DIRECTEUR_BUREAU
, ),
311 grp_drh
: (POSTE_ETAT_DRH_CONTROLE
, POSTE_ETAT_DRH_FINALISATION
,
312 DOSSIER_ETAT_DRH_CONTROLE
, DOSSIER_ETAT_DRH_FINALISATION
,
313 POSTE_ETAT_DEMANDE_JUSTIF
, DOSSIER_ETAT_DEMANDE_JUSTIF
),
314 grp_accior
: (POSTE_ETAT_ACCIOR
, DOSSIER_ETAT_ACCIOR
, ),
315 grp_abf
: (POSTE_ETAT_ABF
, DOSSIER_ETAT_ABF
, ),
316 grp_haute_direction
: (POSTE_ETAT_HAUTE_DIRECTION
, DOSSIER_ETAT_HAUTE_DIRECTION
, ),
320 ETATS_EDITABLE
= (POSTE_ETAT_BROUILLON
, POSTE_ETAT_ADMINISTRATEUR
,
321 POSTE_ETAT_DRH_CONTROLE
, POSTE_ETAT_DIRECTEUR_BUREAU
,
322 POSTE_ETAT_SERVICE_UTILISATEURS
,
323 POSTE_ETAT_DEMANDE_MODIF
,
324 POSTE_ETAT_DEMANDE_JUSTIF
,
325 DOSSIER_ETAT_BROUILLON
,
326 DOSSIER_ETAT_ADMINISTRATEUR
, DOSSIER_ETAT_DRH_CONTROLE
,
327 DOSSIER_ETAT_DIRECTEUR_BUREAU
,
328 DOSSIER_ETAT_SERVICE_UTILISATEURS
,
329 DOSSIER_ETAT_DEMANDE_MODIF
,
330 DOSSIER_ETAT_DEMANDE_JUSTIF
,
333 ETATS_VALIDE
= (DOSSIER_ETAT_REGION_FINALISATION
, DOSSIER_ETAT_DRH_FINALISATION
,
334 DOSSIER_ETAT_FINALISE
)