Corrections à ce que André Léger peut voir...
[auf_rh_dae.git] / project / dae / managers.py
CommitLineData
f258e4e7
OL
1# -*- encoding: utf-8 -*-
2
3from django.db import models
4from django.db.models import Q
d8cfc3d5 5from utils import get_employe_from_user
18c6d4c0 6from workflow import POSTE_ETAT_HAUTE_DIRECTION, \
d8cfc3d5 7 POSTE_ETAT_ACCIOR, \
9a62bc55 8 POSTE_ETAT_ABF, \
8ae5fbb1 9 DOSSIER_ETAT_ACCIOR, \
9a62bc55 10 DOSSIER_ETAT_ABF, \
18c6d4c0 11 MAP_GROUPE_ETATS_A_FAIRE
f258e4e7
OL
12from workflow import dae_groupes, \
13 grp_administrateurs, \
f258e4e7
OL
14 grp_directeurs_bureau, \
15 grp_drh, \
d8cfc3d5 16 grp_accior, \
9a62bc55 17 grp_abf, \
f258e4e7
OL
18 grp_haute_direction, \
19 grp_service_utilisateurs, \
f258e4e7
OL
20 grp_correspondants_rh
21
515124ec 22
f258e4e7
OL
23class SecurityManager(models.Manager):
24
189b6306 25 prefixe_service = None
f258e4e7
OL
26 prefixe_implantation = None
27
515124ec
OL
28 def mes_choses_a_faire(self, user):
29 q = Q()
291bbfd9 30 employe = get_employe_from_user(user)
bb59cdf6 31 rien_a_faire = True
515124ec
OL
32 for g in user.groups.all():
33 etats = MAP_GROUPE_ETATS_A_FAIRE.get(g, ())
34 for etat in etats:
bb59cdf6 35 rien_a_faire = False
291bbfd9
EMS
36 q2 = Q(etat=etat)
37 if g == grp_service_utilisateurs:
38 q2 &= Q(**{self.prefixe_service: employe.service})
39 elif g not in (grp_accior, grp_abf, grp_haute_direction, grp_drh):
40 q2 &= Q(**{self.prefixe_implantation: employe.implantation.region})
41 q |= q2
515124ec 42
bb59cdf6
OL
43 if rien_a_faire:
44 qs = self.ma_region_ou_service(user).none()
45 else:
46 qs = self.ma_region_ou_service(user).filter(q)
47
515124ec
OL
48 return qs
49
f258e4e7
OL
50 def ma_region_ou_service(self, user):
51 """
52 Filtrage des postes en fonction du user connecté (region / service)
53 On s'intéresse aussi au groupe auquel appartient le user car certains groupes
54 peuvent tout voir.
55 """
072d6547
OL
56 # On s'assure que le manager travaille sur un modèle avec WF, autrement
57 # on ne teste pas sur l'état
58 try:
59 self.model._meta.get_field_by_name('etat')
60 workflowed_model = True
61 except:
62 workflowed_model = False
63
f258e4e7
OL
64 employe = get_employe_from_user(user)
65
66 ############################################
67 # TRAITEMENT NORMAL
757c0fd5 68 ############################################
8ae5fbb1
OL
69 # REGION
70 q = Q(**{ self.prefixe_implantation : employe.implantation.region })
71
f258e4e7 72 # SERVICE
1de3da13
EMS
73 if self.prefixe_service and workflowed_model and \
74 grp_service_utilisateurs in user.groups.all():
8ae5fbb1 75 q = q | Q(**{ self.prefixe_service : employe.service})
f258e4e7 76
3420143c 77 liste = self.get_query_set().filter(q)
f258e4e7 78
0adcf7d1 79 ############################################
d8cfc3d5 80 # TRAITEMENT ACCIOR
757c0fd5 81 ############################################
d8cfc3d5 82 if workflowed_model and grp_accior in user.groups.all():
757c0fd5 83 liste = self.get_query_set().all()
d8cfc3d5
OL
84
85 ############################################
9a62bc55 86 # TRAITEMENT ABF
757c0fd5 87 ############################################
9a62bc55 88 if workflowed_model and grp_abf in user.groups.all():
bbb2458d 89 liste = self.get_query_set().all()
18c6d4c0 90
0adcf7d1
OL
91 ############################################
92 # TRAITEMENT HAUTE DIRECTION
757c0fd5 93 ############################################
0adcf7d1 94 if workflowed_model and grp_haute_direction in user.groups.all():
bbb2458d 95 liste = self.get_query_set().all()
f258e4e7
OL
96
97 ############################################
98 # TRAITEMENT DRH
757c0fd5 99 ############################################
f258e4e7 100 if grp_drh in user.groups.all():
bbb2458d 101 liste = self.get_query_set().all()
18c6d4c0 102
f258e4e7
OL
103 return liste
104
105
106class PosteManager(SecurityManager):
107 """
108 Chargement de tous les objets FK existants sur chaque QuerySet.
109 """
189b6306
OL
110 prefixe_service = "service"
111 prefixe_implantation = "implantation__region"
f258e4e7 112
b15bf543 113 def ma_region_ou_service(self, user):
18c6d4c0 114 return super(PosteManager, self).ma_region_ou_service(user).filter(actif=True)
b15bf543 115
f258e4e7
OL
116 def get_query_set(self):
117 fkeys = (
118 'id_rh',
119 'responsable',
120 'implantation',
0b2edb6e 121 'implantation.bureau_rattachement',
f258e4e7
OL
122 'type_poste',
123 'service',
124 'classement_min',
125 'classement_max',
126 'valeur_point_min',
127 'valeur_point_max',
128 )
129 return super(PosteManager, self).get_query_set() \
130 .select_related(*fkeys).all()
131
132
133class DossierManager(SecurityManager):
189b6306
OL
134 prefixe_service = "poste__service"
135 prefixe_implantation = "poste__implantation__region"
f258e4e7 136
0b2edb6e
OL
137 def get_query_set(self):
138 fkeys = (
139 'poste',
140 )
141 return super(DossierManager, self).get_query_set() \
142 .select_related(*fkeys).all()
143
b15bf543 144 def ma_region_ou_service(self, user):
18c6d4c0 145 return super(DossierManager, self).ma_region_ou_service(user).filter(poste__actif=True)
b15bf543
OL
146
147
1de3da13
EMS
148class PosteComparaisonManager(SecurityManager):
149 use_for_related_fields = True
150 prefixe_implantation = "implantation__region"