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