# -*- encoding: utf-8 -*-
-import datetime
from datetime import date
from django.db import models
from django.db.models import Q
+from django.db.models.query import QuerySet
from auf.django.metadata.managers import NoDeleteManager, NoDeleteQuerySet
from project.groups import get_employe_from_user
-from project.groups import grp_administrateurs, \
- grp_directeurs_bureau, \
- grp_drh, \
- grp_drh2, \
- grp_accior, \
- grp_abf, \
- grp_haute_direction, \
- grp_service_utilisateurs, \
- grp_correspondants_rh
+from project.groups import \
+ grp_drh, grp_drh2, grp_accior, grp_abf, grp_haute_direction, \
+ grp_service_utilisateurs
class SecurityManager(models.Manager):
def ma_region_ou_service(self, user):
"""
Filtrage des postes en fonction du user connecté (region / service)
- On s'intéresse aussi au groupe auquel appartient le user car certains groupes
- peuvent tout voir.
+ On s'intéresse aussi au groupe auquel appartient le user car
+ certains groupes peuvent tout voir.
"""
employe = get_employe_from_user(user)
# TRAITEMENT NORMAL
############################################
# REGION
- q = Q(**{ self.prefixe_implantation : employe.implantation.region })
+ q = Q(**{self.prefixe_implantation: employe.implantation.region})
# SERVICE
- if self.prefixe_service and grp_service_utilisateurs in user.groups.all():
- q = q | Q(**{ self.prefixe_service : employe.service})
+ if self.prefixe_service \
+ and grp_service_utilisateurs in user.groups.all():
+ q = q | Q(**{self.prefixe_service: employe.service})
liste = self.get_query_set().filter(q)
return liste
+class ActifsQuerySet(QuerySet):
+
+ def _actifs(self, debut_field, fin_field, date_min=None, date_max=None,
+ annee=None):
+ qs = self
+ if annee:
+ janvier = date(annee, 1, 1)
+ decembre = date(annee, 12, 31)
+ date_min = max(janvier, date_min) if date_min else janvier
+ date_max = min(decembre, date_max) if date_max else decembre
+ if not date_min and not date_max:
+ date_min = date_max = date.today()
+ if date_min:
+ qs = qs.filter(
+ Q(**{fin_field + '__gte': date_min}) |
+ Q(**{fin_field: None})
+ )
+ if date_max:
+ qs = qs.filter(
+ Q(**{debut_field + '__lte': date_max}) |
+ Q(**{debut_field: None})
+ )
+ return qs
+
+ def actifs(self, *args, **kwargs):
+ return self._actifs('date_debut', 'date_fin', *args, **kwargs)
+
+
+class PosteQuerySet(NoDeleteQuerySet, ActifsQuerySet):
+ pass
+
+
class PosteManager(SecurityManager, NoDeleteManager):
- """
- Chargement de tous les objets FK existants sur chaque QuerySet.
- """
prefixe_service = "service"
prefixe_implantation = "implantation__region"
- def actifs(self):
- q_actif = Q(date_fin__gt=datetime.datetime.now()) | Q(date_fin__isnull=True)
- return super(PosteManager, self).get_query_set().filter(q_actif)
+ def get_query_set(self):
+ return PosteQuerySet(self.model).filter(supprime=False) \
+ .select_related('type_poste')
+
+ def actifs(self, *args, **kwargs):
+ return self.get_query_set().actifs(*args, **kwargs)
def ma_region_ou_service(self, user):
return super(PosteManager, self).ma_region_ou_service(user)
- def get_query_set(self):
- fkeys = (
- #'id_rh',
- #'responsable',
- #'implantation',
- #'implantation.bureau_rattachement',
- 'type_poste',
- #'service',
- #'classement_min',
- #'classement_max',
- #'valeur_point_min',
- #'valeur_point_max',
- )
- return super(PosteManager, self).get_query_set() \
- .select_related(*fkeys).all()
+
+class DossierQuerySet(NoDeleteQuerySet, ActifsQuerySet):
+ pass
class DossierManager(SecurityManager, NoDeleteManager):
prefixe_implantation = "poste__implantation__region"
def get_query_set(self):
- fkeys = (
- 'poste',
- 'employe',
- )
- return super(DossierManager, self).get_query_set() \
- .select_related(*fkeys).all()
+ return DossierQuerySet(self.model) \
+ .filter(supprime=False) \
+ .select_related('poste', 'employe')
- def ma_region_ou_service(self, user):
- return super(DossierManager, self).ma_region_ou_service(user)
+ def actifs(self, *args, **kwargs):
+ return self.get_query_set().actifs(*args, **kwargs)
+
+
+class RemunerationQuerySet(NoDeleteQuerySet, ActifsQuerySet):
+
+ def actifs(self, *args, **kwargs):
+ return self \
+ ._actifs('date_debut', 'date_fin', *args, **kwargs) \
+ ._actifs(
+ 'dossier__date_debut', 'dossier__date_fin', *args, **kwargs
+ )
+
+
+class RemunerationManager(NoDeleteManager):
+
+ def get_query_set(self):
+ return RemunerationQuerySet(self.model).filter(supprime=False)
+
+ def actifs(self, *args, **kwargs):
+ return self.get_query_set().actifs(*args, **kwargs)
-class EmployeQuerySet(NoDeleteQuerySet):
+class EmployeQuerySet(NoDeleteQuerySet, ActifsQuerySet):
+
def actifs(self, date_min=None, date_max=None, annee=None):
- qs = self
- if annee:
- janvier = date(annee, 1, 1)
- decembre = date(annee, 12, 31)
- date_min = max(janvier, date_min) if date_min else janvier
- date_max = min(decembre, date_max) if date_max else decembre
- if not date_min and not date_max:
- date_min = date_max = date.today()
- if date_min:
- qs = qs.filter(
- Q(rh_dossiers__date_fin__gte=date_min) | Q(rh_dossiers__date_fin=None)
- )
- if date_max:
- qs = qs.filter(
- Q(rh_dossiers__date_debut__lte=date_max) | Q(rh_dossiers__date_debut=None)
- )
- return qs.distinct()
+ return self._actifs('dossiers__date_debut', 'dossiers__date_fin') \
+ .distinct()
+
class EmployeManager(NoDeleteManager):
def get_query_set(self):
def actifs(self, *args, **kwargs):
return self.get_query_set().actifs(*args, **kwargs)
+
class PosteComparaisonManager(SecurityManager):
use_for_related_fields = True
prefixe_implantation = "implantation__region"
class DeviseManager(NoDeleteManager):
pass
+
class ServiceManager(NoDeleteManager):
pass
+
class TypeRemunerationManager(NoDeleteManager):
pass