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 | 25 | grp_accior = safe_create_groupe(name='ACCIOR') |
80c526a0 | 26 | grp_abf = safe_create_groupe(name='ABF') |
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, | |
80c526a0 | 36 | grp_abf, |
27d7babd OL |
37 | grp_haute_direction, |
38 | grp_service_utilisateurs, | |
39 | ) | |
8fa94e8b OL |
40 | |
41 | # codes états | |
42 | POSTE_ETAT_BROUILLON = 'BROUILLON' | |
1b217058 | 43 | POSTE_ETAT_ADMINISTRATEUR = 'ADMINISTRATEUR' |
d8cfc3d5 OL |
44 | POSTE_ETAT_DIRECTEUR_BUREAU = 'DIRECTEUR_BUREAU' |
45 | POSTE_ETAT_SERVICE_UTILISATEURS = 'SRV_UTILISATEURS' | |
1b217058 | 46 | POSTE_ETAT_DRH_CONTROLE = 'DRH_CONTROLE' |
d7e67bd4 | 47 | POSTE_ETAT_DEMANDE_MODIF = 'DEMANDE_MODIF' |
d8cfc3d5 | 48 | POSTE_ETAT_ACCIOR = 'ACCIOR' |
80c526a0 | 49 | POSTE_ETAT_ABF = 'ABF' |
1b217058 | 50 | POSTE_ETAT_HAUTE_DIRECTION = 'HAUTE_DIRECTION' |
d7e67bd4 | 51 | POSTE_ETAT_DEMANDE_JUSTIF = 'DEMANDE_JUSTIF' |
c511cd1f | 52 | POSTE_ETAT_REGION_FINALISATION = 'REGION_FINALISATION' |
1b217058 | 53 | POSTE_ETAT_DRH_FINALISATION = 'DRH_FINALISATION' |
c511cd1f | 54 | POSTE_ETAT_FINALISE = 'FINALISE' |
1b217058 OL |
55 | |
56 | #codes actions | |
57 | POSTE_ACTION_ENVOYER_BROUILLON = POSTE_ETAT_BROUILLON | |
1b217058 | 58 | POSTE_ACTION_ENVOYER_ADMINISTRATEUR = POSTE_ETAT_ADMINISTRATEUR |
d8cfc3d5 OL |
59 | POSTE_ACTION_ENVOYER_DIRECTEUR_BUREAU = POSTE_ETAT_DIRECTEUR_BUREAU |
60 | POSTE_ACTION_ENVOYER_SRV_UTILISATEURS = POSTE_ETAT_SERVICE_UTILISATEURS | |
1b217058 | 61 | POSTE_ACTION_ENVOYER_DRH_CONTROLE = POSTE_ETAT_DRH_CONTROLE |
d7e67bd4 EMS |
62 | POSTE_ACTION_DEMANDE_MODIF = POSTE_ETAT_DEMANDE_MODIF |
63 | POSTE_ACTION_RETOUR_DEMANDE_MODIF = 'RETOUR_DEMANDE_MODIF' | |
d8cfc3d5 | 64 | POSTE_ACTION_ENVOYER_ACCIOR = POSTE_ETAT_ACCIOR |
80c526a0 | 65 | POSTE_ACTION_ENVOYER_ABF = POSTE_ETAT_ABF |
1b217058 | 66 | POSTE_ACTION_ENVOYER_HAUTE_DIRECTION = POSTE_ETAT_HAUTE_DIRECTION |
d7e67bd4 EMS |
67 | POSTE_ACTION_DEMANDE_JUSTIF = POSTE_ETAT_DEMANDE_JUSTIF |
68 | POSTE_ACTION_RETOUR_DEMANDE_JUSTIF = 'RETOUR_DEMANDE_JUSTIF' | |
c511cd1f | 69 | POSTE_ACTION_ENVOYER_REGION_FINALISATION = POSTE_ETAT_REGION_FINALISATION |
1b217058 | 70 | POSTE_ACTION_ENVOYER_DRH_FINALISATION = POSTE_ETAT_DRH_FINALISATION |
c511cd1f | 71 | POSTE_ACTION_FINALISER = 'FINALISER' |
8fa94e8b OL |
72 | |
73 | #libellés états | |
74 | POSTE_ETATS = { | |
3799cafc | 75 | POSTE_ETAT_BROUILLON : u"En rédaction", |
62cfa562 | 76 | POSTE_ETAT_ADMINISTRATEUR : u"Validation de l'adminstrateur", |
d8cfc3d5 OL |
77 | POSTE_ETAT_DIRECTEUR_BUREAU : u"Directeur de bureau", |
78 | POSTE_ETAT_SERVICE_UTILISATEURS : u"Service utilisateurs", | |
62cfa562 | 79 | POSTE_ETAT_DRH_CONTROLE : u"Validation DRH", |
d7e67bd4 | 80 | POSTE_ETAT_DEMANDE_MODIF : u"Demande de modification", |
d8cfc3d5 | 81 | POSTE_ETAT_ACCIOR : u"ACCIOR", |
80c526a0 | 82 | POSTE_ETAT_ABF : u"ABF", |
62cfa562 | 83 | POSTE_ETAT_HAUTE_DIRECTION : u"Validation : Secrétaire général / Recteur", |
d7e67bd4 | 84 | POSTE_ETAT_DEMANDE_JUSTIF : u"Demande de justification", |
c511cd1f EMS |
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' | |
8fa94e8b OL |
88 | } |
89 | ||
56589624 OL |
90 | #libellés états pour boutons |
91 | POSTE_ETATS_BOUTONS = { | |
d8cfc3d5 OL |
92 | POSTE_ETAT_DIRECTEUR_BUREAU : u"Envoyer au directeur de bureau", |
93 | POSTE_ETAT_SERVICE_UTILISATEURS : u"Envoyer au service utilisateurs", | |
56589624 OL |
94 | POSTE_ETAT_ADMINISTRATEUR : u"Envoyer à l'adminstrateur", |
95 | POSTE_ETAT_DRH_CONTROLE : u"Envoyer à la DRH (validation)", | |
d7e67bd4 | 96 | POSTE_ETAT_DEMANDE_MODIF : u"Envoyer une demande de modification", |
871be4b0 | 97 | POSTE_ETAT_ACCIOR : u"Envoyer à l'ACCIOR", |
80c526a0 | 98 | POSTE_ETAT_ABF : u"Envoyer à l'ABF", |
56589624 | 99 | POSTE_ETAT_HAUTE_DIRECTION : u"Envoyer à la haute direction", |
d7e67bd4 | 100 | POSTE_ETAT_DEMANDE_JUSTIF : u"Envoyer une demande de justification", |
c511cd1f EMS |
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' | |
56589624 OL |
104 | } |
105 | ||
8fa94e8b OL |
106 | # définition du worflow séquentiel |
107 | POSTE_ACTIONS = { | |
1b217058 | 108 | POSTE_ACTION_ENVOYER_BROUILLON : { |
8fa94e8b OL |
109 | 'nom' : u'Créer', |
110 | 'etat_initial' : None, | |
111 | 'etat_final' : POSTE_ETAT_BROUILLON, | |
112 | }, | |
1b217058 OL |
113 | POSTE_ACTION_ENVOYER_ADMINISTRATEUR : { |
114 | 'nom' : u'Envoyer', | |
d7e67bd4 | 115 | 'etat_initial' : (POSTE_ETAT_BROUILLON,), |
1b217058 OL |
116 | 'etat_final' : POSTE_ETAT_ADMINISTRATEUR, |
117 | }, | |
d8cfc3d5 OL |
118 | POSTE_ACTION_ENVOYER_SRV_UTILISATEURS : { |
119 | 'nom' : u'Envoyer', | |
d7e67bd4 | 120 | 'etat_initial' : (POSTE_ETAT_ADMINISTRATEUR,), |
d8cfc3d5 OL |
121 | 'etat_final' : POSTE_ETAT_SERVICE_UTILISATEURS, |
122 | }, | |
123 | POSTE_ACTION_ENVOYER_DIRECTEUR_BUREAU : { | |
124 | 'nom' : u'Envoyer', | |
d7e67bd4 | 125 | 'etat_initial' : (POSTE_ETAT_ADMINISTRATEUR,), |
d8cfc3d5 OL |
126 | 'etat_final' : POSTE_ETAT_DIRECTEUR_BUREAU, |
127 | }, | |
1b217058 OL |
128 | POSTE_ACTION_ENVOYER_DRH_CONTROLE : { |
129 | 'nom' : u'Envoyer', | |
d7e67bd4 | 130 | 'etat_initial' : (POSTE_ETAT_ADMINISTRATEUR, POSTE_ETAT_DIRECTEUR_BUREAU, POSTE_ETAT_SERVICE_UTILISATEURS), |
1b217058 OL |
131 | 'etat_final' : POSTE_ETAT_DRH_CONTROLE, |
132 | }, | |
d7e67bd4 EMS |
133 | POSTE_ACTION_DEMANDE_MODIF : { |
134 | 'nom' : u'Envoyer', | |
135 | 'etat_initial' : (POSTE_ETAT_DRH_CONTROLE,), | |
136 | 'etat_final': POSTE_ETAT_DEMANDE_MODIF, | |
137 | }, | |
138 | POSTE_ACTION_RETOUR_DEMANDE_MODIF : { | |
139 | 'nom': u'Retourner', | |
140 | 'etat_initial': (POSTE_ETAT_DEMANDE_MODIF,), | |
141 | 'etat_final': POSTE_ETAT_DRH_CONTROLE, | |
142 | }, | |
d8cfc3d5 | 143 | POSTE_ACTION_ENVOYER_ACCIOR : { |
1b217058 | 144 | 'nom' : u'Envoyer', |
d7e67bd4 | 145 | 'etat_initial' : (POSTE_ETAT_DRH_CONTROLE,), |
d8cfc3d5 OL |
146 | 'etat_final' : POSTE_ETAT_ACCIOR, |
147 | }, | |
80c526a0 | 148 | POSTE_ACTION_ENVOYER_ABF : { |
d8cfc3d5 | 149 | 'nom' : u'Envoyer', |
d7e67bd4 | 150 | 'etat_initial' : (POSTE_ETAT_ACCIOR,), |
80c526a0 | 151 | 'etat_final' : POSTE_ETAT_ABF, |
1b217058 OL |
152 | }, |
153 | POSTE_ACTION_ENVOYER_HAUTE_DIRECTION : { | |
154 | 'nom' : u'Envoyer', | |
d7e67bd4 | 155 | 'etat_initial' : (POSTE_ETAT_ABF,), |
1b217058 OL |
156 | 'etat_final' : POSTE_ETAT_HAUTE_DIRECTION, |
157 | }, | |
d7e67bd4 EMS |
158 | POSTE_ACTION_DEMANDE_JUSTIF : { |
159 | 'nom' : u'Envoyer', | |
160 | 'etat_initial' : (POSTE_ETAT_HAUTE_DIRECTION,), | |
161 | 'etat_final': POSTE_ETAT_DEMANDE_JUSTIF, | |
162 | }, | |
163 | POSTE_ACTION_RETOUR_DEMANDE_JUSTIF : { | |
164 | 'nom' : u'Envoyer', | |
165 | 'etat_initial' : (POSTE_ETAT_DEMANDE_JUSTIF,), | |
166 | 'etat_final': POSTE_ETAT_HAUTE_DIRECTION, | |
167 | }, | |
c511cd1f | 168 | POSTE_ACTION_ENVOYER_REGION_FINALISATION : { |
1b217058 | 169 | 'nom' : u'Envoyer', |
d7e67bd4 | 170 | 'etat_initial' : (POSTE_ETAT_HAUTE_DIRECTION,), |
c511cd1f EMS |
171 | 'etat_final' : POSTE_ETAT_REGION_FINALISATION |
172 | }, | |
173 | POSTE_ACTION_ENVOYER_DRH_FINALISATION : { | |
174 | 'nom' : u'Envoyer', | |
175 | 'etat_initial' : (POSTE_ETAT_REGION_FINALISATION,), | |
1b217058 | 176 | 'etat_final' : POSTE_ETAT_DRH_FINALISATION, |
8fa94e8b | 177 | }, |
c511cd1f EMS |
178 | POSTE_ACTION_FINALISER : { |
179 | 'nom' : u'Finaliser', | |
180 | 'etat_initial' : (POSTE_ETAT_DRH_FINALISATION,), | |
181 | 'etat_final' : POSTE_ETAT_FINALISE | |
182 | }, | |
8fa94e8b OL |
183 | } |
184 | ||
56589624 | 185 | |
8fa94e8b OL |
186 | class PosteWorkflow(WorkflowMixin): |
187 | etat_initial = POSTE_ETAT_BROUILLON | |
188 | etats = POSTE_ETATS | |
189 | actions = POSTE_ACTIONS | |
190 | ||
191 | class Meta: | |
192 | abstract = True | |
193 | ||
d8cfc3d5 OL |
194 | def acces_directeur_bureau(self, action, request): |
195 | if is_user_dans_services_centraux(request.user): | |
196 | return False | |
1b217058 | 197 | for g in request.user.groups.all(): |
d8cfc3d5 | 198 | if g in (grp_administrateurs, grp_drh,): |
1b217058 OL |
199 | return True |
200 | return False | |
201 | ||
202 | def acces_administrateur(self, action, request): | |
203 | for g in request.user.groups.all(): | |
d8cfc3d5 | 204 | if g in (grp_correspondants_rh, grp_drh,): |
1b217058 OL |
205 | return True |
206 | return False | |
207 | ||
208 | def acces_drh_controle(self, action, request): | |
d7e67bd4 EMS |
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)) | |
213 | ||
214 | def acces_demande_modif(self, action, request): | |
215 | return grp_drh in request.user.groups.all() | |
1b217058 | 216 | |
d8cfc3d5 OL |
217 | def acces_srv_utilisateurs(self, action, request): |
218 | if not is_user_dans_services_centraux(request.user): | |
219 | return False | |
220 | for g in request.user.groups.all(): | |
221 | if g in (grp_administrateurs, grp_drh, ): | |
222 | return True | |
223 | return False | |
224 | ||
d8cfc3d5 | 225 | def acces_accior(self, action, request): |
1b217058 OL |
226 | for g in request.user.groups.all(): |
227 | if g in (grp_drh, ): | |
228 | return True | |
229 | return False | |
230 | ||
80c526a0 | 231 | def acces_abf(self, action, request): |
d8cfc3d5 OL |
232 | for g in request.user.groups.all(): |
233 | if g in (grp_accior, grp_drh, ): | |
234 | return True | |
235 | return False | |
236 | ||
1b217058 OL |
237 | def acces_haute_direction(self, action, request): |
238 | for g in request.user.groups.all(): | |
80c526a0 | 239 | if g in (grp_abf, grp_drh, ): |
1b217058 OL |
240 | return True |
241 | return False | |
242 | ||
c511cd1f | 243 | def acces_region_finalisation(self, action, request): |
72058136 EMS |
244 | for g in user_groups: |
245 | if g in (grp_administrateurs, grp_drh,): | |
246 | return True | |
c511cd1f | 247 | |
1b217058 | 248 | def acces_drh_finalisation(self, action, request): |
72058136 | 249 | return self.acces_administrateur |
1b217058 | 250 | |
d7e67bd4 EMS |
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]) | |
254 | ||
255 | def acces_retour_demande_modif(self, action, request): | |
256 | return self.acces_drh_controle(action, request) | |
257 | ||
258 | def acces_retour_demande_justif(self, action, request): | |
259 | return self.acces_haute_direction(action, request) | |
260 | ||
c511cd1f EMS |
261 | def acces_finaliser(self, action, request): |
262 | return self.acces_drh_finalisation(action, request) | |
263 | ||
1b217058 | 264 | |
515124ec OL |
265 | #codes actions |
266 | DOSSIER_ETAT_BROUILLON = POSTE_ETAT_BROUILLON | |
515124ec | 267 | DOSSIER_ETAT_ADMINISTRATEUR = POSTE_ETAT_ADMINISTRATEUR |
d8cfc3d5 OL |
268 | DOSSIER_ETAT_DIRECTEUR_BUREAU = POSTE_ETAT_DIRECTEUR_BUREAU |
269 | DOSSIER_ETAT_SERVICE_UTILISATEURS = POSTE_ETAT_SERVICE_UTILISATEURS | |
515124ec | 270 | DOSSIER_ETAT_DRH_CONTROLE = POSTE_ETAT_DRH_CONTROLE |
d7e67bd4 | 271 | DOSSIER_ETAT_DEMANDE_MODIF = POSTE_ETAT_DEMANDE_MODIF |
d8cfc3d5 | 272 | DOSSIER_ETAT_ACCIOR = POSTE_ETAT_ACCIOR |
80c526a0 | 273 | DOSSIER_ETAT_ABF = POSTE_ETAT_ABF |
515124ec | 274 | DOSSIER_ETAT_HAUTE_DIRECTION = POSTE_ETAT_HAUTE_DIRECTION |
d7e67bd4 | 275 | DOSSIER_ETAT_DEMANDE_JUSTIF = POSTE_ETAT_DEMANDE_JUSTIF |
c511cd1f | 276 | DOSSIER_ETAT_REGION_FINALISATION = POSTE_ETAT_REGION_FINALISATION |
515124ec | 277 | DOSSIER_ETAT_DRH_FINALISATION = POSTE_ETAT_DRH_FINALISATION |
c511cd1f | 278 | DOSSIER_ETAT_FINALISE = POSTE_ETAT_FINALISE |
afc204bf OL |
279 | |
280 | class DossierWorkflow(PosteWorkflow): | |
281 | ||
282 | class Meta: | |
283 | abstract = True | |
515124ec | 284 | |
515124ec OL |
285 | |
286 | MAP_GROUPE_ETATS_A_FAIRE = { | |
eefe1a9e | 287 | grp_correspondants_rh : (POSTE_ETAT_BROUILLON, DOSSIER_ETAT_BROUILLON, ), |
c511cd1f EMS |
288 | grp_service_utilisateurs : (POSTE_ETAT_SERVICE_UTILISATEURS, |
289 | DOSSIER_ETAT_SERVICE_UTILISATEURS,), | |
290 | grp_administrateurs : (POSTE_ETAT_ADMINISTRATEUR, | |
291 | DOSSIER_ETAT_ADMINISTRATEUR, | |
292 | POSTE_ETAT_DEMANDE_MODIF, | |
293 | DOSSIER_ETAT_DEMANDE_MODIF, | |
294 | POSTE_ETAT_REGION_FINALISATION, | |
295 | DOSSIER_ETAT_REGION_FINALISATION, | |
296 | ), | |
d8cfc3d5 | 297 | grp_directeurs_bureau : (POSTE_ETAT_DIRECTEUR_BUREAU, DOSSIER_ETAT_DIRECTEUR_BUREAU, ), |
c511cd1f EMS |
298 | grp_drh : (POSTE_ETAT_DRH_CONTROLE, POSTE_ETAT_DRH_FINALISATION, |
299 | DOSSIER_ETAT_DRH_CONTROLE, DOSSIER_ETAT_DRH_FINALISATION, | |
d7e67bd4 | 300 | POSTE_ETAT_DEMANDE_JUSTIF, DOSSIER_ETAT_DEMANDE_JUSTIF), |
d8cfc3d5 | 301 | grp_accior : (POSTE_ETAT_ACCIOR, DOSSIER_ETAT_ACCIOR, ), |
80c526a0 | 302 | grp_abf : (POSTE_ETAT_ABF, DOSSIER_ETAT_ABF, ), |
3799cafc | 303 | grp_haute_direction : (POSTE_ETAT_HAUTE_DIRECTION, DOSSIER_ETAT_HAUTE_DIRECTION, ), |
515124ec | 304 | } |
286d0aa9 OL |
305 | |
306 | ||
d7e67bd4 EMS |
307 | ETATS_EDITABLE = (POSTE_ETAT_BROUILLON, POSTE_ETAT_ADMINISTRATEUR, |
308 | POSTE_ETAT_DRH_CONTROLE, POSTE_ETAT_DIRECTEUR_BUREAU, | |
309 | POSTE_ETAT_SERVICE_UTILISATEURS, | |
310 | POSTE_ETAT_DEMANDE_MODIF, | |
311 | POSTE_ETAT_DEMANDE_JUSTIF, | |
312 | DOSSIER_ETAT_BROUILLON, | |
313 | DOSSIER_ETAT_ADMINISTRATEUR, DOSSIER_ETAT_DRH_CONTROLE, | |
314 | DOSSIER_ETAT_DIRECTEUR_BUREAU, | |
315 | DOSSIER_ETAT_SERVICE_UTILISATEURS, | |
316 | DOSSIER_ETAT_DEMANDE_MODIF, | |
317 | DOSSIER_ETAT_DEMANDE_JUSTIF, | |
286d0aa9 OL |
318 | ) |
319 | ||
c511cd1f EMS |
320 | ETATS_VALIDE = (DOSSIER_ETAT_REGION_FINALISATION, DOSSIER_ETAT_DRH_FINALISATION, |
321 | DOSSIER_ETAT_FINALISE) |