Merge branch 'dev' of ssh://git.auf/auf_rh_dae into dev
[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
OL
4from auf.django.workflow.models import WorkflowMixin
5
33b0b6af
OL
6def safe_create_groupe(name):
7 """
8 Création d'un groupe prédéfini. Retourne None, quand la création
9 ne peut se faire. (C'est le cas au syncdb, quand la table de groupe
10 n'a pas été crée encore).
11 """
12 try:
13 grp, created = Group.objects.get_or_create(name=name)
14 except:
15 return None
16 return grp
17
1b217058 18# Groupes impliqués dans le Worflow
33b0b6af
OL
19grp_administrateurs = safe_create_groupe(name='Administrateurs')
20grp_gestionnaires = safe_create_groupe(name='Gestionnaires')
21grp_directeurs_bureau = safe_create_groupe(name='Directeurs de bureau')
22grp_drh = safe_create_groupe(name='DRH')
23grp_pole_financier = safe_create_groupe(name='Pôle financier')
24grp_haute_direction = safe_create_groupe(name='Haute direction')
25grp_service_utilisateurs = safe_create_groupe(name='Service utilisateurs')
26grp_directeurs_service = safe_create_groupe(name='Directeurs de service / pôle')
27grp_correspondants_rh = safe_create_groupe(name='Correspondants RH')
1b217058
OL
28
29dae_groupes = (grp_administrateurs, grp_gestionnaires, grp_directeurs_bureau, grp_drh,
30 grp_pole_financier, grp_haute_direction, grp_service_utilisateurs,
31 grp_directeurs_service, grp_correspondants_rh, )
8fa94e8b
OL
32
33# codes états
3799cafc 34POSTE_ETAT_REFUSE = 'REFUSE'
8fa94e8b 35POSTE_ETAT_BROUILLON = 'BROUILLON'
1b217058
OL
36POSTE_ETAT_DIRECTEUR_BUREAU_OU_SERVICE = 'DIRECTEUR_BUR_SRV'
37POSTE_ETAT_ADMINISTRATEUR = 'ADMINISTRATEUR'
38POSTE_ETAT_DRH_CONTROLE = 'DRH_CONTROLE'
39POSTE_ETAT_POLE_FINANCIER = 'FINANCE'
40POSTE_ETAT_HAUTE_DIRECTION = 'HAUTE_DIRECTION'
41POSTE_ETAT_DRH_FINALISATION = 'DRH_FINALISATION'
42
43#codes actions
3799cafc 44POSTE_ACTION_ENVOYER_REFUSE = POSTE_ETAT_REFUSE
1b217058
OL
45POSTE_ACTION_ENVOYER_BROUILLON = POSTE_ETAT_BROUILLON
46POSTE_ACTION_ENVOYER_DIRECTEUR_BUREAU_OU_SERVICE = POSTE_ETAT_DIRECTEUR_BUREAU_OU_SERVICE
47POSTE_ACTION_ENVOYER_ADMINISTRATEUR = POSTE_ETAT_ADMINISTRATEUR
48POSTE_ACTION_ENVOYER_DRH_CONTROLE = POSTE_ETAT_DRH_CONTROLE
49POSTE_ACTION_ENVOYER_POLE_FINANCIER = POSTE_ETAT_POLE_FINANCIER
50POSTE_ACTION_ENVOYER_HAUTE_DIRECTION = POSTE_ETAT_HAUTE_DIRECTION
51POSTE_ACTION_ENVOYER_DRH_FINALISATION = POSTE_ETAT_DRH_FINALISATION
8fa94e8b
OL
52
53#libellés états
54POSTE_ETATS = {
3799cafc
OL
55 POSTE_ETAT_REFUSE : u"Refusé",
56 POSTE_ETAT_BROUILLON : u"En rédaction",
62cfa562
OL
57 POSTE_ETAT_DIRECTEUR_BUREAU_OU_SERVICE : u"Directeur de bureau, pôle ou service",
58 POSTE_ETAT_ADMINISTRATEUR : u"Validation de l'adminstrateur",
59 POSTE_ETAT_DRH_CONTROLE : u"Validation DRH",
60 POSTE_ETAT_POLE_FINANCIER : u"Pôle finances",
61 POSTE_ETAT_HAUTE_DIRECTION : u"Validation : Secrétaire général / Recteur",
62 POSTE_ETAT_DRH_FINALISATION : u'Retour à la DRH et région',
8fa94e8b
OL
63 }
64
65# définition du worflow séquentiel
66POSTE_ACTIONS = {
3799cafc
OL
67 POSTE_ACTION_ENVOYER_REFUSE : {
68 'nom' : u'Refuser',
69 'etat_initial' : (POSTE_ETAT_DIRECTEUR_BUREAU_OU_SERVICE, POSTE_ETAT_ADMINISTRATEUR, POSTE_ETAT_DRH_CONTROLE, POSTE_ETAT_POLE_FINANCIER, POSTE_ETAT_HAUTE_DIRECTION),
70 'etat_final' : POSTE_ETAT_REFUSE,
71 },
1b217058 72 POSTE_ACTION_ENVOYER_BROUILLON : {
8fa94e8b
OL
73 'nom' : u'Créer',
74 'etat_initial' : None,
75 'etat_final' : POSTE_ETAT_BROUILLON,
76 },
1b217058
OL
77 POSTE_ACTION_ENVOYER_DIRECTEUR_BUREAU_OU_SERVICE : {
78 'nom' : u'Envoyer',
8fa94e8b 79 'etat_initial' : POSTE_ETAT_BROUILLON,
1b217058
OL
80 'etat_final' : POSTE_ETAT_DIRECTEUR_BUREAU_OU_SERVICE,
81 },
82 POSTE_ACTION_ENVOYER_ADMINISTRATEUR : {
83 'nom' : u'Envoyer',
84 'etat_initial' : POSTE_ETAT_DIRECTEUR_BUREAU_OU_SERVICE,
85 'etat_final' : POSTE_ETAT_ADMINISTRATEUR,
86 },
87 POSTE_ACTION_ENVOYER_DRH_CONTROLE : {
88 'nom' : u'Envoyer',
89 'etat_initial' : (POSTE_ETAT_DIRECTEUR_BUREAU_OU_SERVICE, POSTE_ETAT_ADMINISTRATEUR, ),
90 'etat_final' : POSTE_ETAT_DRH_CONTROLE,
91 },
92 POSTE_ACTION_ENVOYER_POLE_FINANCIER : {
93 'nom' : u'Envoyer',
94 'etat_initial' : POSTE_ETAT_DRH_CONTROLE,
95 'etat_final' : POSTE_ETAT_POLE_FINANCIER,
96 },
97 POSTE_ACTION_ENVOYER_HAUTE_DIRECTION : {
98 'nom' : u'Envoyer',
99 'etat_initial' : POSTE_ETAT_POLE_FINANCIER,
100 'etat_final' : POSTE_ETAT_HAUTE_DIRECTION,
101 },
102 POSTE_ACTION_ENVOYER_DRH_FINALISATION : {
103 'nom' : u'Envoyer',
104 'etat_initial' : POSTE_ETAT_HAUTE_DIRECTION,
105 'etat_final' : POSTE_ETAT_DRH_FINALISATION,
8fa94e8b
OL
106 },
107}
108
109class PosteWorkflow(WorkflowMixin):
110 etat_initial = POSTE_ETAT_BROUILLON
111 etats = POSTE_ETATS
112 actions = POSTE_ACTIONS
113
114 class Meta:
115 abstract = True
116
3799cafc
OL
117 def acces_refuse(self, action, request):
118 return True
8fa94e8b 119
1b217058
OL
120 def acces_directeur_bur_srv(self, action, request):
121 for g in request.user.groups.all():
122 if g in (grp_administrateurs, grp_gestionnaires, grp_service_utilisateurs, grp_correspondants_rh, grp_drh,):
123 return True
124 return False
125
126 def acces_administrateur(self, action, request):
127 for g in request.user.groups.all():
128 if g in (grp_directeurs_service, grp_drh,):
129 return True
130 return False
131
132 def acces_drh_controle(self, action, request):
133 for g in request.user.groups.all():
134 if g in (grp_directeurs_bureau, grp_administrateurs, grp_drh,):
135 return True
136 return False
137
138 def acces_finance(self, action, request):
139 for g in request.user.groups.all():
140 if g in (grp_drh, ):
141 return True
142 return False
143
144 def acces_haute_direction(self, action, request):
145 for g in request.user.groups.all():
146 if g in (grp_pole_financier, grp_drh, ):
147 return True
148 return False
149
150 def acces_drh_finalisation(self, action, request):
151 for g in request.user.groups.all():
152 if g in (grp_haute_direction, grp_drh, ):
153 return True
154 return False
155
156
515124ec
OL
157#codes actions
158DOSSIER_ETAT_BROUILLON = POSTE_ETAT_BROUILLON
159DOSSIER_ETAT_DIRECTEUR_BUREAU_OU_SERVICE = POSTE_ETAT_DIRECTEUR_BUREAU_OU_SERVICE
160DOSSIER_ETAT_ADMINISTRATEUR = POSTE_ETAT_ADMINISTRATEUR
161DOSSIER_ETAT_DRH_CONTROLE = POSTE_ETAT_DRH_CONTROLE
162DOSSIER_ETAT_POLE_FINANCIER = POSTE_ETAT_POLE_FINANCIER
163DOSSIER_ETAT_HAUTE_DIRECTION = POSTE_ETAT_HAUTE_DIRECTION
164DOSSIER_ETAT_DRH_FINALISATION = POSTE_ETAT_DRH_FINALISATION
afc204bf
OL
165
166class DossierWorkflow(PosteWorkflow):
167
168 class Meta:
169 abstract = True
515124ec
OL
170
171 def save(self, force_insert=False, force_update=False, using=None):
172 """
173 Lorsqu'un dossier est retenu, on flag le poste pourvu
174 """
175 super(PosteWorkflow, self).save(force_insert, force_update, using)
176 if self.etat == DOSSIER_ETAT_DRH_FINALISATION:
177 self.poste.pourvu = True
178 self.poste.save()
179
180
181MAP_GROUPE_ETATS_A_FAIRE = {
182 grp_gestionnaires : (),
183 grp_service_utilisateurs : (),
184 grp_correspondants_rh : (),
3799cafc
OL
185 grp_administrateurs : (POSTE_ETAT_ADMINISTRATEUR, DOSSIER_ETAT_ADMINISTRATEUR,),
186 grp_directeurs_bureau : (POSTE_ETAT_DIRECTEUR_BUREAU_OU_SERVICE, DOSSIER_ETAT_DIRECTEUR_BUREAU_OU_SERVICE,),
187 grp_drh : (POSTE_ETAT_DRH_CONTROLE, POSTE_ETAT_DRH_FINALISATION, DOSSIER_ETAT_DRH_CONTROLE, DOSSIER_ETAT_DRH_FINALISATION,),
188 grp_pole_financier : (POSTE_ETAT_POLE_FINANCIER, DOSSIER_ETAT_POLE_FINANCIER, ),
189 grp_haute_direction : (POSTE_ETAT_HAUTE_DIRECTION, DOSSIER_ETAT_HAUTE_DIRECTION, ),
190 grp_directeurs_service : (POSTE_ETAT_DIRECTEUR_BUREAU_OU_SERVICE, DOSSIER_ETAT_DIRECTEUR_BUREAU_OU_SERVICE,),
515124ec 191}
286d0aa9
OL
192
193
194ETATS_EDITABLE = (POSTE_ETAT_BROUILLON, POSTE_ETAT_ADMINISTRATEUR, POSTE_ETAT_DRH_CONTROLE, POSTE_ETAT_DIRECTEUR_BUREAU_OU_SERVICE,
195 DOSSIER_ETAT_BROUILLON, DOSSIER_ETAT_ADMINISTRATEUR, DOSSIER_ETAT_DRH_CONTROLE, DOSSIER_ETAT_DIRECTEUR_BUREAU_OU_SERVICE,
196)
197