414d1603e5553fbb739d6e839c0e881293dffec6
[auf_rh_dae.git] / project / dae / workflow.py
1 # -*- encoding: utf-8 -*-
2
3 from django.contrib.auth.models import Group
4 from auf.django.workflow.models import WorkflowMixin
5
6 def 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
18 # Groupes impliqués dans le Worflow
19 grp_administrateurs = safe_create_groupe(name='Administrateurs')
20 grp_gestionnaires = safe_create_groupe(name='Gestionnaires')
21 grp_directeurs_bureau = safe_create_groupe(name='Directeurs de bureau')
22 grp_drh = safe_create_groupe(name='DRH')
23 grp_pole_financier = safe_create_groupe(name='Pôle financier')
24 grp_haute_direction = safe_create_groupe(name='Haute direction')
25 grp_service_utilisateurs = safe_create_groupe(name='Service utilisateurs')
26 grp_directeurs_service = safe_create_groupe(name='Directeurs de service / pôle')
27 grp_correspondants_rh = safe_create_groupe(name='Correspondants RH')
28
29 dae_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, )
32
33 # codes états
34 POSTE_ETAT_BROUILLON = 'BROUILLON'
35 POSTE_ETAT_DIRECTEUR_BUREAU_OU_SERVICE = 'DIRECTEUR_BUR_SRV'
36 POSTE_ETAT_ADMINISTRATEUR = 'ADMINISTRATEUR'
37 POSTE_ETAT_DRH_CONTROLE = 'DRH_CONTROLE'
38 POSTE_ETAT_POLE_FINANCIER = 'FINANCE'
39 POSTE_ETAT_HAUTE_DIRECTION = 'HAUTE_DIRECTION'
40 POSTE_ETAT_DRH_FINALISATION = 'DRH_FINALISATION'
41
42 #codes actions
43 POSTE_ACTION_ENVOYER_BROUILLON = POSTE_ETAT_BROUILLON
44 POSTE_ACTION_ENVOYER_DIRECTEUR_BUREAU_OU_SERVICE = POSTE_ETAT_DIRECTEUR_BUREAU_OU_SERVICE
45 POSTE_ACTION_ENVOYER_ADMINISTRATEUR = POSTE_ETAT_ADMINISTRATEUR
46 POSTE_ACTION_ENVOYER_DRH_CONTROLE = POSTE_ETAT_DRH_CONTROLE
47 POSTE_ACTION_ENVOYER_POLE_FINANCIER = POSTE_ETAT_POLE_FINANCIER
48 POSTE_ACTION_ENVOYER_HAUTE_DIRECTION = POSTE_ETAT_HAUTE_DIRECTION
49 POSTE_ACTION_ENVOYER_DRH_FINALISATION = POSTE_ETAT_DRH_FINALISATION
50
51 #libellés états
52 POSTE_ETATS = {
53 POSTE_ETAT_BROUILLON : u'Brouillon',
54 POSTE_ETAT_DIRECTEUR_BUREAU_OU_SERVICE : u'Directeur de bureau, pôle ou service',
55 POSTE_ETAT_ADMINISTRATEUR : u'Adminstrateur',
56 POSTE_ETAT_DRH_CONTROLE : u'Contrôle DRH',
57 POSTE_ETAT_POLE_FINANCIER : u'Pôle financier',
58 POSTE_ETAT_HAUTE_DIRECTION : u'Haute direction',
59 POSTE_ETAT_DRH_FINALISATION : u'Finalisation DRH',
60 }
61
62 # définition du worflow séquentiel
63 POSTE_ACTIONS = {
64 POSTE_ACTION_ENVOYER_BROUILLON : {
65 'nom' : u'Créer',
66 'etat_initial' : None,
67 'etat_final' : POSTE_ETAT_BROUILLON,
68 },
69 POSTE_ACTION_ENVOYER_DIRECTEUR_BUREAU_OU_SERVICE : {
70 'nom' : u'Envoyer',
71 'etat_initial' : POSTE_ETAT_BROUILLON,
72 'etat_final' : POSTE_ETAT_DIRECTEUR_BUREAU_OU_SERVICE,
73 },
74 POSTE_ACTION_ENVOYER_ADMINISTRATEUR : {
75 'nom' : u'Envoyer',
76 'etat_initial' : POSTE_ETAT_DIRECTEUR_BUREAU_OU_SERVICE,
77 'etat_final' : POSTE_ETAT_ADMINISTRATEUR,
78 },
79 POSTE_ACTION_ENVOYER_DRH_CONTROLE : {
80 'nom' : u'Envoyer',
81 'etat_initial' : (POSTE_ETAT_DIRECTEUR_BUREAU_OU_SERVICE, POSTE_ETAT_ADMINISTRATEUR, ),
82 'etat_final' : POSTE_ETAT_DRH_CONTROLE,
83 },
84 POSTE_ACTION_ENVOYER_POLE_FINANCIER : {
85 'nom' : u'Envoyer',
86 'etat_initial' : POSTE_ETAT_DRH_CONTROLE,
87 'etat_final' : POSTE_ETAT_POLE_FINANCIER,
88 },
89 POSTE_ACTION_ENVOYER_HAUTE_DIRECTION : {
90 'nom' : u'Envoyer',
91 'etat_initial' : POSTE_ETAT_POLE_FINANCIER,
92 'etat_final' : POSTE_ETAT_HAUTE_DIRECTION,
93 },
94 POSTE_ACTION_ENVOYER_DRH_FINALISATION : {
95 'nom' : u'Envoyer',
96 'etat_initial' : POSTE_ETAT_HAUTE_DIRECTION,
97 'etat_final' : POSTE_ETAT_DRH_FINALISATION,
98 },
99 }
100
101 class PosteWorkflow(WorkflowMixin):
102 etat_initial = POSTE_ETAT_BROUILLON
103 etats = POSTE_ETATS
104 actions = POSTE_ACTIONS
105
106 class Meta:
107 abstract = True
108
109
110 def acces_directeur_bur_srv(self, action, request):
111 for g in request.user.groups.all():
112 if g in (grp_administrateurs, grp_gestionnaires, grp_service_utilisateurs, grp_correspondants_rh, grp_drh,):
113 return True
114 return False
115
116 def acces_administrateur(self, action, request):
117 for g in request.user.groups.all():
118 if g in (grp_directeurs_service, grp_drh,):
119 return True
120 return False
121
122 def acces_drh_controle(self, action, request):
123 for g in request.user.groups.all():
124 if g in (grp_directeurs_bureau, grp_administrateurs, grp_drh,):
125 return True
126 return False
127
128 def acces_finance(self, action, request):
129 for g in request.user.groups.all():
130 if g in (grp_drh, ):
131 return True
132 return False
133
134 def acces_haute_direction(self, action, request):
135 for g in request.user.groups.all():
136 if g in (grp_pole_financier, grp_drh, ):
137 return True
138 return False
139
140 def acces_drh_finalisation(self, action, request):
141 for g in request.user.groups.all():
142 if g in (grp_haute_direction, grp_drh, ):
143 return True
144 return False
145
146
147
148 class DossierWorkflow(PosteWorkflow):
149
150 class Meta:
151 abstract = True