# -*- encoding: utf-8 -*-
+from auf.django.workflow.models import WorkflowCommentaire
from django import forms
-
from django.core.urlresolvers import reverse
from django.core.mail import mail_admins
from django.contrib import admin
from django.contrib import messages
from django.shortcuts import redirect
from reversion.admin import VersionAdmin
-from auf.django.workflow.models import WorkflowCommentaire
-from models import Poste, Dossier, DossierFinalise, PosteFinalise
-from rh.decorators import in_drh_or_admin
+
+from project.dae.models import Poste, Dossier, DossierFinalise, PosteFinalise
+from project.rh.decorators import in_drh_or_admin
+
class PosteAdmin(VersionAdmin):
list_display = ('nom', 'implantation', 'etat', )
_etat.short_description = "État"
_etat.admin_order_field = "etat"
+
class DossierStatutAdmin(StatutAdmin):
search_fields = ('employe__nom', 'employe__prenom', 'poste__nom', )
list_display = ('_poste', '_implantation', 'employe', '_etat', )
_implantation.short_description = u"Implantation"
_implantation.admin_order_field = "poste__implantation"
+
class PosteStatutAdmin(StatutAdmin):
search_fields = ('nom', )
list_display = ('nom', 'implantation', )
# -*- encoding: utf-8 -*-
import datetime
-from django.db.models import Q, Max
-from django import forms
-from django.forms.models import inlineformset_factory, modelformset_factory
-from django.contrib.admin import widgets as admin_widgets
-from ajax_select.fields import AutoCompleteSelectField
+
from auf.django.workflow.forms import WorkflowFormMixin
from auf.django.references import models as ref
-from dae import models as dae
-from utils import get_employe_from_user, is_user_dans_services_centraux
-from rh import models as rh
-from workflow import grp_drh, POSTE_ETATS_BOUTONS, DOSSIER_ETAT_FINALISE, POSTE_ETAT_FINALISE
+from ajax_select.fields import AutoCompleteSelectField
+from django import forms
+from django.contrib.admin import widgets as admin_widgets
+from django.db.models import Q, Max
+from django.forms.models import inlineformset_factory, modelformset_factory
+
+from project.dae import models as dae
+from project.dae.utils import \
+ get_employe_from_user, is_user_dans_services_centraux
+from project.rh import models as rh
+from project.dae.workflow import \
+ grp_drh, POSTE_ETATS_BOUTONS, DOSSIER_ETAT_FINALISE, \
+ POSTE_ETAT_FINALISE
+
def _implantation_choices(obj, request):
# TRAITEMENT NORMAL
employe = get_employe_from_user(request.user)
# SERVICE
if is_user_dans_services_centraux(request.user):
- q = Q(**{ 'id' : employe.implantation_id })
+ q = Q(**{'id': employe.implantation_id})
# REGION
else:
- q = Q(**{ 'region' : employe.implantation.region })
+ 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)]
+ return [('', '----------')] + \
+ [(i.id, unicode(i), )for i in ref.Implantation.objects.filter(q)]
+
def _employe_choices(obj, request):
# TRAITEMENT NORMAL
q_rh_region_service = Q(poste__implantation=employe.implantation)
# REGION
else:
- q_dae_region_service = Q(poste__implantation__region=employe.implantation.region)
- q_rh_region_service = Q(poste__implantation__region=employe.implantation.region)
+ q_dae_region_service = Q(
+ poste__implantation__region=employe.implantation.region
+ )
+ q_rh_region_service = Q(
+ poste__implantation__region=employe.implantation.region
+ )
# TRAITEMENT DRH
if grp_drh in request.user.groups.all():
q_dae_region_service = Q()
q_rh_region_service = Q()
- # On filtre les employes avec les droits régionaux et on s'assure que c'est bien le dernier dossier en date pour sortir l'employe
- # On retient un employé qui travaille présentement dans la même région que le user connecté.
- dossiers_regionaux_ids = [d.id for d in dae.Dossier.objects.filter(q_dae_region_service)]
- employes_ids = [d['employe'] for d in dae.Dossier.objects.values('employe').annotate(dernier_dossier=Max('id')) if d['dernier_dossier'] in dossiers_regionaux_ids]
+ # On filtre les employes avec les droits régionaux et on s'assure que
+ # c'est bien le dernier dossier en date pour sortir l'employe. On retient
+ # un employé qui travaille présentement dans la même région que le user
+ # connecté.
+ dossiers_regionaux_ids = [
+ d.id for d in dae.Dossier.objects.filter(q_dae_region_service)
+ ]
+ employes_ids = [
+ d['employe']
+ for d in dae.Dossier.objects
+ .values('employe')
+ .annotate(dernier_dossier=Max('id'))
+ if d['dernier_dossier'] in dossiers_regionaux_ids
+ ]
dae_employe = dae.Employe.objects.filter(id__in=employes_ids)
dae_ = dae_employe.filter(id_rh__isnull=True)
copies = dae_employe.filter(Q(id_rh__isnull=False))
id_copies = [p.id_rh_id for p in copies.all()]
- dossiers_regionaux_ids = [d.id for d in rh.Dossier.objects.filter(q_rh_region_service)]
- employes_ids = [d['employe'] for d in rh.Dossier.objects.values('employe').annotate(dernier_dossier=Max('id')) if d['dernier_dossier'] in dossiers_regionaux_ids]
- rhv1 = rh.Employe.objects.filter(id__in=employes_ids).exclude(id__in=id_copies)
-
- # On ajoute les nouveaux Employés DAE qui ont été crées, mais qui n'ont pas de Dossier associés
+ dossiers_regionaux_ids = [
+ d.id for d in rh.Dossier.objects.filter(q_rh_region_service)
+ ]
+ employes_ids = [
+ d['employe']
+ for d in rh.Dossier.objects
+ .values('employe')
+ .annotate(dernier_dossier=Max('id'))
+ if d['dernier_dossier'] in dossiers_regionaux_ids
+ ]
+ rhv1 = rh.Employe.objects \
+ .filter(id__in=employes_ids) \
+ .exclude(id__in=id_copies)
+
+ # On ajoute les nouveaux Employés DAE qui ont été crées, mais qui n'ont
+ # pas de Dossier associés
employes_avec_dae = [d.employe_id for d in dae.Dossier.objects.all()]
employes_orphelins = dae.Employe.objects.exclude(id__in=employes_avec_dae)
-
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 | employes_orphelins] +
- [('rh-%s' % p.id, option_label(p)) for p in rhv1],
- key=lambda t: t[1])
+ sorted(
+ [('dae-%s' % p.id, option_label(p))
+ for p in dae_ | copies | employes_orphelins] +
+ [('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"""
annee = ""
if poste.date_debut:
annee = poste.date_debut.year
- label = u"%s %s - %s [%s]" %(annee, poste.type_poste, poste.type_poste.famille_emploi.nom, poste.id)
+ label = u"%s %s - %s [%s]" % (
+ annee, poste.type_poste, poste.type_poste.famille_emploi.nom,
+ poste.id
+ )
return label
PostePieceForm = inlineformset_factory(dae.Poste, dae.PostePiece)
DossierPieceForm = inlineformset_factory(dae.Dossier, dae.DossierPiece)
-FinancementForm = inlineformset_factory(dae.Poste, dae.PosteFinancement, extra=2)
+FinancementForm = inlineformset_factory(
+ dae.Poste, dae.PosteFinancement, extra=2
+)
+
class DossierComparaisonForm(forms.ModelForm):
recherche = AutoCompleteSelectField('dossiers', required=False)
- poste = forms.CharField(max_length=255, widget=forms.TextInput(attrs={'size':'60'}))
+ poste = forms.CharField(
+ max_length=255, widget=forms.TextInput(attrs={'size': '60'})
+ )
class Meta:
model = dae.DossierComparaison
dae.DossierComparaison, extra=3, max_num=3, form=DossierComparaisonForm
)
+
class PosteComparaisonForm(forms.ModelForm):
recherche = AutoCompleteSelectField('dae_postes', required=False)
dae.PosteComparaison, extra=3, max_num=3, form=PosteComparaisonForm
)
+
class FlexibleRemunForm(forms.ModelForm):
montant_mensuel = forms.DecimalField(required=False)
devise = self.cleaned_data['devise']
if devise.code == 'EUR':
return devise
- implantation = ref.Implantation.objects.get(id=self.data['implantation'])
+ implantation = ref.Implantation.objects.get(
+ id=self.data['implantation']
+ )
liste_taux = devise.tauxchange_set.order_by('-annee')
if len(liste_taux) == 0:
- raise forms.ValidationError(u"La devise %s n'a pas de taux pour l'implantation %s" % (devise, implantation))
+ raise forms.ValidationError(
+ u"La devise %s n'a pas de taux pour l'implantation %s" %
+ (devise, implantation)
+ )
else:
return devise
dae.Dossier, dae.Remuneration, extra=5, form=FlexibleRemunForm
)
+
class PosteForm(forms.ModelForm):
""" Formulaire des postes. """
# On ne propose que les services actifs
- service = forms.ModelChoiceField(queryset=rh.Service.objects.all(), required=True)
+ service = forms.ModelChoiceField(
+ queryset=rh.Service.objects.all(), required=True
+ )
- responsable=AutoCompleteSelectField('responsables', required=True)
+ responsable = AutoCompleteSelectField('responsables', required=True)
#responsable = forms.ModelChoiceField(
# queryset=rh.Poste.objects.select_related(depth=1))
poste = forms.ChoiceField(label="Nouveau poste ou évolution du poste",
choices=(), required=False)
- valeur_point_min = forms.ModelChoiceField(queryset=rh.ValeurPoint.actuelles.all(), required=False)
- valeur_point_max = forms.ModelChoiceField(queryset=rh.ValeurPoint.actuelles.all(), required=False)
-
+ valeur_point_min = forms.ModelChoiceField(
+ queryset=rh.ValeurPoint.actuelles.all(), required=False
+ )
+ valeur_point_max = forms.ModelChoiceField(
+ queryset=rh.ValeurPoint.actuelles.all(), required=False
+ )
class Meta:
model = dae.Poste
request = kwargs.pop('request')
super(PosteForm, self).__init__(*args, **kwargs)
self.fields['poste'].choices = self._poste_choices(request)
- self.fields['implantation'].choices = _implantation_choices(self, 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:
if len(dossiers) > 0:
self.initial['service'] = dossiers[0].poste.service
-
def _poste_choices(self, request):
""" Menu déroulant pour les postes.
d'équivalent dans dae.
"""
- copies = dae.Poste.objects.ma_region_ou_service(request.user).exclude(id_rh__isnull=True).filter(etat=POSTE_ETAT_FINALISE)
+ copies = dae.Poste.objects \
+ .ma_region_ou_service(request.user) \
+ .exclude(id_rh__isnull=True) \
+ .filter(etat=POSTE_ETAT_FINALISE)
id_copies = [p.id_rh_id for p in copies.all()]
- rhv1 = rh.Poste.objects.ma_region_ou_service(request.user).exclude(id__in=id_copies)
+ rhv1 = rh.Poste.objects.ma_region_ou_service(request.user) \
+ .exclude(id__in=id_copies)
# Optimisation de la requête
rhv1 = rhv1.select_related(depth=1)
"""
Validation conditionnelles de certains champs.
"""
- cleaned_data = self.cleaned_data
+ cleaned_data = self.cleaned_data
- if cleaned_data.get("local") is False and cleaned_data.get("expatrie") is False:
- msg = "Le poste doit au moins être ouvert localement ou aux expatriés"
+ if cleaned_data.get("local") is False \
+ and cleaned_data.get("expatrie") is False:
+ msg = "Le poste doit au moins être ouvert localement " \
+ "ou aux expatriés"
self._errors["local"] = self.error_class([msg])
self._errors["expatrie"] = ''
raise forms.ValidationError(msg)
return cleaned_data
-
def save(self, *args, **kwargs):
kwargs2 = kwargs.copy()
kwargs2['commit'] = False
def _poste_choices(self, request):
""" Menu déroulant pour les postes. """
- dae_ = dae.Poste.objects.ma_region_ou_service(request.user).filter(id_rh__isnull=True)
- copies = dae.Poste.objects.ma_region_ou_service(request.user).exclude(id_rh__isnull=True)
+ dae_ = dae.Poste.objects.ma_region_ou_service(request.user) \
+ .filter(id_rh__isnull=True)
+ copies = dae.Poste.objects.ma_region_ou_service(request.user) \
+ .exclude(id_rh__isnull=True)
return [('', '----------')] + \
sorted([('dae-%s' % p.id, unicode(p)) for p in dae_ | copies],
class DossierForm(forms.ModelForm):
""" Formulaire des dossiers. """
class Meta:
- exclude= ('etat', 'employe', 'poste', 'date_debut', )
+ exclude = ('etat', 'employe', 'poste', 'date_debut',)
model = dae.Dossier
widgets = dict(statut_residence=forms.RadioSelect(),
contrat_date_debut=admin_widgets.AdminDateWidget(),
WF_HELP_TEXT = ""
+
class PosteWorkflowForm(WorkflowFormMixin):
bouton_libelles = POSTE_ETATS_BOUTONS
+
class Meta:
fields = ('etat', )
model = dae.Poste
class DossierWorkflowForm(WorkflowFormMixin):
- bouton_libelles = POSTE_ETATS_BOUTONS # meme workflow que poste...
+ bouton_libelles = POSTE_ETATS_BOUTONS # meme workflow que poste...
+
class Meta:
fields = ('etat', )
model = dae.Dossier
poste.etat = self.instance.etat
poste.save()
+
class ContratForm(forms.ModelForm):
class Meta:
fields = ('type_contrat', 'fichier', )
model = dae.Contrat
+
class DAENumeriseeForm(forms.ModelForm):
class Meta:
model = dae.Dossier
fields = ('dae_numerisee',)
+
class DAEImportableForm(forms.Form):
qs_poste = dae.Poste.objects.filter(etat=POSTE_ETAT_FINALISE)
qs_dossier = dae.Dossier.objects.filter(etat=DOSSIER_ETAT_FINALISE)
- poste = forms.ModelChoiceField(queryset=qs_poste, label="Poste finalisé", required=False)
- dossier = forms.ModelChoiceField(queryset=qs_dossier, label="DAE finalisée", required=False)
+ poste = forms.ModelChoiceField(
+ queryset=qs_poste, label="Poste finalisé", required=False
+ )
+ dossier = forms.ModelChoiceField(
+ queryset=qs_dossier, label="DAE finalisée", required=False
+ )
def clean_poste(self):
poste = self.cleaned_data['poste']
def clean_dossier(self):
dossier = self.cleaned_data['dossier']
if dossier is not None and not dossier.poste.est_importe():
- raise forms.ValidationError("Le poste de ce dossier doit être importé avant de pouvoir importer le dossier.")
+ raise forms.ValidationError(
+ "Le poste de ce dossier doit être importé avant de pouvoir "
+ "importer le dossier."
+ )
return dossier
def importer_poste(self):
poste = self.cleaned_data['poste']
if poste is not None and not poste.est_importe():
poste.importer()
-
# -=- encoding: utf-8 -=-
+import reversion
+from auf.django.metadata.models import AUFMetadata
from django.conf import settings
from django.core.files.storage import FileSystemStorage
from django.db import models
-import reversion
+
+from project.dae.exporter import DossierCopier, PosteCopier
+from project.dae.managers import \
+ PosteManager, DossierManager, DossierFinaliseManager, \
+ PosteFinaliseManager
+from project.dae.workflow import PosteWorkflow, DossierWorkflow
+from project.dae.workflow import \
+ DOSSIER_ETAT_DRH_FINALISATION, DOSSIER_ETAT_REGION_FINALISATION, \
+ DOSSIER_ETAT_FINALISE
+
+# XXX: Saloperie, il faut importer rh.models à partir d'un autre namespace
+# à cause du hack app_context() dans project.rh.models. Très fragile. Il
+# faut régler ça aussi vite que possible.
from rh import models as rh
-from workflow import PosteWorkflow, DossierWorkflow
-from workflow import DOSSIER_ETAT_DRH_FINALISATION, DOSSIER_ETAT_REGION_FINALISATION, \
- DOSSIER_ETAT_FINALISE
-from auf.django.metadata.models import AUFMetadata
-from managers import *
from rh.models import HELP_TEXT_DATE
-from exporter import DossierCopier, PosteCopier
# Upload de fichiers
UPLOAD_STORAGE = FileSystemStorage(settings.PRIVE_MEDIA_ROOT)
class DeviseException(Exception):
- silent_variable_failure = True
+ silent_variable_failure = True
class Poste(PosteWorkflow, rh.Poste_):
- type_intervention = models.CharField(max_length=1, choices=POSTE_ACTION, default='N')
+ type_intervention = models.CharField(
+ max_length=1, choices=POSTE_ACTION, default='N'
+ )
# Modèle existant
id_rh = models.ForeignKey(rh.Poste, null=True, related_name='+',
verbose_name=u"Mise à jour du poste")
# Rémunération
- indemn_expat_min = models.DecimalField(max_digits=13, decimal_places=2, default=0)
- indemn_expat_max = models.DecimalField(max_digits=12, decimal_places=2, default=0)
- indemn_fct_min = models.DecimalField(max_digits=12, decimal_places=2, default=0)
- indemn_fct_max = models.DecimalField(max_digits=12, decimal_places=2, default=0)
- charges_patronales_min = models.DecimalField(max_digits=12, decimal_places=2, default=0)
- charges_patronales_max = models.DecimalField(max_digits=12, decimal_places=2, default=0)
+ indemn_expat_min = models.DecimalField(
+ max_digits=13, decimal_places=2, default=0
+ )
+ indemn_expat_max = models.DecimalField(
+ max_digits=12, decimal_places=2, default=0
+ )
+ indemn_fct_min = models.DecimalField(
+ max_digits=12, decimal_places=2, default=0
+ )
+ indemn_fct_max = models.DecimalField(
+ max_digits=12, decimal_places=2, default=0
+ )
+ charges_patronales_min = models.DecimalField(
+ max_digits=12, decimal_places=2, default=0
+ )
+ charges_patronales_max = models.DecimalField(
+ max_digits=12, decimal_places=2, default=0
+ )
# Managers
objects = PosteManager()
implantation_devise = rh.TauxChange.objects \
.filter(implantation=self.implantation)[0].devise
except:
- implantation_devise = 5 # EUR
+ implantation_devise = 5 # EUR
return implantation_devise
#####################
#####################
def get_couts_minimum(self):
- return self.salaire_min + self.indemn_expat_min + self.indemn_fct_min + self.charges_patronales_min + self.autre_min
+ return self.salaire_min + self.indemn_expat_min + \
+ self.indemn_fct_min + self.charges_patronales_min + \
+ self.autre_min
def get_salaire_minimum(self):
return self.get_couts_minimum() - self.charges_patronales_min
def get_taux_minimum(self):
if self.devise_min.code == 'EUR':
- return 1
+ return 1
liste_taux = self.devise_min.tauxchange_set.order_by('-annee')
if len(liste_taux) == 0:
- raise DeviseException(u"La devise %s n'a pas de taux pour l'implantation %s" % (self.devise_min, self.implantation))
+ raise DeviseException(
+ u"La devise %s n'a pas de taux pour l'implantation %s" %
+ (self.devise_min, self.implantation))
else:
return liste_taux[0].taux
return float(self.get_salaire_minimum()) * self.get_taux_minimum()
def get_couts_maximum(self):
- return self.salaire_max + self.indemn_expat_max + self.indemn_fct_max + self.charges_patronales_max + self.autre_max
+ return self.salaire_max + self.indemn_expat_max + \
+ self.indemn_fct_max + self.charges_patronales_max + \
+ self.autre_max
def get_salaire_maximum(self):
return self.get_couts_maximum() - self.charges_patronales_max
def get_taux_maximum(self):
if self.devise_max.code == 'EUR':
- return 1
+ return 1
liste_taux = self.devise_max.tauxchange_set.order_by('-annee')
if len(liste_taux) == 0:
- raise DeviseException(u"La devise %s n'a pas de taux pour l'implantation %s" % (self.devise_max, self.implantation))
+ raise DeviseException(
+ u"La devise %s n'a pas de taux pour l'implantation %s" %
+ (self.devise_max, self.implantation)
+ )
else:
return liste_taux[0].taux
except DeviseException, e:
return e
-
- ######################
# Comparaison de poste
- ######################
-
def est_comparable(self):
"""
- Si on a au moins une valeur de saisie dans les comparaisons, alors le poste
- est comparable.
+ Si on a au moins une valeur de saisie dans les comparaisons, alors
+ le poste est comparable.
"""
if self.comp_universite_min is None and \
self.comp_fonctionpub_min is None and \
else:
return True
-
def get_taux_comparaison(self):
try:
- return rh.TauxChange.objects.filter(devise=self.devise_comparaison)[0].taux
+ return rh.TauxChange.objects \
+ .filter(devise=self.devise_comparaison)[0].taux
except:
return 1
def get_comp_autre_max_euros(self):
return (float)(self.comp_autre_max) * self.get_taux_comparaison()
-
def __unicode__(self):
"""
Cette fonction est consommatrice SQL car elle cherche les dossiers
)
return u'%s - %s (%s)' % data
-
# Tester l'enregistrement car les models.py sont importés au complet
if not reversion.is_registered(Poste):
reversion.register(Poste)
-
POSTE_FINANCEMENT_CHOICES = (
('A', 'A - Frais de personnel'),
('B', 'B - Projet(s)-Titre(s)'),
('C', 'C - Autre')
)
+
class PosteFinancement(rh.PosteFinancement_):
pass
+
class PostePiece(rh.PostePiece_):
pass
+
class PosteComparaison(rh.PosteComparaison_):
- statut = models.ForeignKey(rh.Statut, related_name='+', verbose_name=u'Statut', null=True, blank=True, )
- classement = models.ForeignKey(rh.Classement, related_name='+', verbose_name=u'Classement', null=True, blank=True, )
+ statut = models.ForeignKey(
+ rh.Statut, related_name='+', verbose_name=u'Statut', null=True,
+ blank=True
+ )
+ classement = models.ForeignKey(
+ rh.Classement, related_name='+', verbose_name=u'Classement',
+ null=True, blank=True
+ )
### EMPLOYÉ/PERSONNE
('f', 'Femme'),
)
+
class Employe(AUFMetadata):
# Modèle existant
('aucun', 'Aucun'),
)
+
class Dossier(DossierWorkflow, rh.Dossier_):
- poste = models.ForeignKey('Poste', db_column='poste', related_name='%(app_label)s_dossiers')
- employe = models.ForeignKey('Employe', db_column='employe',
- related_name='%(app_label)s_dossiers',
- verbose_name=u"Employé")
+ poste = models.ForeignKey(
+ 'Poste', db_column='poste', related_name='%(app_label)s_dossiers'
+ )
+ employe = models.ForeignKey(
+ 'Employe', db_column='employe',
+ related_name='%(app_label)s_dossiers', verbose_name=u"Employé"
+ )
organisme_bstg_autre = models.CharField(max_length=255,
verbose_name=u"Autre organisme",
help_text="indiquer l'organisme ici s'il n'est pas dans la liste",
salaire_anterieur = models.DecimalField(
max_digits=12, decimal_places=2, null=True, default=None,
blank=True, verbose_name=u'Salaire précédent')
- devise_anterieur = models.ForeignKey(rh.Devise, related_name='+',
- null=True, blank=True)
- type_contrat_anterieur = models.ForeignKey(rh.TypeContrat,
- related_name='+', null=True, blank=True,
- verbose_name=u'Type contrat antérieur', )
+ devise_anterieur = models.ForeignKey(
+ rh.Devise, related_name='+', null=True, blank=True
+ )
+ type_contrat_anterieur = models.ForeignKey(
+ rh.TypeContrat, related_name='+', null=True, blank=True,
+ verbose_name=u'Type contrat antérieur'
+ )
# Données du titulaire précédent
employe_anterieur = models.ForeignKey(
salaire_titulaire_anterieur = models.DecimalField(
max_digits=12, decimal_places=2, default=None, null=True,
blank=True, verbose_name=u'Salaire titulaire précédent')
- devise_titulaire_anterieur = models.ForeignKey(rh.Devise, related_name='+', null=True, blank=True)
+ devise_titulaire_anterieur = models.ForeignKey(
+ rh.Devise, related_name='+', null=True, blank=True
+ )
# Rémunération
salaire = models.DecimalField(max_digits=13, decimal_places=2,
help_text=HELP_TEXT_DATE)
# Justifications
- justif_nouveau_statut_label = u'Justifier le statut que ce type de poste nécessite (national, expatrié, màd ou détachement)'
- justif_nouveau_statut = models.TextField(verbose_name=justif_nouveau_statut_label, null=True, blank=True)
- justif_nouveau_tmp_remplacement_label = u"Si l'employé effectue un remplacement temporaire, préciser"
- justif_nouveau_tmp_remplacement = models.TextField(verbose_name=justif_nouveau_tmp_remplacement_label, null=True, blank=True)
- justif_nouveau_salaire_label = u"Si le salaire de l'employé ne correspond pas au classement du poste ou est différent du salaire antérieur, justifier "
- justif_nouveau_salaire = models.TextField(verbose_name=justif_nouveau_salaire_label, null=True, blank=True)
+ justif_nouveau_statut_label = u'Justifier le statut que ce type ' \
+ u'de poste nécessite (national, expatrié, màd ou détachement)'
+ justif_nouveau_statut = models.TextField(
+ verbose_name=justif_nouveau_statut_label, null=True, blank=True
+ )
+ justif_nouveau_tmp_remplacement_label = u"Si l'employé effectue un " \
+ u"remplacement temporaire, préciser"
+ justif_nouveau_tmp_remplacement = models.TextField(
+ verbose_name=justif_nouveau_tmp_remplacement_label, null=True,
+ blank=True
+ )
+ justif_nouveau_salaire_label = u"Si le salaire de l'employé ne " \
+ u"correspond pas au classement du poste ou est différent " \
+ u"du salaire antérieur, justifier "
+ justif_nouveau_salaire = models.TextField(
+ verbose_name=justif_nouveau_salaire_label, null=True, blank=True
+ )
justif_nouveau_commentaire_label = u"COMMENTAIRES ADDITIONNELS"
- justif_nouveau_commentaire = models.TextField(verbose_name=justif_nouveau_commentaire_label, null=True, blank=True)
- justif_rempl_type_contrat_label = u"Changement de type de contrat, ex : d'un CDD en CDI"
- justif_rempl_type_contrat = models.TextField(verbose_name=justif_rempl_type_contrat_label, null=True, blank=True)
- justif_rempl_statut_employe_label = u"Si le statut de l'employé a été modifié pour ce poste ; ex :national, expatrié, màd, détachement ? Si oui, justifier"
- justif_rempl_statut_employe = models.TextField(verbose_name=justif_rempl_statut_employe_label, null=True, blank=True)
- justif_rempl_evaluation_label = u"L'évaluation de l'employé est-elle favorable? Préciser"
- justif_rempl_evaluation = models.TextField(verbose_name=justif_rempl_evaluation_label, null=True, blank=True)
- justif_rempl_salaire_label = u"Si le salaire de l'employé est modifié et/ou ne correspond pas à son classement, justifier"
- justif_rempl_salaire = models.TextField(verbose_name=justif_rempl_salaire_label, null=True, blank=True)
+ justif_nouveau_commentaire = models.TextField(
+ verbose_name=justif_nouveau_commentaire_label, null=True, blank=True
+ )
+ justif_rempl_type_contrat_label = \
+ u"Changement de type de contrat, ex : d'un CDD en CDI"
+ justif_rempl_type_contrat = models.TextField(
+ verbose_name=justif_rempl_type_contrat_label, null=True, blank=True
+ )
+ justif_rempl_statut_employe_label = \
+ u"Si le statut de l'employé a été modifié pour ce poste ; " \
+ u"ex : national, expatrié, màd, détachement ? Si oui, justifier"
+ justif_rempl_statut_employe = models.TextField(
+ verbose_name=justif_rempl_statut_employe_label, null=True, blank=True
+ )
+ justif_rempl_evaluation_label = \
+ u"L'évaluation de l'employé est-elle favorable? Préciser"
+ justif_rempl_evaluation = models.TextField(
+ verbose_name=justif_rempl_evaluation_label, null=True, blank=True
+ )
+ justif_rempl_salaire_label = \
+ u"Si le salaire de l'employé est modifié et/ou ne correspond " \
+ u"pas à son classement, justifier"
+ justif_rempl_salaire = models.TextField(
+ verbose_name=justif_rempl_salaire_label, null=True, blank=True
+ )
justif_rempl_commentaire_label = u"COMMENTAIRES ADDITIONNELS"
- justif_rempl_commentaire = models.TextField(verbose_name=justif_rempl_commentaire_label, null=True, blank=True)
+ justif_rempl_commentaire = models.TextField(
+ verbose_name=justif_rempl_commentaire_label, null=True, blank=True
+ )
# Comptes
compte_compta = models.CharField(max_length=10, default='aucun',
compte_courriel = models.BooleanField()
# DAE numérisée
- dae_numerisee = models.FileField(upload_to='dae/dae_numerisee', storage=UPLOAD_STORAGE,
- blank=True, null=True, verbose_name="DAE numérisée")
+ dae_numerisee = models.FileField(
+ upload_to='dae/dae_numerisee', storage=UPLOAD_STORAGE, blank=True,
+ null=True, verbose_name="DAE numérisée"
+ )
# Managers
objects = DossierManager()
def __init__(self, *args, **kwargs):
- # Bouchon pour créer une date fictive necessaire pour valider un dossier
- # à cause de l'héritage
+ # Bouchon pour créer une date fictive necessaire pour valider un
+ # dossier à cause de l'héritage
super(rh.Dossier_, self).__init__(*args, **kwargs)
super(DossierWorkflow, self).__init__(*args, **kwargs)
import datetime
self.date_debut = datetime.datetime.today()
def __unicode__(self):
- return u'[%s] %s - %s' % (self.poste.implantation, self.poste.nom, self.employe)
+ return u'[%s] %s - %s' % (
+ self.poste.implantation, self.poste.nom, self.employe
+ )
def importer(self, verbosity=0, dry_run=False):
copieur = DossierCopier(verbosity=verbosity, dry_run=dry_run)
return None
return int(round(float(self.salaire_anterieur) * float(taux), 2))
-
def get_salaire_titulaire_anterieur_euros(self):
if self.devise_titulaire_anterieur is None:
return None
return e
if not taux:
return None
- return int(round(float(self.salaire_titulaire_anterieur) * float(taux), 2))
+ return int(round(
+ float(self.salaire_titulaire_anterieur) * float(taux), 2
+ ))
def valide(self):
return self.etat in (DOSSIER_ETAT_REGION_FINALISATION,
if not reversion.is_registered(Dossier):
reversion.register(Dossier)
+
class DossierPiece(rh.DossierPiece_):
"""Documents relatifs au Dossier (à l'occupation de ce poste par employé).
Ex.: Lettre de motivation.
"""
pass
+
class DossierComparaison(rh.DossierComparaison_):
"""
Photo d'une comparaison salariale au moment de l'embauche.
"""
- statut = models.ForeignKey(rh.Statut, related_name='+', verbose_name='Statut', null=True, blank=True, )
- classement = models.ForeignKey(rh.Classement, related_name='+', verbose_name='Classement', null=True, blank=True, )
+ statut = models.ForeignKey(
+ rh.Statut, related_name='+', verbose_name='Statut', null=True,
+ blank=True
+ )
+ classement = models.ForeignKey(
+ rh.Classement, related_name='+', verbose_name='Classement',
+ null=True, blank=True
+ )
### RÉMUNÉRATION
class Remuneration(rh.Remuneration_):
pass
+
### CONTRATS
class Contrat(rh.Contrat_):
verbose_name = "Import d'un dossier dans RH"
verbose_name_plural = "Import des dossiers dans RH"
+
class PosteFinalise(Poste):
objects = PosteFinaliseManager()
verbose_name = "Import d'un poste dans RH"
verbose_name_plural = "Import des postes dans RH"
+
# modèle de liaison entre les systèmes
class ImportDossier(models.Model):
dae = models.ForeignKey('dae.Dossier', related_name='+')
rh = models.ForeignKey('rh.Dossier', related_name='+')
+
class ImportPoste(models.Model):
dae = models.ForeignKey('dae.Poste', related_name='+')
rh = models.ForeignKey('rh.Poste', related_name='+')
# -*- encoding: utf-8 -*
-from django.conf.urls.defaults import patterns, url, include
+from django.conf.urls.defaults import patterns, url
urlpatterns = patterns(
'project.dae.views',
# poste
url(r'^postes$', 'postes_liste', name='dae_postes_liste'),
- url(r'^poste/consulter/(?P<key>.*)$', 'poste_consulter', name='poste_consulter'),
+ url(r'^poste/consulter/(?P<key>.*)$', 'poste_consulter',
+ name='poste_consulter'),
url(r'^poste$', 'poste', name='poste'),
url(r'^poste/(?P<key>.*)$', 'poste', name='poste'),
url(r'^pieces-postes/(\d+)/(.*)$', 'poste_piece', name='poste_piece'),
# embauche
url(r'^embauches$', 'embauches_liste', name='dae_embauches_liste'),
- url(r'^embauches-finalisees$', 'embauches_finalisees', name='embauches_finalisees'),
+ url(r'^embauches-finalisees$', 'embauches_finalisees',
+ name='embauches_finalisees'),
url(r'^embauche$', 'embauche_choisir_poste', name='embauche'),
- url(r'^embauche/consulter/(?P<dossier_id>.*)$', 'embauche_consulter', name='embauche_consulter'),
- url(r'^embauche/(?P<key>.*)/(?P<dossier_id>.*)$', 'embauche', name='embauche'),
+ url(r'^embauche/consulter/(?P<dossier_id>.*)$', 'embauche_consulter',
+ name='embauche_consulter'),
+ url(r'^embauche/(?P<key>.*)/(?P<dossier_id>.*)$', 'embauche',
+ name='embauche'),
url(r'^embauche/(?P<key>.*)$', 'embauche', name='embauche'),
# contrats
- url(r'^embauches/(?P<dossier_id>\d+)/contrats/ajouter$', 'embauche_ajouter_contrat',
- name='embauche_ajouter_contrat'),
+ url(r'^embauches/(?P<dossier_id>\d+)/contrats/ajouter$',
+ 'embauche_ajouter_contrat', name='embauche_ajouter_contrat'),
url(r'^contrats/(\d+)/fichier/(.*)$', 'contrat', name='contrat'),
- url(r'^contrats/(\d+)/supprimer$', 'contrat_supprimer', name='contrat_supprimer'),
+ url(r'^contrats/(\d+)/supprimer$', 'contrat_supprimer',
+ name='contrat_supprimer'),
# DAE numérisée
- url(r'^embauches/(\d+)/dae_numerisee$', 'dae_numerisee', name='dae_numerisee'),
+ url(r'^embauches/(\d+)/dae_numerisee$', 'dae_numerisee',
+ name='dae_numerisee'),
url(r'^embauches/(\d+)/dae_numerisee/modifier$', 'dae_numerisee_modifier',
name='dae_numerisee_modifier'),
- url(r'^embauches/(\d+)/dae_numerisee/supprimer$', 'dae_numerisee_supprimer',
- name='dae_numerisee_supprimer'),
+ url(r'^embauches/(\d+)/dae_numerisee/supprimer$',
+ 'dae_numerisee_supprimer', name='dae_numerisee_supprimer'),
url(r'^importer$', 'importer_choix_dossier', name='importer_dae'),
url(r'^employe$', 'employe', name='employe'),
url(r'^employe/(?P<key>.*)$', 'employe', name='employe'),
url(r'^dossier$', 'dossier', name='dossier'),
- url(r'^dossier/(?P<poste_key>.*)/(?P<employe_key>.*)$', 'dossier', name='dossier'),
- url(r'^pieces-dossiers/(\d+)/(.*)$', 'dossier_piece', name='dossier_piece'),
- url(r'^dossier_resume/(?P<dossier_id>.*)$', 'dossier_resume', name='dossier_resume'),
- url(r'^poste_resume/(?P<dossier_id>.*)$', 'poste_resume', name='poste_resume'),
+ url(r'^dossier/(?P<poste_key>.*)/(?P<employe_key>.*)$', 'dossier',
+ name='dossier'),
+ url(r'^pieces-dossiers/(\d+)/(.*)$', 'dossier_piece',
+ name='dossier_piece'),
+ url(r'^dossier_resume/(?P<dossier_id>.*)$', 'dossier_resume',
+ name='dossier_resume'),
+ url(r'^poste_resume/(?P<dossier_id>.*)$', 'poste_resume',
+ name='poste_resume'),
url(r'^salaire$', 'salaire', name='salaire'),
url(r'^salaire/(.*)/(.*)/(.*)$', 'salaire', name='salaire'),
url(r'^coefficient$', 'coefficient', name='dae_coefficient'),
- url(r'^liste_valeurs_point$', 'liste_valeurs_point', name='liste_valeurs_point'),
+ url(r'^liste_valeurs_point$', 'liste_valeurs_point',
+ name='liste_valeurs_point'),
url(r'^liste_postes$', 'liste_postes', name='liste_postes'),
url(r'^devise$', 'devise', name='dae_devise'),
url(r'^devises$', 'devises', name='devises'),
from datetime import date
from simplejson import dumps
+from auf.django.permissions.decorators import get_object
+from django.contrib import messages
+from django.contrib.auth.decorators import login_required
+from django.contrib.contenttypes.models import ContentType
from django.core.exceptions import MultipleObjectsReturned
from django.core.paginator import Paginator, InvalidPage
+from django.db.models import Q
from django.http import Http404, HttpResponse, HttpResponseGone
from django.shortcuts import redirect, render_to_response, get_object_or_404
from django.template import RequestContext
-from django.contrib import messages
-from django.contrib.auth.decorators import login_required
-from django.contrib.contenttypes.models import ContentType
-
from sendfile import sendfile
-from auf.django.permissions.decorators import get_object
-
-from dae import models as dae
-from dae.forms import *
-from dae.workflow import DOSSIER_ETAT_FINALISE, DOSSIER_ETAT_REGION_FINALISATION, \
- DOSSIER_ETAT_DRH_FINALISATION, POSTE_ETAT_FINALISE
-from dae.decorators import redirect_interdiction, dae_groupe_requis, \
+from project.dae import models as dae
+from project.dae.decorators import \
+ redirect_interdiction, dae_groupe_requis, \
poste_dans_ma_region_ou_service, \
dossier_dans_ma_region_ou_service, \
vieux_dossier_dans_ma_region_ou_service, \
employe_dans_ma_region_ou_service, \
dossier_est_modifiable, \
poste_est_modifiable, get_contrat
-from dae.mail import send_drh_finalisation_mail
-from rh import models as rh
+from project.dae.forms import \
+ PosteWorkflowForm, PosteForm, FinancementForm, PostePieceForm, \
+ PosteComparaisonFormSet, DossierWorkflowForm, ChoosePosteForm, \
+ EmployeForm, DossierForm, DossierPieceForm, \
+ DossierComparaisonFormSet, RemunForm, ContratForm, DAENumeriseeForm, \
+ label_poste_display, DAEImportableForm
+from project.dae.mail import send_drh_finalisation_mail
+from project.dae.workflow import \
+ DOSSIER_ETAT_FINALISE, DOSSIER_ETAT_REGION_FINALISATION, \
+ DOSSIER_ETAT_DRH_FINALISATION, POSTE_ETAT_FINALISE
+from project.rh import models as rh
def devises():
liste.append(data)
return liste
+
@dae_groupe_requis
def index(request):
return render_to_response('dae/index.html', {}, RequestContext(request))
poste = get_object_or_404(dae.Poste, pk=id)
if request.POST:
- validationForm = PosteWorkflowForm(request.POST, instance=poste, request=request)
+ validationForm = PosteWorkflowForm(
+ request.POST, instance=poste, request=request
+ )
if validationForm.is_valid():
validationForm.save()
- messages.add_message(request, messages.SUCCESS, "La validation a été enregistrée.")
+ messages.add_message(
+ request, messages.SUCCESS, "La validation a été enregistrée."
+ )
return redirect('dae_postes_liste')
else:
validationForm = PosteWorkflowForm(instance=poste, request=request)
- comparaisons_internes = poste.dae_comparaisons_internes.ma_region_ou_service(request.user)
+ comparaisons_internes = \
+ poste.dae_comparaisons_internes.ma_region_ou_service(request.user)
vars = {
'poste': poste,
'validationForm': validationForm,
'comparaisons_internes': comparaisons_internes
}
- return render_to_response('dae/poste_consulter.html', vars, RequestContext(request))
+ return render_to_response(
+ 'dae/poste_consulter.html', vars, RequestContext(request)
+ )
+
@dae_groupe_requis
@poste_dans_ma_region_ou_service
data.update(dict(request.POST.items()))
form = PosteForm(data, instance=poste, request=request)
financementForm = FinancementForm(request.POST, instance=poste)
- piecesForm = PostePieceForm(request.POST, request.FILES, instance=poste)
+ piecesForm = PostePieceForm(
+ request.POST, request.FILES, instance=poste
+ )
if isinstance(poste, dae.Poste):
comparaisons_formset = PosteComparaisonFormSet(
request.POST,
- queryset=poste.dae_comparaisons_internes.ma_region_ou_service(request.user)
+ queryset=poste.dae_comparaisons_internes.ma_region_ou_service(
+ request.user
+ )
)
else:
comparaisons_formset = PosteComparaisonFormSet(
request.POST,
queryset=dae.PosteComparaison.objects.none()
)
- if form.is_valid() and piecesForm.is_valid() and financementForm.is_valid() and \
- comparaisons_formset.is_valid():
+ if form.is_valid() and piecesForm.is_valid() and \
+ financementForm.is_valid() and comparaisons_formset.is_valid():
poste = form.save()
piecesForm.instance = poste
piecesForm.save()
comparaison.poste = poste
comparaison.save()
- messages.add_message(request, messages.SUCCESS, "Le poste %s a été sauvegardé." % poste)
- if request.POST.has_key('save'):
+ messages.add_message(
+ request, messages.SUCCESS,
+ "Le poste %s a été sauvegardé." % poste
+ )
+ if 'save' in request.POST:
return redirect('poste_consulter', key='dae-%s' % poste.id)
else:
return redirect('poste', key='dae-%s' % poste.id)
else:
- messages.add_message(request, messages.ERROR, 'Il y a des erreurs dans le formulaire.')
+ messages.add_message(
+ request, messages.ERROR,
+ 'Il y a des erreurs dans le formulaire.'
+ )
else:
# 'initial' évite la validation prémature lors d'une copie de poste de
financementForm = FinancementForm(instance=poste)
if isinstance(poste, dae.Poste):
comparaisons_formset = PosteComparaisonFormSet(
- queryset=poste.dae_comparaisons_internes.ma_region_ou_service(request.user)
+ queryset=poste.dae_comparaisons_internes.ma_region_ou_service(
+ request.user
+ )
)
else:
comparaisons_formset = PosteComparaisonFormSet(
return render_to_response('dae/poste.html', vars, RequestContext(request))
+
@dae_groupe_requis
def postes_liste(request):
""" Liste des postes. """
content_type = ContentType.objects.get_for_model(dae.Poste)
extra_select = {'derniere_validation': (
"SELECT MAX(date) FROM workflow_workflowcommentaire "
- "WHERE content_type_id = '%s' AND object_id = dae_poste.id" % content_type.id
+ "WHERE content_type_id = '%s' AND object_id = dae_poste.id" %
+ content_type.id
)}
postes_a_traiter = dae.Poste.objects.mes_choses_a_faire(request.user) \
.extra(select=extra_select).order_by('-date_creation')
postes_en_cours = dae.Poste.objects.ma_region_ou_service(request.user) \
- .extra(select=extra_select).filter(~Q(etat=POSTE_ETAT_FINALISE)).order_by('-date_creation')
+ .extra(select=extra_select) \
+ .filter(~Q(etat=POSTE_ETAT_FINALISE)) \
+ .order_by('-date_creation')
return render_to_response('dae/postes_liste.html', {
'postes_a_traiter': postes_a_traiter,
'postes_en_cours': postes_en_cours,
}, RequestContext(request))
+
@login_required
def poste_piece(request, id, filename):
"""Téléchargement d'une pièce jointe à un poste."""
piece = get_object_or_404(dae.PostePiece, pk=id)
- if dae.Poste.objects.ma_region_ou_service(request.user).filter(id=piece.poste_id).exists():
+ if dae.Poste.objects.ma_region_ou_service(request.user) \
+ .filter(id=piece.poste_id).exists():
return sendfile(request, piece.fichier.path)
else:
return redirect_interdiction(request)
### DOSSIER
def filtered_type_remun():
- defaut = (2, 3, 8, 17) # salaire de base, indemnité de fonction, charges patronales
+ defaut = (2, 3, 8, 17) # salaire de base, indemnité de fonction,
+ # charges patronales
return rh.TypeRemuneration.objects.filter(pk__in=defaut)
+
@dae_groupe_requis
@dossier_dans_ma_region_ou_service
def embauche_consulter(request, dossier_id):
etat_precedent = dossier.etat
if request.POST:
- validationForm = DossierWorkflowForm(request.POST, instance=dossier, request=request)
+ validationForm = DossierWorkflowForm(
+ request.POST, instance=dossier, request=request
+ )
if validationForm.is_valid():
if etat_precedent == DOSSIER_ETAT_REGION_FINALISATION and \
- validationForm.cleaned_data['etat'] == DOSSIER_ETAT_DRH_FINALISATION:
+ validationForm.cleaned_data['etat'] == \
+ DOSSIER_ETAT_DRH_FINALISATION:
send_drh_finalisation_mail(request, dossier)
validationForm.save()
- messages.add_message(request, messages.SUCCESS, "La validation a été enregistrée.")
+ messages.add_message(
+ request, messages.SUCCESS, "La validation a été enregistrée."
+ )
return redirect('dae_embauches_liste')
else:
validationForm = DossierWorkflowForm(instance=dossier, request=request)
- comparaisons_internes = dossier.poste.dae_comparaisons_internes.ma_region_ou_service(request.user)
+ comparaisons_internes = \
+ dossier.poste.dae_comparaisons_internes.ma_region_ou_service(
+ request.user
+ )
comparaisons = dossier.dae_comparaisons.ma_region_ou_service(request.user)
vars = {
'dossier': dossier,
'comparaisons': comparaisons
}
- mode = request.GET.get('mode', None)
- return render_to_response('dae/embauche_consulter.html', vars, RequestContext(request))
+ return render_to_response(
+ 'dae/embauche_consulter.html', vars, RequestContext(request)
+ )
+
@dae_groupe_requis
def embauche_choisir_poste(request):
'form': ChoosePosteForm(request=request)
}, RequestContext(request))
+
@dae_groupe_requis
@dossier_dans_ma_region_ou_service
@dossier_est_modifiable
else:
raise Http404
- employe_form = EmployeForm(request.POST, instance=employe, request=request)
+ employe_form = EmployeForm(
+ request.POST, instance=employe, request=request
+ )
if employe_form.is_valid():
data = dict(request.POST.items())
dossier.employe = employe_form.instance
dossier_form = DossierForm(request.POST, instance=dossier)
- piecesForm = DossierPieceForm(request.POST, request.FILES, instance=dossier)
+ piecesForm = DossierPieceForm(
+ request.POST, request.FILES, instance=dossier
+ )
comparaisons_formset = DossierComparaisonFormSet(
request.POST,
- queryset=dossier.dae_comparaisons.ma_region_ou_service(request.user)
+ queryset=dossier.dae_comparaisons.ma_region_ou_service(
+ request.user
+ )
)
remunForm = RemunForm(request.POST, instance=dossier)
comparaison.dossier = dossier
comparaison.save()
- messages.success(request, "Le dossier %s a été sauvegardé." % dossier)
- if request.POST.has_key('save'):
+ messages.success(
+ request, "Le dossier %s a été sauvegardé." % dossier
+ )
+ if 'save' in request.POST:
return redirect('embauche_consulter', dossier_id=dossier.id)
else:
- return redirect('embauche', key=dossier.poste.key, dossier_id=dossier.id)
+ return redirect(
+ 'embauche', key=dossier.poste.key, dossier_id=dossier.id
+ )
else:
- messages.add_message(request, messages.ERROR, 'Il y a des erreurs dans le formulaire.')
+ messages.add_message(
+ request, messages.ERROR,
+ 'Il y a des erreurs dans le formulaire.'
+ )
else:
# Initialisation d'un formulaire vide
dossier = get_object_or_404(dae.Dossier, pk=dossier_id)
employe = dossier.employe
data = dict(employe='dae-%s' % employe.id)
- employe_form = EmployeForm(initial=data, instance=employe, request=request)
+ employe_form = EmployeForm(
+ initial=data, instance=employe, request=request
+ )
else:
dossier_rh = rh.Dossier()
poste_rh = poste.id_rh
dossier_form = DossierForm(instance=dossier)
piecesForm = DossierPieceForm(instance=dossier)
comparaisons_formset = DossierComparaisonFormSet(
- queryset=dossier.dae_comparaisons.ma_region_ou_service(request.user)
+ queryset=dossier.dae_comparaisons.ma_region_ou_service(
+ request.user
+ )
)
remunForm = RemunForm(instance=dossier)
try:
- comparaisons_internes = dossier.poste.dae_comparaisons_internes.ma_region_ou_service(
- request.user
- )
+ comparaisons_internes = \
+ dossier.poste.dae_comparaisons_internes.ma_region_ou_service(
+ request.user
+ )
except dae.Poste.DoesNotExist:
comparaisons_internes = []
'comparaisons_internes': comparaisons_internes
}, RequestContext(request))
+
@dae_groupe_requis
@dossier_dans_ma_region_ou_service
def embauches_liste(request):
content_type = ContentType.objects.get_for_model(dae.Dossier)
extra_select = {'derniere_validation': (
"SELECT MAX(date) FROM workflow_workflowcommentaire "
- "WHERE content_type_id = '%s' AND object_id = dae_dossier.id" % content_type.id
+ "WHERE content_type_id = '%s' AND object_id = dae_dossier.id" %
+ content_type.id
)}
- embauches_a_traiter = dae.Dossier.objects.mes_choses_a_faire(request.user) \
+ embauches_a_traiter = dae.Dossier.objects \
+ .mes_choses_a_faire(request.user) \
.extra(select=extra_select).order_by('-date_creation')
- embauches_en_cours = dae.Dossier.objects.ma_region_ou_service(request.user) \
- .extra(select=extra_select).order_by('-date_creation').exclude(etat=DOSSIER_ETAT_FINALISE)
+ embauches_en_cours = dae.Dossier.objects \
+ .ma_region_ou_service(request.user) \
+ .extra(select=extra_select) \
+ .order_by('-date_creation') \
+ .exclude(etat=DOSSIER_ETAT_FINALISE)
return render_to_response('dae/embauches_liste.html', {
'embauches_a_traiter': embauches_a_traiter,
'embauches_en_cours': embauches_en_cours,
}, RequestContext(request))
+
@dae_groupe_requis
def embauches_finalisees(request):
"""Liste des embauches finalisées."""
else:
dir = ''
if tri == 'region':
- embauches = embauches.order_by(dir + 'poste__implantation__region__nom')
+ embauches = embauches.order_by(
+ dir + 'poste__implantation__region__nom'
+ )
elif tri == 'implantation':
embauches = embauches.order_by(dir + 'poste__implantation__nom')
elif tri == 'poste':
'embauches': page
}, RequestContext(request))
+
def employe(request, key):
""" Récupération AJAX de l'employé pour la page d'embauche. """
data = dict(employe=key)
for field in ('prenom', 'nom', 'genre'):
setattr(employe, field, getattr(e, field))
- return HttpResponse(EmployeForm(initial=data, instance=employe, request=request).as_table())
+ return HttpResponse(
+ EmployeForm(initial=data, instance=employe, request=request).as_table()
+ )
+
### CONTRATS
def contrat(request, contrat, filename):
return sendfile(request, contrat.fichier.path)
+
@dae_groupe_requis
@get_contrat
def contrat_supprimer(request, contrat):
'contrat': contrat
}, RequestContext(request))
+
@dae_groupe_requis
@dossier_dans_ma_region_ou_service
def embauche_ajouter_contrat(request, dossier_id=None):
'form': form
}, RequestContext(request))
+
### DAE NUMERISEE
@get_object(dae.Dossier, 'consulter')
def dae_numerisee(request, dossier):
return sendfile(request, dossier.dae_numerisee.path)
+
@get_object(dae.Dossier, 'modifier_dae_numerisee')
def dae_numerisee_modifier(request, dossier):
if request.method == 'POST':
'form': form
}, RequestContext(request))
+
@get_object(dae.Dossier, 'modifier_dae_numerisee')
def dae_numerisee_supprimer(request, dossier):
if request.method == 'POST':
dossier.dae_numerisee = None
dossier.save()
return redirect('embauche_consulter', dossier_id=dossier.id)
- return render_to_response('dae/dae_numerisee_supprimer.html', {}, RequestContext(request))
+ return render_to_response(
+ 'dae/dae_numerisee_supprimer.html', {}, RequestContext(request)
+ )
+
-################################################################################
# AJAX SECURISE
-################################################################################
+
@dae_groupe_requis
@employe_dans_ma_region_ou_service
def dossier(request, poste_key, employe_key):
# Récupérer la devise de l'implantation lié au poste
implantation_devise = poste.get_default_devise()
- data.update({'devise' : implantation_devise})
+ data.update({'devise': implantation_devise})
if poste.id_rh_id is not None:
poste_rh = get_object_or_404(rh.Poste, pk=poste.id_rh_id)
else:
poste_rh = None
- ##########################################################################################
# NOUVEL EMPLOYE
- ##########################################################################################
if employe_key == '':
employe_source = 'new'
employe = None
dossier_rh = rh.Dossier()
dossier = pre_filled_dossier(dossier_rh, employe_source, poste_rh)
- ##########################################################################################
# EMPLOYE DAE
- ##########################################################################################
if employe_key.startswith('dae'):
- employe_source, employe_id = employe_key.split('-')
- employe_dae = get_object_or_404(dae.Employe, pk=employe_id)
-
- # récupération de l'ancien dossier rh v1 pour l'employe DAE
- try:
- dossier_rh = rh.Dossier.objects.get(employe=employe_dae.id_rh_id, date_fin=None)
- except (rh.Dossier.DoesNotExist):
- dossier_rh = rh.Dossier()
-
- # on tente de récupérer le dossier DAE, au pire on le contruit en le
- # prépoluant avec son dossier rh v1.
- try:
- dossier = dae.Dossier.objects.get(employe=employe_dae, poste=poste)
- except (dae.Dossier.DoesNotExist):
- dossier = pre_filled_dossier(dossier_rh, employe_source, poste_rh)
- employe = employe_dae.id_rh
- ##########################################################################################
+ employe_source, employe_id = employe_key.split('-')
+ employe_dae = get_object_or_404(dae.Employe, pk=employe_id)
+
+ # récupération de l'ancien dossier rh v1 pour l'employe DAE
+ try:
+ dossier_rh = rh.Dossier.objects.get(
+ employe=employe_dae.id_rh_id, date_fin=None
+ )
+ except (rh.Dossier.DoesNotExist):
+ dossier_rh = rh.Dossier()
+
+ # on tente de récupérer le dossier DAE, au pire on le contruit en le
+ # prépoluant avec son dossier rh v1.
+ try:
+ dossier = dae.Dossier.objects.get(employe=employe_dae, poste=poste)
+ except (dae.Dossier.DoesNotExist):
+ dossier = pre_filled_dossier(dossier_rh, employe_source, poste_rh)
+ employe = employe_dae.id_rh
+
# EMPLOYE RH v1
- ##########################################################################################
if employe_key.startswith('rh'):
- employe_source, employe_id = employe_key.split('-')
- employe_rh = get_object_or_404(rh.Employe, pk=employe_id)
-
- # récupération de l'ancien dossier rh v1 pour l'employe rh v1, s'il n'en a pas,
- # on en fournit un nouveau qui servira uniquement un créer un nouveau dossier DAE.
- try:
- dossier_rh = rh.Dossier.objects.get(employe=employe_rh, date_fin=None)
- except (rh.Dossier.DoesNotExist):
- dossier_rh = rh.Dossier()
- dossier = pre_filled_dossier(dossier_rh, employe_source, poste_rh)
- employe = employe_rh
+ employe_source, employe_id = employe_key.split('-')
+ employe_rh = get_object_or_404(rh.Employe, pk=employe_id)
+
+ # récupération de l'ancien dossier rh v1 pour l'employe rh v1, s'il
+ # n'en a pas, on en fournit un nouveau qui servira uniquement un
+ # créer un nouveau dossier DAE.
+ try:
+ dossier_rh = rh.Dossier.objects.get(
+ employe=employe_rh, date_fin=None
+ )
+ except (rh.Dossier.DoesNotExist):
+ dossier_rh = rh.Dossier()
+ dossier = pre_filled_dossier(dossier_rh, employe_source, poste_rh)
+ employe = employe_rh
dossier_form = DossierForm(initial=data, instance=dossier)
vars = dict(form=dossier_form, poste=poste, employe=employe)
return render_to_response('dae/embauche-dossier.html', vars,
RequestContext(request))
-# @Cette fonction est appelée à partir de fonctions déjà sécurisée
+
+# Cette fonction est appelée à partir de fonctions déjà sécurisée
def pre_filled_dossier(dossier_rh, employe_source, poste_rh):
dossier = dae.Dossier()
dossier.classement_anterieur = dossier_rh.classement
# Récupération du salaire de base
- remun = dossier_rh.remunerations().filter(type=1).order_by('-date_debut')
+ remun = dossier_rh.remunerations() \
+ .filter(type=1).order_by('-date_debut')
if remun:
dossier.salaire_anterieur = remun[0].montant
dossier.devise_anterieur = remun[0].devise
dossier.employe_anterieur = titulaire
dossier.classement_titulaire_anterieur = d.classement
dossier.statut_titulaire_anterieur = d.statut
- remun = d.remunerations().filter(type=1).order_by('-date_debut')[0]
+ remun = d.remunerations().filter(type=1) \
+ .order_by('-date_debut')[0]
dossier.salaire_titulaire_anterieur = remun.montant
dossier.devise_titulaire_anterieur = remun.devise
except:
return dossier
+
@dae_groupe_requis
@vieux_dossier_dans_ma_region_ou_service
def dossier_resume(request, dossier_id=None):
if dossier.statut is not None:
data['statut'] = dossier.statut.id
data['implantation'] = dossier.poste.implantation.id
- data['poste'] = u"%s %s" % (dossier.poste.type_poste.nom, dossier.poste.nom)
+ data['poste'] = u"%s %s" % (
+ dossier.poste.type_poste.nom, dossier.poste.nom
+ )
salaire = dossier.get_salaire()
if salaire is not None:
data['montant'] = float(salaire.montant)
data['montant_euros'] = 0
return HttpResponse(dumps(data))
+
@dae_groupe_requis
@vieux_dossier_dans_ma_region_ou_service
def poste_resume(request, dossier_id=None):
salaire = dossier.get_salaire()
data = {}
data['implantation'] = dossier.poste.implantation.id
- data['poste'] = u"%s %s" % (dossier.poste.type_poste.nom, dossier.poste.nom)
+ data['poste'] = u"%s %s" % (
+ dossier.poste.type_poste.nom, dossier.poste.nom
+ )
if salaire is not None:
data['devise'] = salaire.devise.id
data['montant'] = float(salaire.montant)
data['classement'] = dossier.classement_id
return HttpResponse(dumps(data))
+
def liste_postes(request):
""" Appel AJAX :
input : implantation_id
data = []
# Voir le code de _poste_choices dans forms.py
- copies = dae.Poste.objects.exclude(id_rh__isnull=True).filter(etat=POSTE_ETAT_FINALISE)
+ copies = dae.Poste.objects.exclude(id_rh__isnull=True) \
+ .filter(etat=POSTE_ETAT_FINALISE)
rh_postes_actifs = rh.Poste.objects.all()
- if 'implantation_id' in params and params.get('implantation_id') is not u"":
+ if 'implantation_id' in params \
+ and params.get('implantation_id') is not u"":
implantation_id = params.get('implantation_id')
copies = copies.filter(implantation__id=implantation_id)
- rh_postes_actifs = rh_postes_actifs.filter(implantation__id=implantation_id)
+ rh_postes_actifs = rh_postes_actifs.filter(
+ implantation__id=implantation_id
+ )
id_copies = [p.id_rh_id for p in copies.all()]
rhv1 = rh_postes_actifs.exclude(id__in=id_copies)
rhv1 = rhv1.select_related(depth=1)
- data = [('', 'Nouveau poste')] + sorted([('rh-%s' % p.id, label_poste_display(p)) for p in rhv1], key=lambda t: t[1])
+ data = [('', 'Nouveau poste')] + \
+ sorted([('rh-%s' % p.id, label_poste_display(p)) for p in rhv1],
+ key=lambda t: t[1])
return HttpResponse(dumps(data))
+
@login_required
def dossier_piece(request, id, filename):
"""Téléchargement d'une pièce jointe à un poste."""
piece = get_object_or_404(dae.DossierPiece, pk=id)
- if dae.Dossier.objects.ma_region_ou_service(request.user).filter(id=piece.dossier_id).exists():
+ if dae.Dossier.objects.ma_region_ou_service(request.user) \
+ .filter(id=piece.dossier_id).exists():
return sendfile(request, piece.fichier.path)
else:
return redirect_interdiction(request)
+
@login_required
def importer_choix_dossier(request):
method = request.method
form = DAEImportableForm(params)
if form.is_valid():
form.importer_poste()
- messages.add_message(request, messages.SUCCESS, "L'importation a réussie.")
+ messages.add_message(
+ request, messages.SUCCESS, "L'importation a réussie."
+ )
else:
form = DAEImportableForm()
-
+
vars = dict(form=form, )
return render_to_response('admin/dae/importer_choix_dossier.html', vars,
RequestContext(request))
-################################################################################
+
# AJAX SECURITE non nécessaire
-################################################################################
+
def coefficient(request):
""" Appel AJAX :
input : classement
valeur_point = rh.ValeurPoint.objects.get(pk=valeur_point)
annee = valeur_point.annee
try:
- taux = rh.TauxChange.objects.get(annee=annee, devise=valeur_point.devise)
+ taux = rh.TauxChange.objects.get(
+ annee=annee, devise=valeur_point.devise
+ )
except MultipleObjectsReturned:
- return HttpResponseGone(u"Il existe plusieurs taux pour la devise %s cette année-là : %s" % \
- (valeur_point.devise.code, annee))
+ return HttpResponseGone(
+ u"Il existe plusieurs taux pour la devise %s "
+ u"cette année-là : %s" % (valeur_point.devise.code, annee)
+ )
data['devise'] = taux.devise.id
data['valeur'] = valeur_point.valeur
return HttpResponseGone("Vous devez choisir une valeur de point")
return HttpResponse(dumps(data))
+
def devise_code(request):
""" Appel AJAX :
input : devise
data['taux_euro'] = taux[0].taux
return HttpResponse(dumps(data))
+
def add_remun(request, dossier, type_remun):
dossier = get_object_or_404(dae.Dossier, pk=dossier)
type_remun = get_object_or_404(rh.TypeRemuneration, pk=type_remun)
return render_to_response('dae/embauche-remun.html', dict(dossier=dossier),
RequestContext(request))
+
def salaire(request, implantation, devise, classement):
if not devise or not classement:
raise Http404
taux = rh.TauxChange.objects.filter(devise=devise).order_by('-annee')
- vp = rh.ValeurPoint.objects.filter(implantation=implantation, devise=devise) \
- .order_by('-annee')
+ vp = rh.ValeurPoint.objects \
+ .filter(implantation=implantation, devise=devise) \
+ .order_by('-annee')
if vp.count() == 0:
raise Exception(u"pas de valeur de point pour le couple\
return HttpResponse(dumps(data))
+
def liste_valeurs_point(request):
""" Appel AJAX :
input : implantation_id
params = getattr(request, method, [])
data = []
annee_courante = datetime.datetime.now().year
- if 'implantation_id' in params and params.get('implantation_id') is not u"":
+ if 'implantation_id' in params \
+ and params.get('implantation_id') is not u"":
implantation_id = params.get('implantation_id')
- preselectionne = rh.ValeurPoint.objects.filter(implantation=implantation_id, annee__in=(annee_courante,)).order_by("-annee")
+ preselectionne = rh.ValeurPoint.objects \
+ .filter(implantation=implantation_id, annee=annee_courante) \
+ .order_by("-annee")
for o in preselectionne:
- data.append({'id' : o.id, 'label' : o.__unicode__(), 'devise' : o.devise_id, 'suggestion' : True})
+ data.append({
+ 'id': o.id,
+ 'label': o.__unicode__(),
+ 'devise': o.devise_id,
+ 'suggestion': True
+ })
else:
preselectionne = rh.ValeurPoint.objects.none()
- liste_complete = rh.ValeurPoint.objects.filter(annee__in=(annee_courante,)).order_by("-annee")
+ liste_complete = rh.ValeurPoint.objects \
+ .filter(annee__in=(annee_courante,)) \
+ .order_by("-annee")
for o in liste_complete.exclude(id__in=[p.id for p in preselectionne]):
- data.append({'id' : o.id, 'label' : o.__unicode__(), 'devise' : o.devise_id, 'suggestion' : False})
+ data.append({
+ 'id': o.id,
+ 'label': o.__unicode__(),
+ 'devise': o.devise_id,
+ 'suggestion': False
+ })
return HttpResponse(dumps(data, indent=4))