[#2658] Retrait du hack app_label() dans rh.models
authorEric Mc Sween <eric.mcsween@auf.org>
Wed, 30 May 2012 18:33:55 +0000 (14:33 -0400)
committerEric Mc Sween <eric.mcsween@auf.org>
Wed, 30 May 2012 18:33:55 +0000 (14:33 -0400)
buildout.cfg
project/dae/models.py
project/dae/workflow.py
project/recrutement/admin.py
project/recrutement/models.py
project/recrutement/views.py
project/rh/catalogues.py
project/rh/graph.py
project/rh/masse_salariale.py
project/rh/models.py
project/rh/views.py

index 3079d83..d09937e 100644 (file)
@@ -15,10 +15,8 @@ find-links = http://pypi.auf.org/simple/auf.recipe.django/
     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
index 27233c9..0f6c5df 100644 (file)
@@ -19,8 +19,8 @@ from project.dae.workflow import \
 # 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)
@@ -382,14 +382,21 @@ POSTE_FINANCEMENT_CHOICES = (
 
 
 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
@@ -457,11 +464,11 @@ COMPTE_COMPTA_CHOICES = (
 
 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",
@@ -746,16 +753,22 @@ if not reversion.is_registered(Dossier):
 
 
 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
@@ -769,10 +782,14 @@ class DossierComparaison(rh.DossierComparaison_):
 ### 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'
+    )
index ed166a6..b3015fd 100644 (file)
@@ -9,6 +9,18 @@ from project.rh.groups import \
         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'
index 55a3985..256402e 100644 (file)
@@ -1,6 +1,9 @@
 # -*- 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
@@ -8,16 +11,13 @@ from django.forms.models import BaseInlineFormSet
 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, \
@@ -25,6 +25,7 @@ from project.recrutement.workflow import \
         grp_administrateurs_recrutement, \
         grp_correspondants_rh_recrutement, \
         grp_haute_direction_recrutement
+from project.rh import models as rh
 
 
 ### CONSTANTES
index 25020ad..e018805 100644 (file)
@@ -60,16 +60,6 @@ class Candidat(emploi.Candidat):
         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',)
index 217180f..2b3f880 100644 (file)
@@ -1,5 +1,6 @@
 # -*- 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
@@ -8,13 +9,13 @@ from django.shortcuts import render_to_response, redirect
 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):
     """
@@ -33,104 +34,123 @@ 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))
index 9bdb674..3780e90 100644 (file)
@@ -2,13 +2,17 @@
 
 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):
@@ -23,9 +27,11 @@ class Pays(object):
 
 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):
@@ -47,11 +53,14 @@ class Implantation(object):
     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):
@@ -63,11 +72,15 @@ class TypePoste(object):
     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):
@@ -79,11 +92,16 @@ class Poste(object):
     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):
@@ -95,11 +113,14 @@ class ValeurPoint(object):
     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):
@@ -111,11 +132,15 @@ class Employe(object):
     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):
index 263b4e6..ec90132 100644 (file)
@@ -6,7 +6,7 @@ import pygraphviz as pgv
 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):
index 200fcb4..4db8cb0 100644 (file)
@@ -1,16 +1,15 @@
 # -*- 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"
index e2db9d3..a1a2191 100644 (file)
@@ -24,17 +24,6 @@ from managers import \
 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')
@@ -362,10 +351,6 @@ class PosteFinancement_(models.Model):
     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,
@@ -387,7 +372,9 @@ class PosteFinancement_(models.Model):
 
 
 class PosteFinancement(PosteFinancement_):
-    pass
+    poste = models.ForeignKey(
+        Poste, db_column='poste', related_name='rh_financements'
+    )
 
 
 class PostePiece_(models.Model):
@@ -395,10 +382,6 @@ 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
@@ -413,7 +396,9 @@ class PostePiece_(models.Model):
 
 
 class PostePiece(PostePiece_):
-    pass
+    poste = models.ForeignKey(
+        Poste, db_column='poste', related_name='rh_pieces'
+    )
 
 
 class PosteComparaison_(AUFMetadata, DevisableMixin):
@@ -421,10 +406,6 @@ 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(
@@ -444,20 +425,18 @@ class PosteComparaison_(AUFMetadata, DevisableMixin):
 
 
 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
@@ -967,15 +946,15 @@ class Dossier_(AUFMetadata, DevisableMixin):
 
 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=(
@@ -989,10 +968,6 @@ class DossierPiece_(models.Model):
     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
@@ -1007,29 +982,22 @@ class DossierPiece_(models.Model):
 
 
 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(
@@ -1050,16 +1018,14 @@ class DossierComparaison_(models.Model, DevisableMixin):
 
 
 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(
@@ -1122,7 +1088,9 @@ class Remuneration_(RemunerationMixin, DevisableMixin):
 
 
 class Remuneration(Remuneration_):
-    pass
+    dossier = models.ForeignKey(
+        Dossier, db_column='dossier', related_name='rh_remunerations'
+    )
 
 
 ### CONTRATS
@@ -1140,10 +1108,6 @@ class Contrat_(AUFMetadata):
     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='+'
@@ -1166,75 +1130,9 @@ class Contrat_(AUFMetadata):
 
 
 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
index 0f0cf1a..e400e8e 100644 (file)
@@ -7,29 +7,27 @@ import StringIO
 
 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