http://pypi.auf.org/simple/auf.django.emploi/
http://pypi.auf.org/django-alphafilter/
http://pypi.auf.org/simple/auf.django.references/
-
develop = src/qbe
src/auf.django.metadata
-
eggs =
django
south
# 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 rh.models import HELP_TEXT_DATE
+from project.rh import models as rh
+from project.rh.models import HELP_TEXT_DATE
# Upload de fichiers
UPLOAD_STORAGE = FileSystemStorage(settings.PRIVE_MEDIA_ROOT)
class PosteFinancement(rh.PosteFinancement_):
- pass
+ poste = models.ForeignKey(
+ Poste, db_column='poste', related_name='dae_financements'
+ )
class PostePiece(rh.PostePiece_):
- pass
+ poste = models.ForeignKey(
+ Poste, db_column='poste', related_name='dae_pieces'
+ )
class PosteComparaison(rh.PosteComparaison_):
+ poste = models.ForeignKey(
+ Poste, related_name='dae_comparaisons_internes'
+ )
statut = models.ForeignKey(
rh.Statut, related_name='+', verbose_name=u'Statut', null=True,
blank=True
class Dossier(DossierWorkflow, rh.Dossier_):
poste = models.ForeignKey(
- 'Poste', db_column='poste', related_name='%(app_label)s_dossiers'
+ 'Poste', db_column='poste', related_name='dae_dossiers'
)
employe = models.ForeignKey(
'Employe', db_column='employe',
- related_name='%(app_label)s_dossiers', verbose_name=u"Employé"
+ related_name='rh_dossiers', verbose_name=u"Employé"
)
organisme_bstg_autre = models.CharField(max_length=255,
verbose_name=u"Autre organisme",
class DossierPiece(rh.DossierPiece_):
- """Documents relatifs au Dossier (à l'occupation de ce poste par employé).
+ """
+ Documents relatifs au Dossier (à l'occupation de ce poste par employé).
Ex.: Lettre de motivation.
"""
- pass
+ dossier = models.ForeignKey(
+ Dossier, db_column='dossier', related_name='dae_dossierpieces'
+ )
class DossierComparaison(rh.DossierComparaison_):
"""
Photo d'une comparaison salariale au moment de l'embauche.
"""
+ dossier = models.ForeignKey(
+ Dossier, related_name='dae_comparaisons'
+ )
statut = models.ForeignKey(
rh.Statut, related_name='+', verbose_name='Statut', null=True,
blank=True
### RÉMUNÉRATION
class Remuneration(rh.Remuneration_):
- pass
+ dossier = models.ForeignKey(
+ Dossier, db_column='dossier', related_name='dae_remunerations'
+ )
### CONTRATS
class Contrat(rh.Contrat_):
- pass
+ dossier = models.ForeignKey(
+ Dossier, db_column='dossier', related_name='dae_contrats'
+ )
grp_correspondants_rh, grp_directeurs_bureau, grp_accior, grp_abf, \
grp_haute_direction
+dae_groupes = (
+ grp_correspondants_rh,
+ grp_administrateurs,
+ grp_directeurs_bureau,
+ grp_drh,
+ grp_drh2,
+ grp_accior,
+ grp_abf,
+ grp_haute_direction,
+ grp_service_utilisateurs,
+)
+
# codes états
POSTE_ETAT_BROUILLON = 'BROUILLON'
POSTE_ETAT_ADMINISTRATEUR = 'ADMINISTRATEUR'
# -*- encoding: utf-8 -*-
import textwrap
+
+from auf.django.emploi.models import OffreEmploi, Candidat, CandidatPiece
+from datamaster_modeles.models import Region, Bureau
from django.core.urlresolvers import reverse
from django.http import HttpResponseRedirect
from django.contrib import admin
from django.db.models import Avg
from django.conf import settings
from django.shortcuts import redirect
-
from reversion.admin import VersionAdmin
-from datamaster_modeles.models import Region, Bureau
-from project.rh import models as rh
from project.dae.utils import get_employe_from_user as get_emp
from project.recrutement.forms import OffreEmploiForm
from project.recrutement.models import \
- Evaluateur, CandidatEvaluation, CandidatPiece, OffreEmploi, \
- ProxyOffreEmploi, Candidat, ProxyCandidat, MesCandidatEvaluation, \
+ Evaluateur, CandidatEvaluation, \
+ ProxyOffreEmploi, ProxyCandidat, MesCandidatEvaluation, \
CourrielTemplate
from project.recrutement.workflow import \
grp_drh_recrutement, grp_drh2_recrutement, \
grp_administrateurs_recrutement, \
grp_correspondants_rh_recrutement, \
grp_haute_direction_recrutement
+from project.rh import models as rh
### CONSTANTES
return moyenne_votes
-class OffreEmploi(emploi.OffreEmploi):
- class Meta:
- proxy = True
-
-
-class CandidatPiece(emploi.CandidatPiece):
- class Meta:
- proxy = True
-
-
class OffreEmploiManager(models.Manager):
def get_query_set(self):
fkeys = ('region',)
# -*- encoding: utf-8 -*-
+from auf.django.emploi import models as emploi
from django.core.urlresolvers import reverse
from django.contrib import messages
from django.views.static import serve
from django.template import Context, RequestContext, Template
from django.core.mail import EmailMultiAlternatives
-from forms import *
-from models import *
-from recrutement.workflow import recrutement_groupes
+from project.dae.decorators import redirect_interdiction
+from project.recrutement import forms
+from project.recrutement import models
+from project.recrutement.workflow import recrutement_groupes
+
-################################################################################
# MEDIA PRIVE
-################################################################################
def mediaserve(request, path, document_root=None, show_indexes=False):
"""
return serve(request, path, document_root, show_indexes)
+
def index(request):
- return render_to_response('recrutement/index.html', {},
- RequestContext(request))
+ return render_to_response(
+ 'recrutement/index.html', {}, RequestContext(request)
+ )
+
def selectionner_template(request):
candidat_ids = request.GET.get('ids')
if request.method == "POST":
- form = CandidatCourrielTemplateForm(request.POST)
+ form = forms.CandidatCourrielTemplateForm(request.POST)
if form.is_valid():
form.save()
courriel_template_id = form.get_template()
-
- return HttpResponseRedirect(reverse('envoyer_courriel_candidats')+
- "?ids_cand=%s&id_temp=%s" % (candidat_ids, courriel_template_id))
+
+ return HttpResponseRedirect(
+ reverse('envoyer_courriel_candidats') +
+ "?ids_cand=%s&id_temp=%s" %
+ (candidat_ids, courriel_template_id)
+ )
else:
- form = CandidatCourrielTemplateForm()
+ form = forms.CandidatCourrielTemplateForm()
+
+ return render_to_response("recrutement/selectionner_template.html", {
+ 'form': form
+ }, context_instance=RequestContext(request))
- c = {'form' : form}
- return render_to_response("recrutement/selectionner_template.html",
- Context(c), context_instance = RequestContext(request))
def envoyer_courriel_candidats(request):
candidat_ids = request.GET.get('ids_cand').split(',')
- candidats = Candidat.objects.filter(id__in=candidat_ids)
+ candidats = models.Candidat.objects.filter(id__in=candidat_ids)
template_id = request.GET.get('id_temp')
- template = CourrielTemplate.objects.get(id=template_id)
+ template = models.CourrielTemplate.objects.get(id=template_id)
if request.method == "POST":
- form = CandidatCourrielForm(request.POST, instance=template,
- candidats=candidats, template=template)
+ form = forms.CandidatCourrielForm(
+ request.POST, instance=template, candidats=candidats,
+ template=template
+ )
if form.is_valid():
form.save()
- courriel_template = CourrielTemplate()
+ courriel_template = models.CourrielTemplate()
courriel_template.nom_modele = template.nom_modele
courriel_template.sujet = form.data['sujet']
courriel_template.plain_text = form.data['plain_text']
- for cand in candidats:
+ for cand in candidats:
send_templated_email(cand, courriel_template)
- messages.add_message(request, messages.SUCCESS,
- "Le email a été envoyé aux candidats.")
+ messages.add_message(
+ request, messages.SUCCESS,
+ "Le email a été envoyé aux candidats."
+ )
return redirect("admin:recrutement_candidat_changelist")
else:
- form = CandidatCourrielForm(candidats=candidats, template=template,
- initial={'sujet': template.sujet,
- 'plain_text': template.plain_text,})
+ form = forms.CandidatCourrielForm(
+ candidats=candidats, template=template,
+ initial={
+ 'sujet': template.sujet,
+ 'plain_text': template.plain_text
+ }
+ )
+
+ return render_to_response("recrutement/envoyer_courriel_candidats.html", {
+ 'form': form
+ }, context_instance=RequestContext(request))
- c = {'form' : form}
- return render_to_response("recrutement/envoyer_courriel_candidats.html",
- Context(c), context_instance = RequestContext(request))
def affecter_evaluateurs_offre_emploi(request):
offre_emploi_ids = request.GET.get('ids').split(',')
- offres_emploi = OffreEmploi.objects.filter(id__in=offre_emploi_ids)
+ offres_emploi = emploi.OffreEmploi.objects.filter(id__in=offre_emploi_ids)
if request.method == "POST":
- form = EvaluateurForm(request.POST, offres_emploi=offres_emploi)
+ form = forms.EvaluateurForm(request.POST, offres_emploi=offres_emploi)
if form.is_valid():
form.save()
- messages.add_message(request, messages.SUCCESS,
- "Les évaluateurs ont été affectés aux offres d'emploi.")
+ messages.add_message(
+ request, messages.SUCCESS,
+ "Les évaluateurs ont été affectés aux offres d'emploi."
+ )
return redirect("admin:recrutement_proxyoffreemploi_changelist")
else:
- form = EvaluateurForm(offres_emploi=offres_emploi)
+ form = forms.EvaluateurForm(offres_emploi=offres_emploi)
+
+ return render_to_response("recrutement/affecter_evaluateurs.html", {
+ 'form': form
+ }, context_instance=RequestContext(request))
- c = {'form' : form}
- return render_to_response("recrutement/affecter_evaluateurs.html",
- Context(c), context_instance = RequestContext(request))
def send_templated_email(candidat, template):
from django.conf import settings
# Sujet
sujet_template = Template(template.sujet)
- dict_sujet = {"offre_emploi": candidat.offre_emploi.nom,}
+ dict_sujet = {"offre_emploi": candidat.offre_emploi.nom}
sujet = Context(dict_sujet)
# Plain text
texte_template = Template(template.plain_text)
- dict_texte = {"nom_candidat": candidat.nom,
- "prenom_candidat": candidat.prenom,
- "offre_emploi": candidat.offre_emploi.nom,
- "genre_candidat": "Monsieur" if candidat.genre == "M" \
- else "Madame",
- }
+ dict_texte = {
+ "nom_candidat": candidat.nom,
+ "prenom_candidat": candidat.prenom,
+ "offre_emploi": candidat.offre_emploi.nom,
+ "genre_candidat": "Monsieur" if candidat.genre == "M" else "Madame",
+ }
texte = Context(dict_texte)
if getattr(settings, 'MAILING_ACTIF', False):
- dst_emails = [candidat.email, ]
+ dst_emails = [candidat.email]
else:
- dst_emails = ['developpeurs@ca.auf.org', ]
- msg = EmailMultiAlternatives(sujet_template.render(sujet),
- texte_template.render(texte),
- 'recrutement@auf.org',
- dst_emails,
- )
+ dst_emails = ['developpeurs@ca.auf.org']
+ msg = EmailMultiAlternatives(
+ sujet_template.render(sujet), texte_template.render(texte),
+ 'recrutement@auf.org', dst_emails
+ )
msg.send()
def candidat_pdf(request):
candidat_id = request.GET.get('id')
- candidat = Candidat.objects.get(id=candidat_id)
+ candidat = models.Candidat.objects.get(id=candidat_id)
- return render_to_response("recrutement/candidat_pdf.html",
- Context({'candidat' : candidat}), context_instance = RequestContext(request))
+ return render_to_response("recrutement/candidat_pdf.html", {
+ 'candidat': candidat
+ }, context_instance=RequestContext(request))
from django.db.models import Q
from auf.django.references import models as ref
-import models as rh
+
+from project.rh import models as rh
+
class Pays(object):
fk_key = "code"
- def get_query(self,q,request):
- pays = ref.Pays.objects.filter(Q(nom__icontains=q) | Q(code__icontains=q))
+ def get_query(self, q, request):
+ pays = ref.Pays.objects.filter(
+ Q(nom__icontains=q) | Q(code__icontains=q)
+ )
return pays
def format_result(self, pays):
class Implantation(object):
- def get_query(self,q,request):
- f = Q(nom__icontains=q) | Q(nom_court__icontains=q) | Q(nom_long__icontains=q) | Q(region__nom__icontains=q)
- implantations = ref.Implantation.objects.filter(f)
+ def get_query(self, q, request):
+ implantations = ref.Implantation.objects.filter(
+ Q(nom__icontains=q) | Q(nom_court__icontains=q) |
+ Q(nom_long__icontains=q) | Q(region__nom__icontains=q)
+ )
return implantations
def format_result(self, implantation):
def get_objects(self, ids):
return ref.Implantation.objects.filter(id__in=ids)
+
class TypePoste(object):
- def get_query(self,q,request):
- f = Q(nom__icontains=q) | Q(nom_feminin__icontains=q) | Q(categorie_emploi__nom__icontains=q)
- typepostes = rh.TypePoste.objects.filter(f)
+ def get_query(self, q, request):
+ typepostes = rh.TypePoste.objects.filter(
+ Q(nom__icontains=q) | Q(nom_feminin__icontains=q) |
+ Q(categorie_emploi__nom__icontains=q)
+ )
return typepostes
def format_result(self, typeposte):
def get_objects(self, ids):
return rh.TypePoste.objects.filter(id__in=ids)
+
class Poste(object):
- def get_query(self,q,request):
- f = Q(nom__icontains=q) | Q(type_poste__nom__icontains=q) | Q(rh_dossiers__employe__nom__icontains=q) | Q(rh_dossiers__employe__prenom__icontains=q)
- postes = rh.Poste.objects.filter(f).distinct()
+ def get_query(self, q, request):
+ postes = rh.Poste.objects.filter(
+ Q(nom__icontains=q) | Q(type_poste__nom__icontains=q) |
+ Q(rh_dossiers__employe__nom__icontains=q) |
+ Q(rh_dossiers__employe__prenom__icontains=q)
+ ).distinct()
return postes
def format_result(self, poste):
def get_objects(self, ids):
return rh.Poste.objects.filter(id__in=ids)
+
class ValeurPoint(object):
- def get_query(self,q,request):
- f = Q(devise__code__icontains=q) | Q(implantation__nom__icontains=q)
- points = rh.ValeurPoint.objects.select_related('devise', 'implantation').filter(f)
+ def get_query(self, q, request):
+ points = rh.ValeurPoint.objects \
+ .select_related('devise', 'implantation') \
+ .filter(
+ Q(devise__code__icontains=q) |
+ Q(implantation__nom__icontains=q)
+ )
return points
def format_result(self, point):
def get_objects(self, ids):
return rh.ValeurPoint.objects.filter(id__in=ids)
+
class Employe(object):
- def get_query(self,q,request):
- f = Q(nom__icontains=q) | Q(prenom__icontains=q) | Q(nom_affichage__icontains=q)
- employes = rh.Employe.objects.filter(f)
+ def get_query(self, q, request):
+ employes = rh.Employe.objects.filter(
+ Q(nom__icontains=q) | Q(prenom__icontains=q) |
+ Q(nom_affichage__icontains=q)
+ )
return employes
def format_result(self, employe):
def get_objects(self, ids):
return rh.Employe.objects.filter(id__in=ids)
+
class Dossier(object):
- def get_query(self,q,request):
- f = Q(poste__nom=q) | Q(poste__type_poste__nom=q) | Q(employe__nom__icontains=q) | Q(employe__prenom__icontains=q) | Q(employe__nom_affichage__icontains=q)
- dossiers = rh.Dossier.objects.filter(f)
+ def get_query(self, q, request):
+ dossiers = rh.Dossier.objects.filter(
+ Q(poste__nom=q) | Q(poste__type_poste__nom=q) |
+ Q(employe__nom__icontains=q) | Q(employe__prenom__icontains=q) |
+ Q(employe__nom_affichage__icontains=q)
+ )
return dossiers
def format_result(self, dossier):
from django.db.models import Q
from django.core.urlresolvers import reverse
-from rh import models as rh
+from project.rh import models as rh
def bind_poste_to_graph(graph, postes_by_id):
# -*- encoding: utf-8 -*-
-import time
-import datetime
import csv
-import StringIO
+import datetime
import itertools
-
-from django.db.models import Q
-from django.db.models import Count
+import StringIO
+import time
from datamaster_modeles import models as ref
-import rh.ods as ods
-import rh.models as rh
+from django.db.models import Q, Count
+
+from project.rh import ods
+from project.rh import models as rh
KEY_DATE_DEBUT = "debut"
from validators import validate_date_passee
-# Gruick hack pour déterminer d'ou provient l'instanciation d'une classe
-# pour l'héritage. Cela permet de faire du dynamic loading par app sans
-# avoir à redéfinir dans DAE la FK
-def app_context():
- import inspect
- models_stack = [s[1].split('/')[-2]
- for s in inspect.stack()
- if s[1].endswith('models.py')]
- return models_stack[-1]
-
-
# Constantes
HELP_TEXT_DATE = "format: jj-mm-aaaa"
REGIME_TRAVAIL_DEFAULT = Decimal('100.00')
Pour un Poste, structure d'informations décrivant comment on prévoit
financer ce Poste.
"""
- poste = models.ForeignKey(
- '%s.Poste' % app_context(), db_column='poste',
- related_name='%(app_label)s_financements'
- )
type = models.CharField(max_length=1, choices=POSTE_FINANCEMENT_CHOICES)
pourcentage = models.DecimalField(
max_digits=12, decimal_places=2,
class PosteFinancement(PosteFinancement_):
- pass
+ poste = models.ForeignKey(
+ Poste, db_column='poste', related_name='rh_financements'
+ )
class PostePiece_(models.Model):
Documents relatifs au Poste.
Ex.: Description de poste
"""
- poste = models.ForeignKey(
- '%s.Poste' % app_context(), db_column='poste',
- related_name='%(app_label)s_pieces'
- )
nom = models.CharField(u"Nom", max_length=255)
fichier = models.FileField(
u"Fichier", upload_to=poste_piece_dispatch, storage=storage_prive
class PostePiece(PostePiece_):
- pass
+ poste = models.ForeignKey(
+ Poste, db_column='poste', related_name='rh_pieces'
+ )
class PosteComparaison_(AUFMetadata, DevisableMixin):
De la même manière qu'un dossier, un poste peut-être comparé à un autre
poste.
"""
- poste = models.ForeignKey(
- '%s.Poste' % app_context(),
- related_name='%(app_label)s_comparaisons_internes'
- )
objects = PosteComparaisonManager()
implantation = models.ForeignKey(
class PosteComparaison(PosteComparaison_):
+ poste = models.ForeignKey(
+ Poste, related_name='rh_comparaisons_internes'
+ )
+
objects = NoDeleteManager()
-class PosteCommentaire_(Commentaire):
+class PosteCommentaire(Commentaire):
poste = models.ForeignKey(
- '%s.Poste' % app_context(), db_column='poste', related_name='+'
+ Poste, db_column='poste', related_name='commentaires'
)
- class Meta:
- abstract = True
-
-
-class PosteCommentaire(PosteCommentaire_):
- pass
### EMPLOYÉ/PERSONNE
class Dossier(Dossier_):
__doc__ = Dossier_.__doc__
- poste = models.ForeignKey('%s.Poste' % app_context(),
- db_column='poste',
- related_name='%(app_label)s_dossiers',
+ poste = models.ForeignKey(
+ Poste, db_column='poste', related_name='rh_dossiers',
help_text=u"Taper le nom du poste ou du type de poste",
- )
+ )
employe = models.ForeignKey(
'Employe', db_column='employe',
help_text=u"Taper le nom de l'employé",
- related_name='%(app_label)s_dossiers', verbose_name=u"employé")
+ related_name='rh_dossiers', verbose_name=u"employé"
+ )
principal = models.BooleanField(
u"Principal?", default=True,
help_text=(
Documents relatifs au Dossier (à l'occupation de ce poste par employé).
Ex.: Lettre de motivation.
"""
- dossier = models.ForeignKey(
- '%s.Dossier' % app_context(),
- db_column='dossier', related_name='%(app_label)s_dossierpieces'
- )
nom = models.CharField(max_length=255)
fichier = models.FileField(
upload_to=dossier_piece_dispatch, storage=storage_prive
class DossierPiece(DossierPiece_):
- pass
-
-
-class DossierCommentaire_(Commentaire):
dossier = models.ForeignKey(
- '%s.Dossier' % app_context(), db_column='dossier', related_name='+'
+ Dossier, db_column='dossier', related_name='rh_dossierpieces'
)
- class Meta:
- abstract = True
-class DossierCommentaire(DossierCommentaire_):
- pass
+class DossierCommentaire(Commentaire):
+ dossier = models.ForeignKey(
+ Dossier, db_column='dossier', related_name='commentaires'
+ )
class DossierComparaison_(models.Model, DevisableMixin):
"""
Photo d'une comparaison salariale au moment de l'embauche.
"""
- dossier = models.ForeignKey(
- '%s.Dossier' % app_context(), related_name='%(app_label)s_comparaisons'
- )
objects = DossierComparaisonManager()
implantation = models.ForeignKey(
class DossierComparaison(DossierComparaison_):
- pass
+ dossier = models.ForeignKey(
+ Dossier, related_name='rh_comparaisons'
+ )
### RÉMUNÉRATION
class RemunerationMixin(AUFMetadata):
- dossier = models.ForeignKey(
- '%s.Dossier' % app_context(), db_column='dossier',
- related_name='%(app_label)s_remunerations'
- )
# Identification
type = models.ForeignKey(
class Remuneration(Remuneration_):
- pass
+ dossier = models.ForeignKey(
+ Dossier, db_column='dossier', related_name='rh_remunerations'
+ )
### CONTRATS
relation de travail) plusieurs contrats peuvent être associés.
"""
objects = ContratManager()
- dossier = models.ForeignKey(
- '%s.Dossier' % app_context(), db_column='dossier',
- related_name='%(app_label)s_contrats'
- )
type_contrat = models.ForeignKey(
'TypeContrat', db_column='type_contrat',
verbose_name=u'type de contrat', related_name='+'
class Contrat(Contrat_):
- pass
-
-### ÉVÉNEMENTS
-
-#class Evenement_(AUFMetadata):
-# """
-# Un Evenement sert à déclarer une situation temporaire (exceptionnelle)
-# d'un Dossier qui vient altérer des informations normales liées à un
-# Dossier (ex.: la Remuneration).
-#
-# Ex.: congé de maternité, maladie...
-#
-# Lors de ces situations exceptionnelles, l'Employe a un régime de travail
-# différent et une rémunération en conséquence. On souhaite toutefois
-# conserver le Dossier intact afin d'éviter une re-saisie des données lors
-# du retour à la normale.
-# """
-# dossier = models.ForeignKey(
-# '%s.Dossier' % app_context(), db_column='dossier',
-# related_name='+'
-# )
-# nom = models.CharField(max_length=255)
-# date_debut = models.DateField(verbose_name = u"Date de début")
-# date_fin = models.DateField(verbose_name = u"Date de fin",
-# null=True, blank=True)
-#
-# class Meta:
-# abstract = True
-# ordering = ['nom']
-# verbose_name = u"Évènement"
-# verbose_name_plural = u"Évènements"
-#
-# def __unicode__(self):
-# return u'%s' % (self.nom)
-#
-#
-#class Evenement(Evenement_):
-# __doc__ = Evenement_.__doc__
-#
-#
-#class EvenementRemuneration_(RemunerationMixin):
-# """
-# Structure de rémunération liée à un Evenement qui remplace
-# temporairement la Remuneration normale d'un Dossier, pour toute la durée
-# de l'Evenement.
-# """
-# evenement = models.ForeignKey("Evenement", db_column='evenement',
-# related_name='+',
-# verbose_name = u"Évènement")
-# # TODO : le champ dossier hérité de Remuneration doit être dérivé
-# # de l'Evenement associé
-#
-# class Meta:
-# abstract = True
-# ordering = ['evenement', 'type__nom', '-date_fin']
-# verbose_name = u"Évènement - rémunération"
-# verbose_name_plural = u"Évènements - rémunérations"
-#
-#
-#class EvenementRemuneration(EvenementRemuneration_):
-# __doc__ = EvenementRemuneration_.__doc__
-#
-# class Meta:
-# abstract = True
-#
-#
-#class EvenementRemuneration(EvenementRemuneration_):
-# __doc__ = EvenementRemuneration_.__doc__
-# TODO? class ContratPiece(models.Model):
+ dossier = models.ForeignKey(
+ Dossier, db_column='dossier', related_name='rh_contrats'
+ )
### RÉFÉRENCES RH
import pygraphviz as pgv
from datamaster_modeles import models as ref
+from django import forms
+from django.conf import settings
+from django.contrib.auth.decorators import login_required
+from django.core.servers.basehttp import FileWrapper
from django.core.urlresolvers import reverse
from django.db.models import Q
-from django.utils.encoding import smart_str
+from django.http import HttpResponse
from django.shortcuts import render_to_response, get_object_or_404
from django.template import RequestContext
-from django.http import HttpResponse
-from django import forms
-from django.contrib.auth.decorators import login_required
-from django.core.servers.basehttp import FileWrapper
+from django.utils.encoding import smart_str
-from rh import models as rh
-from rh.lib import calc_remun
-from rh.decorators import drh_or_admin_required
-from rh.templatetags.rapports import SortHeaders
-from rh.change_list import RechercheTemporelle
-from rh import graph as rh_graph
-from rh.masse_salariale import MasseSalariale
-
-# pas de reference a DAE devrait etre refactorisé
-from dae.utils import get_employe_from_user
-from dae.decorators import redirect_interdiction
-from dae.workflow import grp_drh, grp_correspondants_rh
-from django.conf import settings
+from project.dae.utils import get_employe_from_user
+from project.dae.decorators import redirect_interdiction
+from project.dae.workflow import grp_drh, grp_correspondants_rh
+from project.rh import models as rh
+from project.rh.lib import calc_remun
+from project.rh.decorators import drh_or_admin_required
+from project.rh.templatetags.rapports import SortHeaders
+from project.rh.change_list import RechercheTemporelle
+from project.rh import graph as rh_graph
+from project.rh.masse_salariale import MasseSalariale
@login_required