# -*- encoding: utf-8 -*-
+from django.db.models import Q
from django import forms
from django.forms.models import inlineformset_factory
from django.contrib.admin import widgets as admin_widgets
from ajax_select.fields import AutoCompleteSelectField
from auf.django.workflow.forms import WorkflowFormMixin
from datamaster_modeles import models as ref
-
from dae import models as dae
+from utils import get_employe_from_user, is_user_dans_service
from rh_v1 import models as rh
+from workflow import grp_drh
+
+def _implantation_choices(obj, request):
+ # TRAITEMENT NORMAL
+ employe = get_employe_from_user(request.user)
+ # SERVICE
+ if is_user_dans_service(request.user):
+ q = Q(**{ 'id' : employe.implantation_id })
+ # REGION
+ else:
+ q = Q(**{ 'region' : employe.implantation.region })
+
+ # TRAITEMENT DRH
+ if grp_drh in request.user.groups.all():
+ q = Q()
+ return [('', '----------')] + [(i.id, unicode(i), )for i in ref.Implantation.objects.filter(q)]
+
+def _employe_choices(obj, request):
+ q = Q(id_rh__isnull=True) & Q(id_rh__isnull=True)
+
+ # TRAITEMENT NORMAL
+ employe = get_employe_from_user(request.user)
+ # SERVICE
+ if is_user_dans_service(request.user):
+ q_region_service = Q(implantation1=employe.implantation) | Q(implantation2=employe.implantation)
+ # REGION
+ else:
+ q_region_service = Q(implantation1__region=employe.implantation.region) | Q(implantation2__region=employe.implantation.region)
+ # TRAITEMENT DRH
+ if grp_drh in request.user.groups.all():
+ q_region_service = Q()
+
+ # Construction de la liste des employés en puisant dans DAE (pas d'info) et dans rh_v1
+ # Pour le filtrage par région/service, on est obligé d'aller regarder le dossier rh_v1
+ # car l'information dans le modèle rh_v1.Employe n'existe pas.
+ dae_ = dae.Employe.objects.filter(id_rh__isnull=True)
+ copies = dae.Employe.objects.filter(Q(id_rh__isnull=False))
+ id_copies = [p.id_rh_id for p in copies.all()]
+ employes_ids = list(set([d.employe_id for d in rh.Dossier.objects.filter(q_region_service)]))
+ rhv1 = rh.Employe.objects.filter(id__in=employes_ids).exclude(id__in=id_copies)
+
+ def option_label(employe):
+ return "%s %s" % (employe.nom.upper(), employe.prenom.title())
+
+ return [('', 'Nouvel employé')] + \
+ sorted([('dae-%s' % p.id, option_label(p)) for p in dae_ | copies] +
+ [('rh-%s' % p.id, option_label(p)) for p in rhv1],
+ key=lambda t: t[1])
+
def label_poste_display(poste):
"""Formate un visuel pour un poste dans une liste déroulante"""
valeur_point_min = forms.ModelChoiceField(queryset=rh.ValeurPoint.actuelles.all(), required=False)
valeur_point_max = forms.ModelChoiceField(queryset=rh.ValeurPoint.actuelles.all(), required=False)
- def __init__(self, *args, **kwargs):
+ def __init__(self, request, *args, **kwargs):
""" Mise à jour dynamique du contenu du menu des postes.
Si on ne met le menu à jour de cette façon, à chaque instantiation du
"""
super(PosteForm, self).__init__(*args, **kwargs)
- self.fields['poste'].choices = self._poste_choices()
+ self.fields['poste'].choices = self._poste_choices(request)
+ self.fields['implantation'].choices = _implantation_choices(self, request)
# Quand le dae.Poste n'existe pas, on recherche dans les dossiers rhv1
if self.instance and self.instance.id is None:
self.initial['nom'] = "%s %s" % (self.initial['nom'], self.instance.get_complement_nom())
- def _poste_choices(self):
+ def _poste_choices(self, request):
""" Menu déroulant pour les postes.
Constitué des postes de dae et des postes de rh_v1 qui n'ont pas
d'équivalent dans dae.
"""
- dae_ = dae.Poste.objects.filter(actif=True, id_rh__isnull=True)
- copies = dae.Poste.objects.exclude(id_rh__isnull=True)
+ dae_ = dae.Poste.objects.ma_region_ou_service(request.user).filter(actif=True, id_rh__isnull=True)
+ copies = dae.Poste.objects.ma_region_ou_service(request.user).exclude(id_rh__isnull=True)
id_copies = [p.id_rh_id for p in copies.all()]
- rhv1 = rh.Poste.objects.filter(actif=True).exclude(id__in=id_copies)
+ rhv1 = rh.Poste.objects.ma_region_ou_service(request.user).filter(actif=True).exclude(id__in=id_copies)
# Optimisation de la requête
rhv1 = rhv1.select_related(depth=1)
# La liste des choix est laissée vide. Voir Poste.__init__ pour la raison.
employe = forms.ChoiceField(choices=(), required=False)
- def __init__(self, *args, **kwargs):
+ def __init__(self, request, *args, **kwargs):
""" Mise à jour dynamique du contenu du menu des employés. """
super(EmployeForm, self).__init__(*args, **kwargs)
- self.fields['employe'].choices = self._employe_choices()
-
- def _employe_choices(self):
- """ Menu déroulant pour les employés. """
- dae_ = dae.Employe.objects.filter(id_rh__isnull=True)
- copies = dae.Employe.objects.exclude(id_rh__isnull=True)
- id_copies = [p.id_rh_id for p in copies.all()]
- rhv1 = rh.Employe.objects.exclude(id__in=id_copies)
+ self.fields['employe'].choices = _employe_choices(self, request)
- def option_label(employe):
- return "%s %s" % (employe.nom.upper(), employe.prenom.title())
-
- return [('', 'Nouvel employé')] + \
- sorted([('dae-%s' % p.id, option_label(p)) for p in dae_ | copies] +
- [('rh-%s' % p.id, option_label(p)) for p in rhv1],
- key=lambda t: t[1])
class DossierForm(forms.ModelForm):
--- /dev/null
+# -*- encoding: utf-8 -*-
+
+from django.db import models
+from django.db.models import Q
+from utils import is_user_dans_service, get_employe_from_user
+from workflow import POSTE_ETAT_HAUTE_DIRECTION, POSTE_ETAT_POLE_FINANCIER
+from workflow import dae_groupes, \
+ grp_administrateurs, \
+ grp_gestionnaires, \
+ grp_directeurs_bureau, \
+ grp_drh, \
+ grp_pole_financier, \
+ grp_haute_direction, \
+ grp_service_utilisateurs, \
+ grp_directeurs_service, \
+ grp_correspondants_rh
+
+class SecurityManager(models.Manager):
+
+ prefixe_implantation = None
+
+ 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.
+ """
+
+ employe = get_employe_from_user(user)
+
+ ############################################
+ # TRAITEMENT NORMAL
+ ############################################
+
+ # SERVICE
+ if is_user_dans_service(user):
+ q = Q(**{ '%s' % self.prefixe_implantation : employe.implantation })
+ # REGION
+ else:
+ q = Q(**{ '%s__region' % self.prefixe_implantation : employe.implantation.region })
+ liste = self.get_query_set().filter(q)
+
+ ############################################
+ # TRAITEMENT POLE FINANCIER
+ ############################################
+ if grp_pole_financier in user.groups.all():
+ liste = self.get_query_set().filter(etat=POSTE_ETAT_FINANCE)
+
+ ############################################
+ # TRAITEMENT HAUTE DIRECTION
+ ############################################
+ if grp_haute_direction in user.groups.all():
+ liste = self.get_query_set().filter(etat=POSTE_ETAT_HAUTE_DIRECTION)
+
+ ############################################
+ # TRAITEMENT DRH
+ ############################################
+ if grp_drh in user.groups.all():
+ liste = self.get_query_set()
+
+ return liste
+
+
+class PosteManager(SecurityManager):
+ """
+ Chargement de tous les objets FK existants sur chaque QuerySet.
+ """
+ prefixe_implantation = "implantation"
+
+ def get_query_set(self):
+ fkeys = (
+ 'id_rh',
+ 'responsable',
+ 'implantation',
+ '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 DossierManager(SecurityManager):
+ prefixe_implantation = "poste__implantation"
+
from django.conf import settings
from django.core.files.storage import FileSystemStorage
from django.db import models
-from django.db.models import Q
import reversion
from workflow import PosteWorkflow, DossierWorkflow
-from workflow import dae_groupes, \
- grp_administrateurs, \
- grp_gestionnaires, \
- grp_directeurs_bureau, \
- grp_drh, \
- grp_pole_financier, \
- grp_haute_direction, \
- grp_service_utilisateurs, \
- grp_directeurs_service, \
- grp_correspondants_rh
-from workflow import POSTE_ETAT_HAUTE_DIRECTION, POSTE_ETAT_POLE_FINANCIER
-
+from managers import DossierManager, PosteManager
import datamaster_modeles.models as ref
from rh_v1 import models as rh
-from utils import is_user_dans_service, get_employe_from_user
STATUT_RESIDENCE_CHOICES = (
('local', 'Local'),
fichier = models.FileField(verbose_name="Fichier", upload_to=poste_piece_dispatch, storage=storage_prive)
-class SecurityManager(models.Manager):
-
- prefixe_implantation = None
-
- 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.
- """
-
- employe = get_employe_from_user(user)
-
- ############################################
- # TRAITEMENT NORMAL
- ############################################
-
- # SERVICE
- if is_user_dans_service(user):
- q = Q(**{ '%s' % self.prefixe_implantation : employe.implantation })
- # REGION
- else:
- q = Q(**{ '%s__region' % self.prefixe_implantation : employe.implantation.region })
- liste = self.get_query_set().filter(q)
-
- ############################################
- # TRAITEMENT POLE FINANCIER
- ############################################
- if grp_pole_financier in user.groups.all():
- liste = self.get_query_set().filter(etat=POSTE_ETAT_FINANCE)
-
- ############################################
- # TRAITEMENT HAUTE DIRECTION
- ############################################
- if grp_haute_direction in user.groups.all():
- liste = self.get_query_set().filter(etat=POSTE_ETAT_HAUTE_DIRECTION)
-
- ############################################
- # TRAITEMENT DRH
- ############################################
- if grp_drh in user.groups.all():
- liste = self.get_query_set()
-
- return liste
-
-
-class PosteManager(SecurityManager):
- """
- Chargement de tous les objets FK existants sur chaque QuerySet.
- """
- prefixe_implantation = "implantation"
-
- def get_query_set(self):
- fkeys = (
- 'id_rh',
- 'responsable',
- 'implantation',
- '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 Poste(PosteWorkflow, models.Model):
# Modèle existant
id_rh = models.ForeignKey(rh.Poste, null=True, related_name='+',
fichier = models.FileField(verbose_name="Fichier", upload_to=dossier_piece_dispatch, storage=storage_prive)
-class DossierManager(SecurityManager):
- prefixe_implantation = "poste__implantation"
-
class Dossier(DossierWorkflow, models.Model):
# Modèle existant
if request.POST:
data.update(dict(request.POST.items()))
- form = PosteForm(data, instance=poste)
+ form = PosteForm(data, instance=poste, request=request)
financementForm = FinancementForm(request.POST, instance=poste)
piecesForm = PostePieceForm(request.POST, request.FILES, instance=poste)
if 'save' in data and form.is_valid() and piecesForm.is_valid() and financementForm.is_valid():
else:
# 'initial' évite la validation prémature lors d'une copie de poste de
# rh_v1 vers dae.
- form = PosteForm(initial=data, instance=poste)
+ form = PosteForm(initial=data, instance=poste, request=request)
piecesForm = PostePieceForm(instance=poste)
financementForm = FinancementForm(instance=poste)
else:
raise Http404
- employe_form = EmployeForm(request.POST, instance=employe)
+ employe_form = EmployeForm(request.POST, instance=employe, request=request)
if 'save' in request.POST:
if employe_form.is_valid():
employe_form = EmployeForm(initial=data, instance=employe)
else:
dossier = pre_filled_dossier(dossier_rh, 'new', poste_rh)
- employe_form = EmployeForm()
+ employe_form = EmployeForm(request=request)
dossier_form = DossierForm(instance=dossier)
piecesForm = DossierPieceForm(instance=dossier)
for field in ('prenom', 'nom', 'genre'):
setattr(employe, field, getattr(e, field))
- return HttpResponse(EmployeForm(initial=data, instance=employe).as_table())
+ return HttpResponse(EmployeForm(initial=data, instance=employe, request=request).as_table())
def dossier(request, poste_key, employe_key):
""" Récupération AJAX du dossier pour la page d'embauche. """
import datetime
from django.db import models
from datamaster_modeles.models import Pays, Implantation
+from dae.managers import SecurityManager
GENRE_CHOICES = (
('m', 'Homme'),
('1', '1'),
)
-class PosteManager(models.Manager):
+class PosteManager(SecurityManager):
"""
Chargement de tous les objets FK existants sur chaque QuerySet.
"""
+ prefixe_implantation = 'implantation'
+
def get_query_set(self):
fkeys = (
'implantation',