fix empty group
[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
5from utils import is_user_dans_service, get_employe_from_user
18c6d4c0
OL
6from workflow import POSTE_ETAT_HAUTE_DIRECTION, \
7 POSTE_ETAT_POLE_FINANCIER, \
8 POSTE_ETAT_REFUSE, \
9 DOSSIER_ETAT_REFUSE, \
10 MAP_GROUPE_ETATS_A_FAIRE
f258e4e7
OL
11from workflow import dae_groupes, \
12 grp_administrateurs, \
13 grp_gestionnaires, \
14 grp_directeurs_bureau, \
15 grp_drh, \
16 grp_pole_financier, \
17 grp_haute_direction, \
18 grp_service_utilisateurs, \
19 grp_directeurs_service, \
20 grp_correspondants_rh
21
515124ec 22
f258e4e7
OL
23class SecurityManager(models.Manager):
24
25 prefixe_implantation = None
26
515124ec
OL
27 def mes_choses_a_faire(self, user):
28 q = Q()
bb59cdf6 29 rien_a_faire = True
515124ec
OL
30 for g in user.groups.all():
31 etats = MAP_GROUPE_ETATS_A_FAIRE.get(g, ())
32 for etat in etats:
bb59cdf6 33 rien_a_faire = False
515124ec
OL
34 q = q | Q(etat=etat)
35
bb59cdf6
OL
36 if rien_a_faire:
37 qs = self.ma_region_ou_service(user).none()
38 else:
39 qs = self.ma_region_ou_service(user).filter(q)
40
515124ec
OL
41 return qs
42
f258e4e7
OL
43 def ma_region_ou_service(self, user):
44 """
45 Filtrage des postes en fonction du user connecté (region / service)
46 On s'intéresse aussi au groupe auquel appartient le user car certains groupes
47 peuvent tout voir.
48 """
072d6547
OL
49 # On s'assure que le manager travaille sur un modèle avec WF, autrement
50 # on ne teste pas sur l'état
51 try:
52 self.model._meta.get_field_by_name('etat')
53 workflowed_model = True
54 except:
55 workflowed_model = False
56
f258e4e7
OL
57 employe = get_employe_from_user(user)
58
59 ############################################
60 # TRAITEMENT NORMAL
61 ############################################
62
63 # SERVICE
64 if is_user_dans_service(user):
65 q = Q(**{ '%s' % self.prefixe_implantation : employe.implantation })
66 # REGION
67 else:
68 q = Q(**{ '%s__region' % self.prefixe_implantation : employe.implantation.region })
f258e4e7 69
3420143c
OL
70 if workflowed_model:
71 q_non_refuse = ~Q(etat__in=(POSTE_ETAT_REFUSE, DOSSIER_ETAT_REFUSE,))
72 q = q & q_non_refuse
73
74 liste = self.get_query_set().filter(q)
f258e4e7 75
0adcf7d1
OL
76 ############################################
77 # TRAITEMENT POLE FINANCIER
78 ############################################
79 if workflowed_model and grp_pole_financier in user.groups.all():
80 liste = self.get_query_set().filter(q)
18c6d4c0 81
0adcf7d1
OL
82 ############################################
83 # TRAITEMENT HAUTE DIRECTION
84 ############################################
85 if workflowed_model and grp_haute_direction in user.groups.all():
86 liste = self.get_query_set().filter(q)
f258e4e7
OL
87
88 ############################################
89 # TRAITEMENT DRH
90 ############################################
91 if grp_drh in user.groups.all():
92 liste = self.get_query_set()
18c6d4c0 93
f258e4e7
OL
94 return liste
95
96
97class PosteManager(SecurityManager):
98 """
99 Chargement de tous les objets FK existants sur chaque QuerySet.
100 """
101 prefixe_implantation = "implantation"
102
b15bf543 103 def ma_region_ou_service(self, user):
18c6d4c0 104 return super(PosteManager, self).ma_region_ou_service(user).filter(actif=True)
b15bf543 105
f258e4e7
OL
106 def get_query_set(self):
107 fkeys = (
108 'id_rh',
109 'responsable',
110 'implantation',
111 'type_poste',
112 'service',
113 'classement_min',
114 'classement_max',
115 'valeur_point_min',
116 'valeur_point_max',
117 )
118 return super(PosteManager, self).get_query_set() \
119 .select_related(*fkeys).all()
120
121
122class DossierManager(SecurityManager):
123 prefixe_implantation = "poste__implantation"
124
b15bf543 125 def ma_region_ou_service(self, user):
18c6d4c0 126 return super(DossierManager, self).ma_region_ou_service(user).filter(poste__actif=True)
b15bf543
OL
127
128