Commit | Line | Data |
---|---|---|
8fa94e8b OL |
1 | # -*- encoding: utf-8 -*- |
2 | ||
1b217058 | 3 | from django.contrib.auth.models import Group |
8fa94e8b | 4 | from auf.django.workflow.models import WorkflowMixin |
d8cfc3d5 | 5 | from utils import is_user_dans_services_centraux |
8fa94e8b | 6 | |
33b0b6af OL |
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 | try: | |
14 | grp, created = Group.objects.get_or_create(name=name) | |
15 | except: | |
16 | return None | |
17 | return grp | |
18 | ||
1b217058 | 19 | # Groupes impliqués dans le Worflow |
d8cfc3d5 | 20 | grp_correspondants_rh = safe_create_groupe(name='Correspondants RH') |
33b0b6af | 21 | grp_administrateurs = safe_create_groupe(name='Administrateurs') |
33b0b6af OL |
22 | grp_directeurs_bureau = safe_create_groupe(name='Directeurs de bureau') |
23 | grp_drh = safe_create_groupe(name='DRH') | |
d8cfc3d5 OL |
24 | grp_accior = safe_create_groupe(name='ACCIOR') |
25 | grp_afb = safe_create_groupe(name='AFB') | |
33b0b6af OL |
26 | grp_haute_direction = safe_create_groupe(name='Haute direction') |
27 | grp_service_utilisateurs = safe_create_groupe(name='Service utilisateurs') | |
1b217058 | 28 | |
d8cfc3d5 OL |
29 | dae_groupes = (grp_administrateurs, grp_directeurs_bureau, grp_drh, |
30 | grp_accior, grp_afb, grp_haute_direction, grp_service_utilisateurs, | |
31 | grp_correspondants_rh, ) | |
8fa94e8b OL |
32 | |
33 | # codes états | |
3799cafc | 34 | POSTE_ETAT_REFUSE = 'REFUSE' |
8fa94e8b | 35 | POSTE_ETAT_BROUILLON = 'BROUILLON' |
1b217058 | 36 | POSTE_ETAT_ADMINISTRATEUR = 'ADMINISTRATEUR' |
d8cfc3d5 OL |
37 | POSTE_ETAT_DIRECTEUR_BUREAU = 'DIRECTEUR_BUREAU' |
38 | POSTE_ETAT_SERVICE_UTILISATEURS = 'SRV_UTILISATEURS' | |
1b217058 | 39 | POSTE_ETAT_DRH_CONTROLE = 'DRH_CONTROLE' |
d8cfc3d5 OL |
40 | POSTE_ETAT_ACCIOR = 'ACCIOR' |
41 | POSTE_ETAT_AFB = 'AFB' | |
1b217058 OL |
42 | POSTE_ETAT_HAUTE_DIRECTION = 'HAUTE_DIRECTION' |
43 | POSTE_ETAT_DRH_FINALISATION = 'DRH_FINALISATION' | |
44 | ||
45 | #codes actions | |
3799cafc | 46 | POSTE_ACTION_ENVOYER_REFUSE = POSTE_ETAT_REFUSE |
1b217058 | 47 | POSTE_ACTION_ENVOYER_BROUILLON = POSTE_ETAT_BROUILLON |
1b217058 | 48 | POSTE_ACTION_ENVOYER_ADMINISTRATEUR = POSTE_ETAT_ADMINISTRATEUR |
d8cfc3d5 OL |
49 | POSTE_ACTION_ENVOYER_DIRECTEUR_BUREAU = POSTE_ETAT_DIRECTEUR_BUREAU |
50 | POSTE_ACTION_ENVOYER_SRV_UTILISATEURS = POSTE_ETAT_SERVICE_UTILISATEURS | |
1b217058 | 51 | POSTE_ACTION_ENVOYER_DRH_CONTROLE = POSTE_ETAT_DRH_CONTROLE |
d8cfc3d5 OL |
52 | POSTE_ACTION_ENVOYER_ACCIOR = POSTE_ETAT_ACCIOR |
53 | POSTE_ACTION_ENVOYER_AFB = POSTE_ETAT_AFB | |
1b217058 OL |
54 | POSTE_ACTION_ENVOYER_HAUTE_DIRECTION = POSTE_ETAT_HAUTE_DIRECTION |
55 | POSTE_ACTION_ENVOYER_DRH_FINALISATION = POSTE_ETAT_DRH_FINALISATION | |
8fa94e8b OL |
56 | |
57 | #libellés états | |
58 | POSTE_ETATS = { | |
3799cafc OL |
59 | POSTE_ETAT_REFUSE : u"Refusé", |
60 | POSTE_ETAT_BROUILLON : u"En rédaction", | |
62cfa562 | 61 | POSTE_ETAT_ADMINISTRATEUR : u"Validation de l'adminstrateur", |
d8cfc3d5 OL |
62 | POSTE_ETAT_DIRECTEUR_BUREAU : u"Directeur de bureau", |
63 | POSTE_ETAT_SERVICE_UTILISATEURS : u"Service utilisateurs", | |
62cfa562 | 64 | POSTE_ETAT_DRH_CONTROLE : u"Validation DRH", |
d8cfc3d5 OL |
65 | POSTE_ETAT_ACCIOR : u"ACCIOR", |
66 | POSTE_ETAT_AFB : u"AFB", | |
62cfa562 OL |
67 | POSTE_ETAT_HAUTE_DIRECTION : u"Validation : Secrétaire général / Recteur", |
68 | POSTE_ETAT_DRH_FINALISATION : u'Retour à la DRH et région', | |
8fa94e8b OL |
69 | } |
70 | ||
56589624 OL |
71 | #libellés états pour boutons |
72 | POSTE_ETATS_BOUTONS = { | |
73 | POSTE_ETAT_REFUSE : u"Refuser", | |
d8cfc3d5 OL |
74 | POSTE_ETAT_DIRECTEUR_BUREAU : u"Envoyer au directeur de bureau", |
75 | POSTE_ETAT_SERVICE_UTILISATEURS : u"Envoyer au service utilisateurs", | |
56589624 OL |
76 | POSTE_ETAT_ADMINISTRATEUR : u"Envoyer à l'adminstrateur", |
77 | POSTE_ETAT_DRH_CONTROLE : u"Envoyer à la DRH (validation)", | |
d8cfc3d5 OL |
78 | POSTE_ETAT_ACCIOR : u"Envoyer à l'ACCIOR", |
79 | POSTE_ETAT_AFB : u"Envoyer à l'AFB", | |
56589624 OL |
80 | POSTE_ETAT_HAUTE_DIRECTION : u"Envoyer à la haute direction", |
81 | POSTE_ETAT_DRH_FINALISATION : u'Envoyer à la DRH (traitement)', | |
82 | } | |
83 | ||
8fa94e8b OL |
84 | # définition du worflow séquentiel |
85 | POSTE_ACTIONS = { | |
3799cafc OL |
86 | POSTE_ACTION_ENVOYER_REFUSE : { |
87 | 'nom' : u'Refuser', | |
d8cfc3d5 | 88 | 'etat_initial' : (POSTE_ETAT_DIRECTEUR_BUREAU, POSTE_ETAT_ADMINISTRATEUR, POSTE_ETAT_SERVICE_UTILISATEURS, POSTE_ETAT_DRH_CONTROLE, POSTE_ETAT_HAUTE_DIRECTION), |
3799cafc OL |
89 | 'etat_final' : POSTE_ETAT_REFUSE, |
90 | }, | |
1b217058 | 91 | POSTE_ACTION_ENVOYER_BROUILLON : { |
8fa94e8b OL |
92 | 'nom' : u'Créer', |
93 | 'etat_initial' : None, | |
94 | 'etat_final' : POSTE_ETAT_BROUILLON, | |
95 | }, | |
1b217058 OL |
96 | POSTE_ACTION_ENVOYER_ADMINISTRATEUR : { |
97 | 'nom' : u'Envoyer', | |
d8cfc3d5 | 98 | 'etat_initial' : (POSTE_ETAT_BROUILLON, POSTE_ETAT_REFUSE, ), |
1b217058 OL |
99 | 'etat_final' : POSTE_ETAT_ADMINISTRATEUR, |
100 | }, | |
d8cfc3d5 OL |
101 | POSTE_ACTION_ENVOYER_SRV_UTILISATEURS : { |
102 | 'nom' : u'Envoyer', | |
103 | 'etat_initial' : (POSTE_ETAT_ADMINISTRATEUR, POSTE_ETAT_REFUSE, ), | |
104 | 'etat_final' : POSTE_ETAT_SERVICE_UTILISATEURS, | |
105 | }, | |
106 | POSTE_ACTION_ENVOYER_DIRECTEUR_BUREAU : { | |
107 | 'nom' : u'Envoyer', | |
108 | 'etat_initial' : (POSTE_ETAT_ADMINISTRATEUR, POSTE_ETAT_REFUSE,), | |
109 | 'etat_final' : POSTE_ETAT_DIRECTEUR_BUREAU, | |
110 | }, | |
1b217058 OL |
111 | POSTE_ACTION_ENVOYER_DRH_CONTROLE : { |
112 | 'nom' : u'Envoyer', | |
d8cfc3d5 | 113 | 'etat_initial' : (POSTE_ETAT_DIRECTEUR_BUREAU, POSTE_ETAT_SERVICE_UTILISATEURS, POSTE_ETAT_REFUSE, ), |
1b217058 OL |
114 | 'etat_final' : POSTE_ETAT_DRH_CONTROLE, |
115 | }, | |
d8cfc3d5 | 116 | POSTE_ACTION_ENVOYER_ACCIOR : { |
1b217058 | 117 | 'nom' : u'Envoyer', |
d8cfc3d5 OL |
118 | 'etat_initial' : (POSTE_ETAT_DRH_CONTROLE, POSTE_ETAT_REFUSE, ), |
119 | 'etat_final' : POSTE_ETAT_ACCIOR, | |
120 | }, | |
121 | POSTE_ACTION_ENVOYER_AFB : { | |
122 | 'nom' : u'Envoyer', | |
123 | 'etat_initial' : (POSTE_ETAT_ACCIOR, POSTE_ETAT_REFUSE, ), | |
124 | 'etat_final' : POSTE_ETAT_AFB, | |
1b217058 OL |
125 | }, |
126 | POSTE_ACTION_ENVOYER_HAUTE_DIRECTION : { | |
127 | 'nom' : u'Envoyer', | |
d8cfc3d5 | 128 | 'etat_initial' : (POSTE_ETAT_AFB, POSTE_ETAT_REFUSE, ), |
1b217058 OL |
129 | 'etat_final' : POSTE_ETAT_HAUTE_DIRECTION, |
130 | }, | |
131 | POSTE_ACTION_ENVOYER_DRH_FINALISATION : { | |
132 | 'nom' : u'Envoyer', | |
d8cfc3d5 | 133 | 'etat_initial' : (POSTE_ETAT_HAUTE_DIRECTION, POSTE_ETAT_REFUSE, ), |
1b217058 | 134 | 'etat_final' : POSTE_ETAT_DRH_FINALISATION, |
8fa94e8b OL |
135 | }, |
136 | } | |
137 | ||
56589624 | 138 | |
d8cfc3d5 | 139 | def acces_etat_refuse(f): |
56589624 | 140 | """ |
d8cfc3d5 | 141 | Personne ne peut manipuler quelque chose à l'état refusé excepté la DRH et les administrateurs |
56589624 OL |
142 | """ |
143 | def inner(obj, action, request): | |
144 | if obj.etat != 'REFUSE': | |
145 | return f(obj, action, request) | |
d8cfc3d5 OL |
146 | user_groupes = request.user.groups.all() |
147 | if grp_drh in user_groupes or grp_administrateurs in user_groupes: | |
56589624 OL |
148 | return f(obj, action, request) |
149 | else: | |
150 | return False | |
151 | return inner | |
152 | ||
8fa94e8b OL |
153 | class PosteWorkflow(WorkflowMixin): |
154 | etat_initial = POSTE_ETAT_BROUILLON | |
155 | etats = POSTE_ETATS | |
156 | actions = POSTE_ACTIONS | |
157 | ||
158 | class Meta: | |
159 | abstract = True | |
160 | ||
3799cafc | 161 | def acces_refuse(self, action, request): |
d8cfc3d5 OL |
162 | user_groupes = request.user.groups.all() |
163 | if grp_accior in user_groupes or grp_afb in user_groupes: | |
56589624 OL |
164 | return False |
165 | ||
166 | user_groupes = request.user.groups.all() | |
167 | for g, etats in MAP_GROUPE_ETATS_A_FAIRE.items(): | |
168 | if g in user_groupes and self.etat in etats: | |
169 | return True | |
170 | return False | |
8fa94e8b | 171 | |
d8cfc3d5 OL |
172 | @acces_etat_refuse |
173 | def acces_directeur_bureau(self, action, request): | |
174 | if is_user_dans_services_centraux(request.user): | |
175 | return False | |
1b217058 | 176 | for g in request.user.groups.all(): |
d8cfc3d5 | 177 | if g in (grp_administrateurs, grp_drh,): |
1b217058 OL |
178 | return True |
179 | return False | |
180 | ||
d8cfc3d5 | 181 | @acces_etat_refuse |
1b217058 OL |
182 | def acces_administrateur(self, action, request): |
183 | for g in request.user.groups.all(): | |
d8cfc3d5 | 184 | if g in (grp_correspondants_rh, grp_drh,): |
1b217058 OL |
185 | return True |
186 | return False | |
187 | ||
d8cfc3d5 | 188 | @acces_etat_refuse |
1b217058 OL |
189 | def acces_drh_controle(self, action, request): |
190 | for g in request.user.groups.all(): | |
d8cfc3d5 | 191 | if g in (grp_directeurs_bureau, grp_service_utilisateurs, grp_drh,): |
1b217058 OL |
192 | return True |
193 | return False | |
194 | ||
d8cfc3d5 OL |
195 | @acces_etat_refuse |
196 | def acces_srv_utilisateurs(self, action, request): | |
197 | if not is_user_dans_services_centraux(request.user): | |
198 | return False | |
199 | for g in request.user.groups.all(): | |
200 | if g in (grp_administrateurs, grp_drh, ): | |
201 | return True | |
202 | return False | |
203 | ||
204 | @acces_etat_refuse | |
205 | def acces_accior(self, action, request): | |
1b217058 OL |
206 | for g in request.user.groups.all(): |
207 | if g in (grp_drh, ): | |
208 | return True | |
209 | return False | |
210 | ||
d8cfc3d5 OL |
211 | @acces_etat_refuse |
212 | def acces_afb(self, action, request): | |
213 | for g in request.user.groups.all(): | |
214 | if g in (grp_accior, grp_drh, ): | |
215 | return True | |
216 | return False | |
217 | ||
218 | @acces_etat_refuse | |
1b217058 OL |
219 | def acces_haute_direction(self, action, request): |
220 | for g in request.user.groups.all(): | |
d8cfc3d5 | 221 | if g in (grp_afb, grp_drh, ): |
1b217058 OL |
222 | return True |
223 | return False | |
224 | ||
d8cfc3d5 | 225 | @acces_etat_refuse |
1b217058 OL |
226 | def acces_drh_finalisation(self, action, request): |
227 | for g in request.user.groups.all(): | |
228 | if g in (grp_haute_direction, grp_drh, ): | |
229 | return True | |
230 | return False | |
231 | ||
232 | ||
515124ec | 233 | #codes actions |
18c6d4c0 | 234 | DOSSIER_ETAT_REFUSE = POSTE_ETAT_REFUSE |
515124ec | 235 | DOSSIER_ETAT_BROUILLON = POSTE_ETAT_BROUILLON |
515124ec | 236 | DOSSIER_ETAT_ADMINISTRATEUR = POSTE_ETAT_ADMINISTRATEUR |
d8cfc3d5 OL |
237 | DOSSIER_ETAT_DIRECTEUR_BUREAU = POSTE_ETAT_DIRECTEUR_BUREAU |
238 | DOSSIER_ETAT_SERVICE_UTILISATEURS = POSTE_ETAT_SERVICE_UTILISATEURS | |
515124ec | 239 | DOSSIER_ETAT_DRH_CONTROLE = POSTE_ETAT_DRH_CONTROLE |
d8cfc3d5 OL |
240 | DOSSIER_ETAT_ACCIOR = POSTE_ETAT_ACCIOR |
241 | DOSSIER_ETAT_AFB = POSTE_ETAT_AFB | |
515124ec OL |
242 | DOSSIER_ETAT_HAUTE_DIRECTION = POSTE_ETAT_HAUTE_DIRECTION |
243 | DOSSIER_ETAT_DRH_FINALISATION = POSTE_ETAT_DRH_FINALISATION | |
afc204bf OL |
244 | |
245 | class DossierWorkflow(PosteWorkflow): | |
246 | ||
247 | class Meta: | |
248 | abstract = True | |
515124ec OL |
249 | |
250 | def save(self, force_insert=False, force_update=False, using=None): | |
251 | """ | |
252 | Lorsqu'un dossier est retenu, on flag le poste pourvu | |
253 | """ | |
254 | super(PosteWorkflow, self).save(force_insert, force_update, using) | |
255 | if self.etat == DOSSIER_ETAT_DRH_FINALISATION: | |
256 | self.poste.pourvu = True | |
257 | self.poste.save() | |
258 | ||
259 | ||
260 | MAP_GROUPE_ETATS_A_FAIRE = { | |
515124ec | 261 | grp_correspondants_rh : (), |
d8cfc3d5 OL |
262 | grp_service_utilisateurs : (POSTE_ETAT_SERVICE_UTILISATEURS, DOSSIER_ETAT_SERVICE_UTILISATEURS,), |
263 | grp_administrateurs : (POSTE_ETAT_ADMINISTRATEUR, DOSSIER_ETAT_ADMINISTRATEUR, ), | |
264 | grp_directeurs_bureau : (POSTE_ETAT_DIRECTEUR_BUREAU, DOSSIER_ETAT_DIRECTEUR_BUREAU, ), | |
3799cafc | 265 | grp_drh : (POSTE_ETAT_DRH_CONTROLE, POSTE_ETAT_DRH_FINALISATION, DOSSIER_ETAT_DRH_CONTROLE, DOSSIER_ETAT_DRH_FINALISATION,), |
d8cfc3d5 OL |
266 | grp_accior : (POSTE_ETAT_ACCIOR, DOSSIER_ETAT_ACCIOR, ), |
267 | grp_afb : (POSTE_ETAT_AFB, DOSSIER_ETAT_AFB, ), | |
3799cafc | 268 | grp_haute_direction : (POSTE_ETAT_HAUTE_DIRECTION, DOSSIER_ETAT_HAUTE_DIRECTION, ), |
515124ec | 269 | } |
286d0aa9 OL |
270 | |
271 | ||
d8cfc3d5 OL |
272 | ETATS_EDITABLE = (POSTE_ETAT_REFUSE, POSTE_ETAT_BROUILLON, POSTE_ETAT_ADMINISTRATEUR, POSTE_ETAT_DRH_CONTROLE, POSTE_ETAT_DIRECTEUR_BUREAU, POSTE_ETAT_SERVICE_UTILISATEURS, |
273 | DOSSIER_ETAT_REFUSE, DOSSIER_ETAT_BROUILLON, DOSSIER_ETAT_ADMINISTRATEUR, DOSSIER_ETAT_DRH_CONTROLE, DOSSIER_ETAT_DIRECTEUR_BUREAU, DOSSIER_ETAT_SERVICE_UTILISATEURS, | |
286d0aa9 OL |
274 | ) |
275 |