1 # -*- encoding: utf-8 -*-
3 from datetime
import date
5 from django
.db
import models
6 from django
.db
.models
import Q
7 from django
.db
.models
.query
import QuerySet
9 from project
import groups
12 class SecurityManager(models
.Manager
):
14 prefixe_service
= None
15 prefixe_implantation
= None
17 def ma_region_ou_service(self
, user
):
19 Filtrage des postes en fonction du user connecté (region / service)
20 On s'intéresse aussi au groupe auquel appartient le user car
21 certains groupes peuvent tout voir.
23 employe
= groups
.get_employe_from_user(user
)
24 groupes
= [g
.name
for g
in user
.groups
.all()]
26 ############################################
28 ############################################
31 # Zones administratives attribuées au profil.
32 zones
= groups
.get_zones_from_user(user
)
33 q
= Q(**{'%s__in' % self
.prefixe_implantation
: zones
})
36 if self
.prefixe_service \
37 and groups
.SERVICE_UTILISATEURS
in groupes
:
38 q
= q |
Q(**{self
.prefixe_service
: employe
.service
})
40 liste
= self
.get_query_set().filter(q
)
42 ############################################
44 ############################################
45 if groups
.ACCIOR
in groupes
:
46 liste
= self
.get_query_set().all()
48 ############################################
50 ############################################
51 if groups
.ABF
in groupes
:
52 liste
= self
.get_query_set().all()
54 ############################################
56 ############################################
57 if groups
.FINANCE
in groupes
:
58 liste
= self
.get_query_set().all()
60 ############################################
61 # TRAITEMENT HAUTE DIRECTION
62 ############################################
63 if groups
.HAUTE_DIRECTION
in groupes
:
64 liste
= self
.get_query_set().all()
66 ############################################
68 ############################################
69 if groups
.DRH_NIVEAU_1
in groupes
or groups
.DRH_NIVEAU_2
in groupes
:
70 liste
= self
.get_query_set().all()
73 liste
= self
.get_query_set().all()
78 class ActifsQuerySet(QuerySet
):
79 debut_field
= 'date_debut'
80 fin_field
= 'date_fin'
82 def _actifs(self
, debut_field
, fin_field
, date_min
=None, date_max
=None,
86 janvier
= date(annee
, 1, 1)
87 decembre
= date(annee
, 12, 31)
88 date_min
= max(janvier
, date_min
) if date_min
else janvier
89 date_max
= min(decembre
, date_max
) if date_max
else decembre
90 if not date_min
and not date_max
:
91 date_min
= date_max
= date
.today()
94 Q(**{fin_field
+ '__gte': date_min
}) |
95 Q(**{fin_field
: None}))
98 Q(**{debut_field
+ '__lte': date_max
}) |
99 Q(**{debut_field
: None}))
101 q_inconnus
= self
._inconnus(debut_field
, fin_field
)
102 return q
& ~q_inconnus
104 def _inconnus(self
, debut_field
, fin_field
):
106 debut_field
+ '__isnull': True,
107 fin_field
+ '__isnull': True,
111 def get_q_actifs(self
, date_min
=None, date_max
=None, annee
=None):
112 return self
._actifs(self
.debut_field
, self
.fin_field
,
113 date_min
, date_max
, annee
)
115 def actifs(self
, date_min
=None, date_max
=None, annee
=None):
117 q
= self
.get_q_actifs(date_min
, date_max
, annee
)
120 def get_q_inconnus(self
, date_min
=None, date_max
=None, annee
=None):
121 return self
._inconnus(self
.debut_field
, self
.fin_field
)
125 q
= self
.get_q_inconnus()
128 def get_q_inactifs(self
, date_min
=None, date_max
=None, annee
=None):
129 actifs_ids
= [e
['id'] for e
in self
.actifs(date_min
, date_max
,
131 q_non_actifs
= ~
Q(id__in
=actifs_ids
)
132 q_inconnus
= self
.get_q_inconnus()
133 q_futurs
= self
.get_q_futurs(date_min
, date_max
, annee
)
134 return q_non_actifs
& ~q_inconnus
& ~q_futurs
136 def inactifs(self
, date_min
=None, date_max
=None, annee
=None):
137 return self
.get_q_inactifs(date_min
, date_max
, annee
)
139 def get_q_futurs(self
, date_min
=None, date_max
=None, annee
=None):
142 janvier
= date(annee
, 1, 1)
143 decembre
= date(annee
, 12, 31)
144 date_min
= max(janvier
, date_min
) if date_min
else janvier
145 date_max
= min(decembre
, date_max
) if date_max
else decembre
146 if not date_min
and not date_max
:
147 date_min
= date_max
= date
.today()
149 q
= q
& Q(**{self
.debut_field
+ '__gt': date_min
})
151 q
= q
& Q(**{self
.debut_field
+ '__gt': date_max
})
154 def futurs(self
, date_min
=None, date_max
=None, annee
=None):
155 return self
.get_q_futurs(date_min
, date_max
, annee
)
158 class PosteQuerySet(ActifsQuerySet
):
162 class PosteManager(SecurityManager
):
163 prefixe_service
= "service"
164 prefixe_implantation
= "implantation__zone_administrative"
166 def get_query_set(self
):
167 return PosteQuerySet(self
.model
).select_related('type_poste')
169 def ma_region_ou_service(self
, user
):
170 return super(PosteManager
, self
).ma_region_ou_service(user
)
172 def actifs(self
, *args
, **kwargs
):
173 return self
.get_query_set().actifs(*args
, **kwargs
)
175 class DossierQuerySet(ActifsQuerySet
):
179 class DossierManager(SecurityManager
):
180 prefixe_service
= "poste__service"
181 prefixe_implantation
= "poste__implantation__zone_administrative"
183 def get_query_set(self
):
184 return DossierQuerySet(self
.model
) \
185 .select_related('poste', 'employe')
187 def actifs(self
, *args
, **kwargs
):
188 return self
.get_query_set().actifs(*args
, **kwargs
)
190 def sans_contrats_ou_echus(self
, *args
, **kwargs
):
191 app
= self
.model
._meta
.app_label
193 SELECT D.id FROM %(app)s_dossier AS D
194 LEFT JOIN %(app)s_contrat AS C ON D.id = C.dossier AND C.date_debut =
195 (SELECT MAX(date_debut) FROM %(app)s_contrat WHERE dossier=D.id)
196 WHERE (D.date_fin > '%(today)s' OR D.date_fin IS NULL)
197 AND (C.id IS NULL OR C.date_fin < '%(today)s')
198 """ % {'today': date
.today(), 'app': app
}
199 ids
= [d
.id for d
in self
.raw(sql
)]
200 return self
.get_query_set().filter(id__in
=ids
).filter(*args
, **kwargs
)
203 class RemunerationQuerySet(ActifsQuerySet
):
205 def actifs(self
, *args
, **kwargs
):
206 remun_q
= self
._actifs('date_debut', 'date_fin', *args
, **kwargs
)
207 dossier_q
= self
._actifs('dossier__date_debut', 'dossier__date_fin',
209 return self
.filter(remun_q
& dossier_q
)
212 class RemunerationManager(models
.Manager
):
214 def get_query_set(self
):
215 return RemunerationQuerySet(self
.model
)
217 def actifs(self
, *args
, **kwargs
):
218 return self
.get_query_set().actifs(*args
, **kwargs
)
221 class EmployeQuerySet(ActifsQuerySet
):
222 debut_field
= 'rh_dossiers__date_debut'
223 fin_field
= 'rh_dossiers__date_fin'
226 class EmployeManager(models
.Manager
):
228 def get_query_set(self
):
229 return EmployeQuerySet(self
.model
)
231 def actifs(self
, *args
, **kwargs
):
232 return self
.get_query_set().actifs(*args
, **kwargs
)
235 class ContratQuerySet(ActifsQuerySet
):
238 class ContratManager(models
.Manager
):
240 def get_query_set(self
):
241 return ContratQuerySet(self
.model
)\
242 .select_related('dossier', 'dossier__poste')
245 class PosteComparaisonManager(SecurityManager
):
246 use_for_related_fields
= True
247 prefixe_implantation
= "implantation__zone_administrative"
250 class DossierComparaisonManager(SecurityManager
):
251 use_for_related_fields
= True
252 prefixe_implantation
= "implantation__zone_administrative"
255 class ArchivableManager(models
.Manager
):
257 def get_query_set(self
):
258 return super(ArchivableManager
, self
).get_query_set() \
259 .filter(archive
=False)