[#2206] Remplacer l'état "refusé" par les deux états "demande de modification" et...
[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 get_employe_from_user
6 from workflow import POSTE_ETAT_HAUTE_DIRECTION, \
7 POSTE_ETAT_ACCIOR, \
8 POSTE_ETAT_ABF, \
9 DOSSIER_ETAT_ACCIOR, \
10 DOSSIER_ETAT_ABF, \
11 MAP_GROUPE_ETATS_A_FAIRE
12 from workflow import dae_groupes, \
13 grp_administrateurs, \
14 grp_directeurs_bureau, \
15 grp_drh, \
16 grp_accior, \
17 grp_abf, \
18 grp_haute_direction, \
19 grp_service_utilisateurs, \
20 grp_correspondants_rh
21
22
23 class SecurityManager(models.Manager):
24
25 prefixe_service = None
26 prefixe_implantation = None
27
28 def mes_choses_a_faire(self, user):
29 q = Q()
30 rien_a_faire = True
31 for g in user.groups.all():
32 etats = MAP_GROUPE_ETATS_A_FAIRE.get(g, ())
33 for etat in etats:
34 rien_a_faire = False
35 q = q | Q(etat=etat)
36
37 if rien_a_faire:
38 qs = self.ma_region_ou_service(user).none()
39 else:
40 qs = self.ma_region_ou_service(user).filter(q)
41
42 return qs
43
44 def ma_region_ou_service(self, user):
45 """
46 Filtrage des postes en fonction du user connecté (region / service)
47 On s'intéresse aussi au groupe auquel appartient le user car certains groupes
48 peuvent tout voir.
49 """
50 # On s'assure que le manager travaille sur un modèle avec WF, autrement
51 # on ne teste pas sur l'état
52 try:
53 self.model._meta.get_field_by_name('etat')
54 workflowed_model = True
55 except:
56 workflowed_model = False
57
58 employe = get_employe_from_user(user)
59
60 ############################################
61 # TRAITEMENT NORMAL
62 ############################################
63 # REGION
64 q = Q(**{ self.prefixe_implantation : employe.implantation.region })
65
66 # SERVICE
67 if workflowed_model and grp_service_utilisateurs in user.groups.all():
68 q = q | Q(**{ self.prefixe_service : employe.service})
69
70 liste = self.get_query_set().filter(q)
71
72
73 ############################################
74 # TRAITEMENT ACCIOR
75 ############################################
76 if workflowed_model and grp_accior in user.groups.all():
77 liste = liste | self.get_query_set().filter(Q(etat__in=(POSTE_ETAT_ACCIOR, DOSSIER_ETAT_ACCIOR,)))
78
79 ############################################
80 # TRAITEMENT ABF
81 ############################################
82 if workflowed_model and grp_abf in user.groups.all():
83 liste = self.get_query_set().all()
84
85 ############################################
86 # TRAITEMENT HAUTE DIRECTION
87 ############################################
88 if workflowed_model and grp_haute_direction in user.groups.all():
89 liste = self.get_query_set().all()
90
91 ############################################
92 # TRAITEMENT DRH
93 ############################################
94 if grp_drh in user.groups.all():
95 liste = self.get_query_set().all()
96
97 return liste
98
99
100 class PosteManager(SecurityManager):
101 """
102 Chargement de tous les objets FK existants sur chaque QuerySet.
103 """
104 prefixe_service = "service"
105 prefixe_implantation = "implantation__region"
106
107 def ma_region_ou_service(self, user):
108 return super(PosteManager, self).ma_region_ou_service(user).filter(actif=True)
109
110 def get_query_set(self):
111 fkeys = (
112 'id_rh',
113 'responsable',
114 'implantation',
115 'implantation.bureau_rattachement',
116 'type_poste',
117 'service',
118 'classement_min',
119 'classement_max',
120 'valeur_point_min',
121 'valeur_point_max',
122 )
123 return super(PosteManager, self).get_query_set() \
124 .select_related(*fkeys).all()
125
126
127 class DossierManager(SecurityManager):
128 prefixe_service = "poste__service"
129 prefixe_implantation = "poste__implantation__region"
130
131 def get_query_set(self):
132 fkeys = (
133 'poste',
134 )
135 return super(DossierManager, self).get_query_set() \
136 .select_related(*fkeys).all()
137
138 def ma_region_ou_service(self, user):
139 return super(DossierManager, self).ma_region_ou_service(user).filter(poste__actif=True)
140
141