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).
14 grp
, created
= Group
.objects
.get_or_create(name
=name
)
19 # Groupes impliqués dans le Worflow
20 grp_correspondants_rh
= safe_create_groupe(name
='Correspondants RH')
21 grp_administrateurs
= safe_create_groupe(name
='Administrateurs')
22 grp_directeurs_bureau
= safe_create_groupe(name
='Directeurs de bureau')
23 grp_drh
= safe_create_groupe(name
='DRH')
24 grp_accior
= safe_create_groupe(name
='ACCIOR')
25 grp_abf
= safe_create_groupe(name
='ABF')
26 grp_haute_direction
= safe_create_groupe(name
='Haute direction')
27 grp_service_utilisateurs
= safe_create_groupe(name
='Service utilisateurs')
30 grp_correspondants_rh
,
32 grp_directeurs_bureau
,
37 grp_service_utilisateurs
,
41 POSTE_ETAT_BROUILLON
= 'BROUILLON'
42 POSTE_ETAT_ADMINISTRATEUR
= 'ADMINISTRATEUR'
43 POSTE_ETAT_DIRECTEUR_BUREAU
= 'DIRECTEUR_BUREAU'
44 POSTE_ETAT_SERVICE_UTILISATEURS
= 'SRV_UTILISATEURS'
45 POSTE_ETAT_DRH_CONTROLE
= 'DRH_CONTROLE'
46 POSTE_ETAT_DEMANDE_MODIF
= 'DEMANDE_MODIF'
47 POSTE_ETAT_ACCIOR
= 'ACCIOR'
48 POSTE_ETAT_ABF
= 'ABF'
49 POSTE_ETAT_HAUTE_DIRECTION
= 'HAUTE_DIRECTION'
50 POSTE_ETAT_DEMANDE_JUSTIF
= 'DEMANDE_JUSTIF'
51 POSTE_ETAT_REGION_FINALISATION
= 'REGION_FINALISATION'
52 POSTE_ETAT_DRH_FINALISATION
= 'DRH_FINALISATION'
53 POSTE_ETAT_FINALISE
= 'FINALISE'
56 POSTE_ACTION_ENVOYER_BROUILLON
= POSTE_ETAT_BROUILLON
57 POSTE_ACTION_ENVOYER_ADMINISTRATEUR
= POSTE_ETAT_ADMINISTRATEUR
58 POSTE_ACTION_ENVOYER_DIRECTEUR_BUREAU
= POSTE_ETAT_DIRECTEUR_BUREAU
59 POSTE_ACTION_ENVOYER_SRV_UTILISATEURS
= POSTE_ETAT_SERVICE_UTILISATEURS
60 POSTE_ACTION_ENVOYER_DRH_CONTROLE
= POSTE_ETAT_DRH_CONTROLE
61 POSTE_ACTION_DEMANDE_MODIF
= POSTE_ETAT_DEMANDE_MODIF
62 POSTE_ACTION_RETOUR_DEMANDE_MODIF
= 'RETOUR_DEMANDE_MODIF'
63 POSTE_ACTION_ENVOYER_ACCIOR
= POSTE_ETAT_ACCIOR
64 POSTE_ACTION_ENVOYER_ABF
= POSTE_ETAT_ABF
65 POSTE_ACTION_ENVOYER_HAUTE_DIRECTION
= POSTE_ETAT_HAUTE_DIRECTION
66 POSTE_ACTION_DEMANDE_JUSTIF
= POSTE_ETAT_DEMANDE_JUSTIF
67 POSTE_ACTION_RETOUR_DEMANDE_JUSTIF
= 'RETOUR_DEMANDE_JUSTIF'
68 POSTE_ACTION_ENVOYER_REGION_FINALISATION
= POSTE_ETAT_REGION_FINALISATION
69 POSTE_ACTION_ENVOYER_DRH_FINALISATION
= POSTE_ETAT_DRH_FINALISATION
70 POSTE_ACTION_FINALISER
= 'FINALISER'
74 POSTE_ETAT_BROUILLON
: u
"En rédaction",
75 POSTE_ETAT_ADMINISTRATEUR
: u
"Validation de l'administrateur",
76 POSTE_ETAT_DIRECTEUR_BUREAU
: u
"Directeur de bureau",
77 POSTE_ETAT_SERVICE_UTILISATEURS
: u
"Service utilisateurs",
78 POSTE_ETAT_DRH_CONTROLE
: u
"Validation DRH",
79 POSTE_ETAT_DEMANDE_MODIF
: u
"Demande de modification",
80 POSTE_ETAT_ACCIOR
: u
"ACCIOR",
81 POSTE_ETAT_ABF
: u
"ABF",
82 POSTE_ETAT_HAUTE_DIRECTION
: u
"Validation : Secrétaire général / Recteur",
83 POSTE_ETAT_DEMANDE_JUSTIF
: u
"Demande de justification",
84 POSTE_ETAT_REGION_FINALISATION
: u
'Retour à la région',
85 POSTE_ETAT_DRH_FINALISATION
: u
'Retour à la DRH',
86 POSTE_ETAT_FINALISE
: u
'Finalisée'
89 #libellés états pour boutons
90 POSTE_ETATS_BOUTONS
= {
91 POSTE_ETAT_DIRECTEUR_BUREAU
: u
"Envoyer au directeur de bureau",
92 POSTE_ETAT_SERVICE_UTILISATEURS
: u
"Envoyer au service utilisateurs",
93 POSTE_ETAT_ADMINISTRATEUR
: u
"Envoyer à l'adminstrateur",
94 POSTE_ETAT_DRH_CONTROLE
: u
"Envoyer à la DRH (validation)",
95 POSTE_ETAT_DEMANDE_MODIF
: u
"Envoyer une demande de modification",
96 POSTE_ETAT_ACCIOR
: u
"Envoyer à l'ACCIOR",
97 POSTE_ETAT_ABF
: u
"Envoyer à l'ABF",
98 POSTE_ETAT_HAUTE_DIRECTION
: u
"Envoyer à la haute direction",
99 POSTE_ETAT_DEMANDE_JUSTIF
: u
"Envoyer une demande de justification",
100 POSTE_ETAT_REGION_FINALISATION
: u
"Retourner à la région pour finalisation",
101 POSTE_ETAT_DRH_FINALISATION
: u
'Retourner à la DRH pour finalisation',
102 POSTE_ETAT_FINALISE
: u
'Finaliser'
105 # définition du worflow séquentiel
107 POSTE_ACTION_ENVOYER_BROUILLON
: {
109 'etat_initial' : None,
110 'etat_final' : POSTE_ETAT_BROUILLON
,
112 POSTE_ACTION_ENVOYER_ADMINISTRATEUR
: {
114 'etat_initial' : (POSTE_ETAT_BROUILLON
,),
115 'etat_final' : POSTE_ETAT_ADMINISTRATEUR
,
117 POSTE_ACTION_ENVOYER_SRV_UTILISATEURS
: {
119 'etat_initial' : (POSTE_ETAT_ADMINISTRATEUR
,),
120 'etat_final' : POSTE_ETAT_SERVICE_UTILISATEURS
,
122 POSTE_ACTION_ENVOYER_DIRECTEUR_BUREAU
: {
124 'etat_initial' : (POSTE_ETAT_ADMINISTRATEUR
,),
125 'etat_final' : POSTE_ETAT_DIRECTEUR_BUREAU
,
127 POSTE_ACTION_ENVOYER_DRH_CONTROLE
: {
129 'etat_initial' : (POSTE_ETAT_ADMINISTRATEUR
, POSTE_ETAT_DIRECTEUR_BUREAU
, POSTE_ETAT_SERVICE_UTILISATEURS
),
130 'etat_final' : POSTE_ETAT_DRH_CONTROLE
,
132 POSTE_ACTION_DEMANDE_MODIF
: {
134 'etat_initial' : (POSTE_ETAT_DRH_CONTROLE
,),
135 'etat_final': POSTE_ETAT_DEMANDE_MODIF
,
137 POSTE_ACTION_RETOUR_DEMANDE_MODIF
: {
139 'etat_initial': (POSTE_ETAT_DEMANDE_MODIF
,),
140 'etat_final': POSTE_ETAT_DRH_CONTROLE
,
142 POSTE_ACTION_ENVOYER_ACCIOR
: {
144 'etat_initial' : (POSTE_ETAT_DRH_CONTROLE
,),
145 'etat_final' : POSTE_ETAT_ACCIOR
,
147 POSTE_ACTION_ENVOYER_ABF
: {
149 'etat_initial' : (POSTE_ETAT_ACCIOR
,),
150 'etat_final' : POSTE_ETAT_ABF
,
152 POSTE_ACTION_ENVOYER_HAUTE_DIRECTION
: {
154 'etat_initial' : (POSTE_ETAT_ABF
,),
155 'etat_final' : POSTE_ETAT_HAUTE_DIRECTION
,
157 POSTE_ACTION_DEMANDE_JUSTIF
: {
159 'etat_initial' : (POSTE_ETAT_HAUTE_DIRECTION
,),
160 'etat_final': POSTE_ETAT_DEMANDE_JUSTIF
,
162 POSTE_ACTION_RETOUR_DEMANDE_JUSTIF
: {
164 'etat_initial' : (POSTE_ETAT_DEMANDE_JUSTIF
,),
165 'etat_final': POSTE_ETAT_HAUTE_DIRECTION
,
167 POSTE_ACTION_ENVOYER_REGION_FINALISATION
: {
169 'etat_initial' : (POSTE_ETAT_HAUTE_DIRECTION
,),
170 'etat_final' : POSTE_ETAT_REGION_FINALISATION
172 POSTE_ACTION_ENVOYER_DRH_FINALISATION
: {
174 'etat_initial' : (POSTE_ETAT_REGION_FINALISATION
,),
175 'etat_final' : POSTE_ETAT_DRH_FINALISATION
,
177 POSTE_ACTION_FINALISER
: {
178 'nom' : u
'Finaliser',
179 'etat_initial' : (POSTE_ETAT_DRH_FINALISATION
,),
180 'etat_final' : POSTE_ETAT_FINALISE
185 class PosteWorkflow(WorkflowMixin
):
186 etat_initial
= POSTE_ETAT_BROUILLON
188 actions
= POSTE_ACTIONS
193 def acces_directeur_bureau(self
, action
, request
):
194 user_groups
= request
.user
.groups
.all()
195 if is_user_dans_services_centraux(request
.user
) and grp_drh
not in user_groups
:
197 for g
in user_groups
:
198 if g
in (grp_administrateurs
, grp_drh
,):
202 def acces_administrateur(self
, action
, request
):
203 for g
in request
.user
.groups
.all():
204 if g
in (grp_correspondants_rh
, grp_drh
,):
208 def acces_drh_controle(self
, action
, request
):
209 groups
= request
.user
.groups
.all()
210 return any(g
in groups
for g
in [grp_directeurs_bureau
, grp_service_utilisateurs
, grp_drh
]) or \
211 grp_administrateurs
in groups
and (action
== POSTE_ACTION_RETOUR_DEMANDE_MODIF
or
212 is_user_dans_region(request
.user
))
214 def acces_demande_modif(self
, action
, request
):
215 return grp_drh
in request
.user
.groups
.all()
217 def acces_srv_utilisateurs(self
, action
, request
):
218 if not is_user_dans_services_centraux(request
.user
):
220 for g
in request
.user
.groups
.all():
221 if g
in (grp_administrateurs
, grp_drh
, ):
225 def acces_accior(self
, action
, request
):
226 for g
in request
.user
.groups
.all():
231 def acces_abf(self
, action
, request
):
232 for g
in request
.user
.groups
.all():
233 if g
in (grp_accior
, grp_drh
, ):
237 def acces_haute_direction(self
, action
, request
):
238 for g
in request
.user
.groups
.all():
239 if g
in (grp_abf
, grp_drh
, ):
243 def acces_region_finalisation(self
, action
, request
):
244 for g
in request
.user
.groups
.all():
245 if g
in (grp_administrateurs
, grp_drh
,):
248 def acces_drh_finalisation(self
, action
, request
):
249 return self
.acces_administrateur
251 def acces_demande_justif(self
, action
, request
):
252 groups
= set(request
.user
.groups
.all())
253 return any(g
in groups
for g
in [grp_haute_direction
, grp_drh
])
255 def acces_retour_demande_modif(self
, action
, request
):
256 for g
in request
.user
.groups
.all():
257 if g
in (grp_administrateurs
, grp_drh
,):
261 def acces_retour_demande_justif(self
, action
, request
):
262 for g
in request
.user
.groups
.all():
267 def acces_finaliser(self
, action
, request
):
268 for g
in request
.user
.groups
.all():
275 DOSSIER_ETAT_BROUILLON
= POSTE_ETAT_BROUILLON
276 DOSSIER_ETAT_ADMINISTRATEUR
= POSTE_ETAT_ADMINISTRATEUR
277 DOSSIER_ETAT_DIRECTEUR_BUREAU
= POSTE_ETAT_DIRECTEUR_BUREAU
278 DOSSIER_ETAT_SERVICE_UTILISATEURS
= POSTE_ETAT_SERVICE_UTILISATEURS
279 DOSSIER_ETAT_DRH_CONTROLE
= POSTE_ETAT_DRH_CONTROLE
280 DOSSIER_ETAT_DEMANDE_MODIF
= POSTE_ETAT_DEMANDE_MODIF
281 DOSSIER_ETAT_ACCIOR
= POSTE_ETAT_ACCIOR
282 DOSSIER_ETAT_ABF
= POSTE_ETAT_ABF
283 DOSSIER_ETAT_HAUTE_DIRECTION
= POSTE_ETAT_HAUTE_DIRECTION
284 DOSSIER_ETAT_DEMANDE_JUSTIF
= POSTE_ETAT_DEMANDE_JUSTIF
285 DOSSIER_ETAT_REGION_FINALISATION
= POSTE_ETAT_REGION_FINALISATION
286 DOSSIER_ETAT_DRH_FINALISATION
= POSTE_ETAT_DRH_FINALISATION
287 DOSSIER_ETAT_FINALISE
= POSTE_ETAT_FINALISE
289 class DossierWorkflow(PosteWorkflow
):
295 MAP_GROUPE_ETATS_A_FAIRE
= {
296 grp_correspondants_rh
: (POSTE_ETAT_BROUILLON
, DOSSIER_ETAT_BROUILLON
, ),
297 grp_service_utilisateurs
: (POSTE_ETAT_SERVICE_UTILISATEURS
,
298 DOSSIER_ETAT_SERVICE_UTILISATEURS
,),
299 grp_administrateurs
: (POSTE_ETAT_ADMINISTRATEUR
,
300 DOSSIER_ETAT_ADMINISTRATEUR
,
301 POSTE_ETAT_DEMANDE_MODIF
,
302 DOSSIER_ETAT_DEMANDE_MODIF
,
303 POSTE_ETAT_REGION_FINALISATION
,
304 DOSSIER_ETAT_REGION_FINALISATION
,
306 grp_directeurs_bureau
: (POSTE_ETAT_DIRECTEUR_BUREAU
, DOSSIER_ETAT_DIRECTEUR_BUREAU
, ),
307 grp_drh
: (POSTE_ETAT_DRH_CONTROLE
, POSTE_ETAT_DRH_FINALISATION
,
308 DOSSIER_ETAT_DRH_CONTROLE
, DOSSIER_ETAT_DRH_FINALISATION
,
309 POSTE_ETAT_DEMANDE_JUSTIF
, DOSSIER_ETAT_DEMANDE_JUSTIF
),
310 grp_accior
: (POSTE_ETAT_ACCIOR
, DOSSIER_ETAT_ACCIOR
, ),
311 grp_abf
: (POSTE_ETAT_ABF
, DOSSIER_ETAT_ABF
, ),
312 grp_haute_direction
: (POSTE_ETAT_HAUTE_DIRECTION
, DOSSIER_ETAT_HAUTE_DIRECTION
, ),
316 ETATS_EDITABLE
= (POSTE_ETAT_BROUILLON
, POSTE_ETAT_ADMINISTRATEUR
,
317 POSTE_ETAT_DRH_CONTROLE
, POSTE_ETAT_DIRECTEUR_BUREAU
,
318 POSTE_ETAT_SERVICE_UTILISATEURS
,
319 POSTE_ETAT_DEMANDE_MODIF
,
320 POSTE_ETAT_DEMANDE_JUSTIF
,
321 DOSSIER_ETAT_BROUILLON
,
322 DOSSIER_ETAT_ADMINISTRATEUR
, DOSSIER_ETAT_DRH_CONTROLE
,
323 DOSSIER_ETAT_DIRECTEUR_BUREAU
,
324 DOSSIER_ETAT_SERVICE_UTILISATEURS
,
325 DOSSIER_ETAT_DEMANDE_MODIF
,
326 DOSSIER_ETAT_DEMANDE_JUSTIF
,
329 ETATS_VALIDE
= (DOSSIER_ETAT_REGION_FINALISATION
, DOSSIER_ETAT_DRH_FINALISATION
,
330 DOSSIER_ETAT_FINALISE
)