fix #1465, poste uniquement pour linstant
[auf_rh_dae.git] / project / dae / managers.py
1 # -*- encoding: utf-8 -*-
2
3 from django.db import models
4 from django.db.models import Q
5 from utils import is_user_dans_service, get_employe_from_user
6 from workflow import POSTE_ETAT_HAUTE_DIRECTION, POSTE_ETAT_POLE_FINANCIER, MAP_GROUPE_ETATS_A_FAIRE
7 from workflow import dae_groupes, \
8 grp_administrateurs, \
9 grp_gestionnaires, \
10 grp_directeurs_bureau, \
11 grp_drh, \
12 grp_pole_financier, \
13 grp_haute_direction, \
14 grp_service_utilisateurs, \
15 grp_directeurs_service, \
16 grp_correspondants_rh
17
18
19 class SecurityManager(models.Manager):
20
21 prefixe_implantation = None
22
23 def mes_choses_a_faire(self, user):
24 q = Q()
25 for g in user.groups.all():
26 etats = MAP_GROUPE_ETATS_A_FAIRE.get(g, ())
27 for etat in etats:
28 q = q | Q(etat=etat)
29
30 qs = self.ma_region_ou_service(user).filter(q)
31 return qs
32
33 def ma_region_ou_service(self, user):
34 """
35 Filtrage des postes en fonction du user connecté (region / service)
36 On s'intéresse aussi au groupe auquel appartient le user car certains groupes
37 peuvent tout voir.
38 """
39
40 # On s'assure que le manager travaille sur un modèle avec WF, autrement
41 # on ne teste pas sur l'état
42 try:
43 self.model._meta.get_field_by_name('etat')
44 workflowed_model = True
45 except:
46 workflowed_model = False
47
48 employe = get_employe_from_user(user)
49
50 ############################################
51 # TRAITEMENT NORMAL
52 ############################################
53
54 # SERVICE
55 if is_user_dans_service(user):
56 q = Q(**{ '%s' % self.prefixe_implantation : employe.implantation })
57 # REGION
58 else:
59 q = Q(**{ '%s__region' % self.prefixe_implantation : employe.implantation.region })
60 liste = self.get_query_set().filter(q)
61
62 ############################################
63 # TRAITEMENT POLE FINANCIER
64 ############################################
65 if workflowed_model and grp_pole_financier in user.groups.all():
66 liste = self.get_query_set().filter(etat=POSTE_ETAT_POLE_FINANCIER)
67
68 ############################################
69 # TRAITEMENT HAUTE DIRECTION
70 ############################################
71 if workflowed_model and grp_haute_direction in user.groups.all():
72 liste = self.get_query_set().filter(etat=POSTE_ETAT_HAUTE_DIRECTION)
73
74 ############################################
75 # TRAITEMENT DRH
76 ############################################
77 if grp_drh in user.groups.all():
78 liste = self.get_query_set()
79
80 return liste
81
82
83 class PosteManager(SecurityManager):
84 """
85 Chargement de tous les objets FK existants sur chaque QuerySet.
86 """
87 prefixe_implantation = "implantation"
88
89 def get_query_set(self):
90 fkeys = (
91 'id_rh',
92 'responsable',
93 'implantation',
94 'type_poste',
95 'service',
96 'classement_min',
97 'classement_max',
98 'valeur_point_min',
99 'valeur_point_max',
100 )
101 return super(PosteManager, self).get_query_set() \
102 .select_related(*fkeys).all()
103
104
105 class DossierManager(SecurityManager):
106 prefixe_implantation = "poste__implantation"
107