Accès à page perso via actions en haut à droite
[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
OL
7 POSTE_ETAT_ACCIOR, \
8 POSTE_ETAT_AFB, \
18c6d4c0
OL
9 POSTE_ETAT_REFUSE, \
10 DOSSIER_ETAT_REFUSE, \
8ae5fbb1
OL
11 DOSSIER_ETAT_ACCIOR, \
12 DOSSIER_ETAT_AFB, \
18c6d4c0 13 MAP_GROUPE_ETATS_A_FAIRE
f258e4e7
OL
14from workflow import dae_groupes, \
15 grp_administrateurs, \
f258e4e7
OL
16 grp_directeurs_bureau, \
17 grp_drh, \
d8cfc3d5
OL
18 grp_accior, \
19 grp_afb, \
f258e4e7
OL
20 grp_haute_direction, \
21 grp_service_utilisateurs, \
f258e4e7
OL
22 grp_correspondants_rh
23
515124ec 24
f258e4e7
OL
25class SecurityManager(models.Manager):
26
189b6306 27 prefixe_service = None
f258e4e7
OL
28 prefixe_implantation = None
29
515124ec
OL
30 def mes_choses_a_faire(self, user):
31 q = Q()
bb59cdf6 32 rien_a_faire = True
515124ec
OL
33 for g in user.groups.all():
34 etats = MAP_GROUPE_ETATS_A_FAIRE.get(g, ())
35 for etat in etats:
bb59cdf6 36 rien_a_faire = False
515124ec
OL
37 q = q | Q(etat=etat)
38
bb59cdf6
OL
39 if rien_a_faire:
40 qs = self.ma_region_ou_service(user).none()
41 else:
42 qs = self.ma_region_ou_service(user).filter(q)
43
515124ec
OL
44 return qs
45
f258e4e7
OL
46 def ma_region_ou_service(self, user):
47 """
48 Filtrage des postes en fonction du user connecté (region / service)
49 On s'intéresse aussi au groupe auquel appartient le user car certains groupes
50 peuvent tout voir.
51 """
072d6547
OL
52 # On s'assure que le manager travaille sur un modèle avec WF, autrement
53 # on ne teste pas sur l'état
54 try:
55 self.model._meta.get_field_by_name('etat')
56 workflowed_model = True
57 except:
58 workflowed_model = False
59
f258e4e7
OL
60 employe = get_employe_from_user(user)
61
62 ############################################
63 # TRAITEMENT NORMAL
64 ############################################
8ae5fbb1
OL
65 # REGION
66 q = Q(**{ self.prefixe_implantation : employe.implantation.region })
67
f258e4e7 68 # SERVICE
189b6306 69 if workflowed_model and grp_service_utilisateurs in user.groups.all():
8ae5fbb1 70 q = q | Q(**{ self.prefixe_service : employe.service})
f258e4e7 71
c86febe1
OL
72 if workflowed_model:
73 q_non_refuse = ~Q(etat__in=(POSTE_ETAT_REFUSE, DOSSIER_ETAT_REFUSE,))
d8cfc3d5 74 # q = q & q_non_refuse
3420143c
OL
75
76 liste = self.get_query_set().filter(q)
f258e4e7 77
189b6306 78
0adcf7d1 79 ############################################
d8cfc3d5 80 # TRAITEMENT ACCIOR
0adcf7d1 81 ############################################
d8cfc3d5 82 if workflowed_model and grp_accior in user.groups.all():
8ae5fbb1 83 liste = liste | self.get_query_set().filter(q_non_refuse & Q(etat__in=(POSTE_ETAT_ACCIOR, DOSSIER_ETAT_ACCIOR,)))
d8cfc3d5
OL
84
85 ############################################
86 # TRAITEMENT AFB
87 ############################################
88 if workflowed_model and grp_afb in user.groups.all():
0af51c94 89 liste = self.get_query_set().filter(q_non_refuse)
18c6d4c0 90
0adcf7d1
OL
91 ############################################
92 # TRAITEMENT HAUTE DIRECTION
93 ############################################
94 if workflowed_model and grp_haute_direction in user.groups.all():
0af51c94 95 liste = self.get_query_set().filter(q_non_refuse)
f258e4e7
OL
96
97 ############################################
98 # TRAITEMENT DRH
99 ############################################
100 if grp_drh in user.groups.all():
101 liste = self.get_query_set()
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',
121 'type_poste',
122 'service',
123 'classement_min',
124 'classement_max',
125 'valeur_point_min',
126 'valeur_point_max',
127 )
128 return super(PosteManager, self).get_query_set() \
129 .select_related(*fkeys).all()
130
131
132class DossierManager(SecurityManager):
189b6306
OL
133 prefixe_service = "poste__service"
134 prefixe_implantation = "poste__implantation__region"
f258e4e7 135
b15bf543 136 def ma_region_ou_service(self, user):
18c6d4c0 137 return super(DossierManager, self).ma_region_ou_service(user).filter(poste__actif=True)
b15bf543
OL
138
139