36dc9a970ce720891082fc7942a36720b2307fac
[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
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 class SecurityManager(models.Manager):
19
20 prefixe_implantation = None
21
22 def ma_region_ou_service(self, user):
23 """
24 Filtrage des postes en fonction du user connecté (region / service)
25 On s'intéresse aussi au groupe auquel appartient le user car certains groupes
26 peuvent tout voir.
27 """
28
29 # On s'assure que le manager travaille sur un modèle avec WF, autrement
30 # on ne teste pas sur l'état
31 try:
32 self.model._meta.get_field_by_name('etat')
33 workflowed_model = True
34 except:
35 workflowed_model = False
36
37 employe = get_employe_from_user(user)
38
39 ############################################
40 # TRAITEMENT NORMAL
41 ############################################
42
43 # SERVICE
44 if is_user_dans_service(user):
45 q = Q(**{ '%s' % self.prefixe_implantation : employe.implantation })
46 # REGION
47 else:
48 q = Q(**{ '%s__region' % self.prefixe_implantation : employe.implantation.region })
49 liste = self.get_query_set().filter(q)
50
51 ############################################
52 # TRAITEMENT POLE FINANCIER
53 ############################################
54 if workflowed_model and grp_pole_financier in user.groups.all():
55 liste = self.get_query_set().filter(etat=POSTE_ETAT_FINANCE)
56
57 ############################################
58 # TRAITEMENT HAUTE DIRECTION
59 ############################################
60 if workflowed_model and grp_haute_direction in user.groups.all():
61 liste = self.get_query_set().filter(etat=POSTE_ETAT_HAUTE_DIRECTION)
62
63 ############################################
64 # TRAITEMENT DRH
65 ############################################
66 if grp_drh in user.groups.all():
67 liste = self.get_query_set()
68
69 return liste
70
71
72 class PosteManager(SecurityManager):
73 """
74 Chargement de tous les objets FK existants sur chaque QuerySet.
75 """
76 prefixe_implantation = "implantation"
77
78 def get_query_set(self):
79 fkeys = (
80 'id_rh',
81 'responsable',
82 'implantation',
83 'type_poste',
84 'service',
85 'classement_min',
86 'classement_max',
87 'valeur_point_min',
88 'valeur_point_max',
89 )
90 return super(PosteManager, self).get_query_set() \
91 .select_related(*fkeys).all()
92
93
94 class DossierManager(SecurityManager):
95 prefixe_implantation = "poste__implantation"
96