cleanup
authorOlivier Larchevêque <olivier.larcheveque@auf.org>
Fri, 2 Mar 2012 19:18:00 +0000 (14:18 -0500)
committerOlivier Larchevêque <olivier.larcheveque@auf.org>
Fri, 2 Mar 2012 19:18:00 +0000 (14:18 -0500)
buildout.cfg
project/rh/admin.py
project/rh/models.py
project/rh/views.py

index 1d336eb..5b0c4ce 100644 (file)
@@ -43,6 +43,7 @@ eggs =
     django-qbe
     django-urldecorators
     networkx
+    pygraphviz
 
 [versions]
 django-admin-tools = 0.4.1
@@ -61,6 +62,7 @@ django-alphafilter = 0.5.3auf4
 django-sendfile = 0.2.1
 django-alphafilter = 0.5.3auf4
 django-urldecorators = 0.3
+pygraphviz = 1.0
 
 [django]
 recipe = auf.recipe.django
index 45296c4..b272ab0 100644 (file)
@@ -1,39 +1,49 @@
 # -*- encoding: utf-8 -*-
 
-from collections import defaultdict
 import datetime
 
-from django.db import models
-from django import forms
 from django.core.urlresolvers import reverse
 from django.contrib import admin
 from django.conf import settings
 from django.db.models import Q
 from django.template.defaultfilters import date
 from ajax_select import make_ajax_form
-from auf.django.metadata.admin import AUFMetadataAdminMixin, AUFMetadataInlineAdminMixin, AUF_METADATA_READONLY_FIELDS
+from auf.django.metadata.admin import AUFMetadataAdminMixin, \
+                                      AUFMetadataInlineAdminMixin, \
+                                      AUF_METADATA_READONLY_FIELDS
 from forms import ContratForm, AyantDroitForm, EmployeAdminForm, AjaxSelect
 from dae.utils import get_employe_from_user
 from change_list import ChangeList
 from groups import grp_drh
 import models as rh
-import filters
+
+
+class EmployeProxy(rh.Employe):
+
+    class Meta:
+        proxy = True
+        verbose_name = u"Organigramme des employés"
+        verbose_name_plural = u"Organigramme des employés"
+
 
 class DateRangeMixin(object):
     prefixe_recherche_temporelle = ""
+
     def get_changelist(self, request, **kwargs):
-        if request.META.has_key('HTTP_REFERER'):
+        if 'HTTP_REFERER' in request.META.keys():
                     referer = request.META['HTTP_REFERER']
                     referer = "/".join(referer.split('/')[3:])
                     referer = "/%s" % referer.split('?')[0]
-                    change_list_view = 'admin:%s_%s_changelist' % (self.model._meta.app_label, self.model.__name__.lower())
+                    change_list_view = 'admin:%s_%s_changelist' % (
+                            self.model._meta.app_label,
+                            self.model.__name__.lower(),)
                     if referer != reverse(change_list_view):
                         params = request.GET.copy()
-                        today = datetime.date.today()
-                        params.update({'statut' : 'Actif'})
+                        params.update({'statut': 'Actif'})
                         request.GET = params
         return ChangeList
 
+
 # Override of the InlineModelAdmin to support the link in the tabular inline
 class LinkedInline(admin.options.InlineModelAdmin):
     template = "admin/linked.html"
@@ -61,7 +71,8 @@ class ProtectRegionMixin(object):
 
         if grp_correspondants_rh in user_groups:
             employe = get_employe_from_user(request.user)
-            q = Q(**{self.model.prefix_implantation: employe.implantation.region})
+            q = Q(**{self.model.prefix_implantation: \
+                    employe.implantation.region})
             qs = qs.filter(q).distinct()
             return qs
         return qs.none()
@@ -85,8 +96,10 @@ class ProtectRegionMixin(object):
 # Inlines
 
 class ReadOnlyInlineMixin(object):
+
     def get_readonly_fields(self, request, obj=None):
-        return [f.name for f in self.model._meta.fields if f.name not in AUF_METADATA_READONLY_FIELDS]
+        return [f.name for f in self.model._meta.fields \
+                if f.name not in AUF_METADATA_READONLY_FIELDS]
 
 
 class AyantDroitInline(AUFMetadataInlineAdminMixin, admin.StackedInline):
@@ -96,12 +109,18 @@ class AyantDroitInline(AUFMetadataInlineAdminMixin, admin.StackedInline):
 
     fieldsets = (
         (None, {
-            'fields': (('nom', 'prenom'), ('nom_affichage', 'genre'), 'nationalite', 'date_naissance', 'lien_parente', )
-        }),
+            'fields': (
+                ('nom', 'prenom'),
+                ('nom_affichage', 'genre'),
+                'nationalite',
+                'date_naissance',
+                'lien_parente',
+                )}),
     )
 
 
-class AyantDroitCommentaireInline(AUFMetadataInlineAdminMixin, admin.TabularInline):
+class AyantDroitCommentaireInline(AUFMetadataInlineAdminMixin, \
+        admin.TabularInline):
     readonly_fields = ('owner', )
     model = rh.AyantDroitCommentaire
     extra = 1
@@ -130,7 +149,8 @@ class DossierROInline(ReadOnlyInlineMixin, LinkedInline):
         return False
 
 
-class DossierCommentaireInline(AUFMetadataInlineAdminMixin, admin.TabularInline):
+class DossierCommentaireInline(AUFMetadataInlineAdminMixin, \
+        admin.TabularInline):
     readonly_fields = ('owner', )
     model = rh.DossierCommentaire
     extra = 1
@@ -144,7 +164,9 @@ class DossierPieceInline(admin.TabularInline):
 class EmployeInline(admin.TabularInline):
     model = rh.Employe
 
-class EmployeCommentaireInline(AUFMetadataInlineAdminMixin, admin.TabularInline):
+
+class EmployeCommentaireInline(AUFMetadataInlineAdminMixin, \
+        admin.TabularInline):
     readonly_fields = ('owner', )
     model = rh.EmployeCommentaire
     extra = 1
@@ -190,8 +212,7 @@ class ClassementAdmin(AUFMetadataAdminMixin, admin.ModelAdmin):
     list_display = ('_classement', '_date_modification', 'user_modification', )
     fieldsets = AUFMetadataAdminMixin.fieldsets + (
         (None, {
-            'fields': ('type', 'echelon', 'degre', 'coefficient',  )
-        }),
+            'fields': ('type', 'echelon', 'degre', 'coefficient',)}),
     )
 
     def _classement(self, obj):
@@ -199,16 +220,24 @@ class ClassementAdmin(AUFMetadataAdminMixin, admin.ModelAdmin):
     _classement.short_description = u"Classement"
 
     def _date_modification(self, obj):
-        return date(obj.date_modification) if obj.date_modification is not None else "(aucune)"
+        return date(obj.date_modification) \
+                if obj.date_modification is not None else "(aucune)"
     _date_modification.short_description = u'date modification'
     _date_modification.admin_order_field = 'date_modification'
 
+
 class CommentaireAdmin(admin.ModelAdmin):
     pass
 
 
 class DeviseAdmin(AUFMetadataAdminMixin, admin.ModelAdmin):
-    list_display = ('code', 'nom', '_archive', '_date_modification', 'user_modification',)
+    list_display = (
+            'code',
+            'nom',
+            '_archive',
+            '_date_modification',
+            'user_modification',
+            )
     list_filter = ('archive', )
     fieldsets = AUFMetadataAdminMixin.fieldsets + (
         (None, {
@@ -227,13 +256,20 @@ class DeviseAdmin(AUFMetadataAdminMixin, admin.ModelAdmin):
     _archive.short_description = u'Archivé'
 
     def _date_modification(self, obj):
-        return date(obj.date_modification) if obj.date_modification is not None else "(aucune)"
+        return date(obj.date_modification) \
+                if obj.date_modification is not None else "(aucune)"
     _date_modification.short_description = u'date modification'
     _date_modification.admin_order_field = 'date_modification'
 
-class DossierAdmin(DateRangeMixin, AUFMetadataAdminMixin, ProtectRegionMixin, admin.ModelAdmin, AjaxSelect,):
+
+class DossierAdmin(DateRangeMixin, AUFMetadataAdminMixin, \
+        ProtectRegionMixin, admin.ModelAdmin, AjaxSelect,):
     alphabet_filter = 'employe__nom'
-    search_fields = ('employe__nom', 'employe__prenom', 'poste__nom', 'poste__nom_feminin')
+    search_fields = (
+            'employe__nom',
+            'employe__prenom',
+            'poste__nom',
+            'poste__nom_feminin')
     list_display = (
         '_id',
         '_apercu',
@@ -259,22 +295,28 @@ class DossierAdmin(DateRangeMixin, AUFMetadataAdminMixin, ProtectRegionMixin, ad
               )
     fieldsets = AUFMetadataAdminMixin.fieldsets + (
         (None, {
-            'fields': ('employe', 'poste', 'statut', 'organisme_bstg',)
-        }),
+            'fields': (
+                'employe',
+                'poste',
+                'statut',
+                'organisme_bstg',)}),
         ('Recrutement', {
-            'fields': ('statut_residence', 'remplacement', 'remplacement_de', )
-        }),
+            'fields': (
+                'statut_residence',
+                'remplacement',
+                'remplacement_de', )}),
         ('Rémunération', {
-            'fields': ('classement', ('regime_travail', 'regime_travail_nb_heure_semaine'),)
-        }),
+            'fields': (
+                'classement',
+                ('regime_travail', 'regime_travail_nb_heure_semaine'),)}),
         ('Occupation du Poste par cet Employe', {
-            'fields': (('date_debut', 'date_fin'), )
-        }),
+            'fields': (('date_debut', 'date_fin'), )}
+            ),
     )
-    form =  make_ajax_form(rh.Dossier, {
-        'employe' : 'employes',
-        'poste' : 'postes',
-        'remplacement_de' : 'dossiers',
+    form = make_ajax_form(rh.Dossier, {
+        'employe': 'employes',
+        'poste': 'postes',
+        'remplacement_de': 'dossiers',
     })
 
     def lookup_allowed(self, key, value):
@@ -294,21 +336,25 @@ class DossierAdmin(DateRangeMixin, AUFMetadataAdminMixin, ProtectRegionMixin, ad
     _id.admin_order_field = "id"
 
     def _nom(self, obj):
-        return "%d : %s&nbsp;%s" % \
-                (obj.date_debut.year, obj.employe.nom.upper(), obj.employe.prenom)
+        return "%d : %s&nbsp;%s" % (
+                        obj.date_debut.year,
+                        obj.employe.nom.upper(),
+                        obj.employe.prenom)
     _nom.allow_tags = True
     _nom.short_description = u"Dossier"
 
-
     def _apercu(self, d):
-        apercu_link = u"""<a title="Aperçu du dossier" onclick="return showAddAnotherPopup(this);" href='%s'><img src="%simg/loupe.png" /></a>""" % \
+        apercu_link = u"""<a title="Aperçu du dossier"
+                             onclick="return showAddAnotherPopup(this);"
+                             href='%s'>
+                             <img src="%simg/loupe.png" />
+                             </a>""" % \
                 (reverse('dossier_apercu', args=(d.id,)),
                  settings.STATIC_URL,
                  )
         return apercu_link
     _apercu.allow_tags = True
     _apercu.short_description = u""
-    
 
     def _date_debut(self, obj):
         return date(obj.date_debut)
@@ -321,14 +367,18 @@ class DossierAdmin(DateRangeMixin, AUFMetadataAdminMixin, ProtectRegionMixin, ad
     _date_fin.short_description = u'Occupation fin'
     _date_fin.admin_order_field = 'date_fin'
 
-
     def _date_modification(self, obj):
-        return date(obj.date_modification) if obj.date_modification is not None else "(aucune)"
+        return date(obj.date_modification) \
+                if obj.date_modification is not None else "(aucune)"
     _date_modification.short_description = u'date modification'
     _date_modification.admin_order_field = 'date_modification'
 
     def _poste(self, dossier):
-        link = u"""<a title="Aperçu du poste" onclick="return showAddAnotherPopup(this);" href='%s'><img src="%simg/loupe.png" /></a> <a href="%s" title="Modifier le poste">%s</a>""" % \
+        link = u"""<a title="Aperçu du poste"
+                      onclick="return showAddAnotherPopup(this);"
+                      href='%s'><img src="%simg/loupe.png" />
+                    </a>
+                    <a href="%s" title="Modifier le poste">%s</a>""" % \
                 (reverse('poste_apercu', args=(dossier.poste.id,)),
                  settings.STATIC_URL,
                  reverse('admin:rh_poste_change', args=(dossier.poste.id,)),
@@ -345,13 +395,17 @@ class DossierAdmin(DateRangeMixin, AUFMetadataAdminMixin, ProtectRegionMixin, ad
         edit_link = reverse('admin:rh_employe_change', args=(employe.id,))
 
         style = ""
-        view = u"""<a href="%s" title="Aperçu l'employé" onclick="return showAddAnotherPopup(this);"><img src="%simg/loupe.png" /></a>""" % (view_link, settings.STATIC_URL,)
+        view = u"""<a href="%s"
+                      title="Aperçu l'employé"
+                      onclick="return showAddAnotherPopup(this);">
+                      <img src="%simg/loupe.png" />
+                    </a>""" % (view_link, settings.STATIC_URL,)
         return u"""%s<a href='%s' style="%s;">%s</a>""" % \
         (view, edit_link, style, employe)
     _employe.allow_tags = True
     _employe.short_description = u"Employé"
     _employe.admin_order_field = "employe__nom"
-   
+
     def save_formset(self, request, form, formset, change):
         instances = formset.save(commit=False)
         for instance in instances:
@@ -369,35 +423,61 @@ class DossierCommentaireAdmin(admin.ModelAdmin):
     pass
 
 
-class EmployeAdmin(DateRangeMixin, AUFMetadataAdminMixin, ProtectRegionMixin, admin.ModelAdmin,):
+class EmployeAdmin(DateRangeMixin, AUFMetadataAdminMixin, \
+        ProtectRegionMixin, admin.ModelAdmin,):
     prefixe_recherche_temporelle = "rh_dossiers__"
     alphabet_filter = 'nom'
     DEFAULT_ALPHABET = u'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
     search_fields = ('id', 'nom', 'prenom', 'nom_affichage', )
     ordering = ('nom', )
     form = EmployeAdminForm
-    list_display = ('_id', '_apercu', '_nom', '_dossiers_postes', '_date_modification',  'user_modification', )
+    list_display = (
+            '_id',
+            '_apercu',
+            '_nom',
+            '_dossiers_postes',
+            '_date_modification',
+            'user_modification',
+            )
     list_display_links = ('_nom',)
-    list_filter = ('rh_dossiers__poste__implantation__region',  'rh_dossiers__poste__implantation', 'nb_postes', )
+    list_filter = (
+            'rh_dossiers__poste__implantation__region',
+            'rh_dossiers__poste__implantation',
+            'nb_postes',
+            )
     inlines = (AyantDroitInline,
                DossierROInline,
                EmployePieceInline,
                EmployeCommentaireInline)
     fieldsets = AUFMetadataAdminMixin.fieldsets + (
         ('Identification', {
-            'fields': (('nom', 'prenom'), ('nom_affichage', 'genre'), 'nationalite', 'date_naissance', )
-        }),
+            'fields': (
+                ('nom', 'prenom'),
+                ('nom_affichage', 'genre'),
+                'nationalite',
+                'date_naissance',
+                )}
+            ),
         ('Informations personnelles', {
-            'fields': ('situation_famille', 'date_entree', )
-        }),
+            'fields': ('situation_famille', 'date_entree', )}
+            ),
         ('Coordonnées', {
-            'fields': (('tel_domicile', 'tel_cellulaire'), ('adresse', 'ville'), ('code_postal', 'province'), 'pays', )
-        }),
+            'fields': (
+                ('tel_domicile', 'tel_cellulaire'),
+                ('adresse', 'ville'),
+                ('code_postal', 'province'),
+                'pays',
+                )}
+            ),
         )
 
     def _apercu(self, obj):
-        return u"""<a title="Aperçu de l'employé" onclick="return showAddAnotherPopup(this);" href='%s'><img src="%simg/loupe.png" /></a>""" % \
-                (reverse('employe_apercu', args=(obj.id,)), settings.STATIC_URL)
+        return u"""<a title="Aperçu de l'employé"
+                      onclick="return showAddAnotherPopup(this);"
+                      href='%s'>
+                      <img src="%simg/loupe.png" />
+                    </a>""" % \
+            (reverse('employe_apercu', args=(obj.id,)), settings.STATIC_URL)
     _apercu.allow_tags = True
     _apercu.short_description = u""
 
@@ -415,24 +495,37 @@ class EmployeAdmin(DateRangeMixin, AUFMetadataAdminMixin, ProtectRegionMixin, ad
     _id.admin_order_field = "id"
 
     def _date_modification(self, obj):
-        return date(obj.date_modification) if obj.date_modification is not None else "(aucune)"
+        return date(obj.date_modification) \
+                if obj.date_modification is not None else "(aucune)"
     _date_modification.short_description = u'date modification'
     _date_modification.admin_order_field = 'date_modification'
 
     def _dossiers_postes(self, obj):
         l = []
         for d in obj.rh_dossiers.all().order_by('-date_debut'):
-            dossier = u"""<a title="Aperçu du dossier" href="%s" onclick="return showAddAnotherPopup(this);" title="Aperçu du dossier"><img src="%simg/loupe.png" /></a><a href="%s">Dossier</a>&nbsp;""" % \
-                                (  reverse('dossier_apercu', args=(d.id,)),
-                                settings.STATIC_URL,
-                                reverse('admin:rh_dossier_change', args=(d.id,))
-                                )
-
-            poste = u"""<a title="Aperçu du poste" href="%s" onclick="return showAddAnotherPopup(this);" title="Aperçu du poste"><img src="%simg/loupe.png" /></a><a href="%s">Poste</a>&nbsp;""" % \
-                                 (  reverse('poste_apercu', args=(d.poste.id,)),
-                                    settings.STATIC_URL,
-                                    reverse('admin:rh_poste_change', args=(d.poste.id,))
-                                 )
+            dossier = u"""<a title="Aperçu du dossier"
+                             href="%s"
+                             onclick="return showAddAnotherPopup(this);"
+                             title="Aperçu du dossier">
+                             <img src="%simg/loupe.png" />
+                          </a>
+                          <a href="%s">Dossier</a>
+                          &nbsp;""" % \
+                (reverse('dossier_apercu', args=(d.id,)),
+                 settings.STATIC_URL,
+                 reverse('admin:rh_dossier_change', args=(d.id,)))
+
+            poste = u"""<a title="Aperçu du poste"
+                           href="%s"
+                           onclick="return showAddAnotherPopup(this);"
+                           title="Aperçu du poste">
+                           <img src="%simg/loupe.png" />
+                        </a>
+                        <a href="%s">Poste</a>
+                        &nbsp;""" % \
+                (reverse('poste_apercu', args=(d.poste.id,)),
+                 settings.STATIC_URL,
+                 reverse('admin:rh_poste_change', args=(d.poste.id,)))
             link = u"""<li>%s %s - %s : [%s] %s</li>""" % \
                 (dossier, poste,
                  d.date_debut.year,
@@ -454,7 +547,7 @@ class EmployeAdmin(DateRangeMixin, AUFMetadataAdminMixin, ProtectRegionMixin, ad
     _dossiers_postes.short_description = u"Dossiers et postes"
 
     def queryset(self, request):
-        qs = super(EmployeAdmin, self).queryset(request) 
+        qs = super(EmployeAdmin, self).queryset(request)
         return qs.select_related(depth=1).order_by('nom')
 
     def save_formset(self, request, form, formset, change):
@@ -465,19 +558,30 @@ class EmployeAdmin(DateRangeMixin, AUFMetadataAdminMixin, ProtectRegionMixin, ad
                 instance.date_creation = datetime.datetime.now()
             instance.save()
 
+
 class EmployeProxyAdmin(EmployeAdmin):
-    list_display = ('_id', '_apercu', '_nom', '_organigramme') 
+    list_display = ('_id', '_apercu', '_nom', '_organigramme')
     list_display_links = ('_nom',)
 
+    def has_add_permission(self, obj):
+        return False
+
     def _organigramme(self, obj):
         l = []
         for d in obj.rh_dossiers.all().order_by('-date_debut'):
-            poste = u"""<a title="Aperçu du poste" href="%s" onclick="return showAddAnotherPopup(this);" title="Aperçu du poste"><img src="%simg/loupe.png" /></a><a href="%s">Poste</a>&nbsp;""" % \
-                                 (  reverse('poste_apercu', args=(d.poste.id,)),
-                                    settings.STATIC_URL,
-                                    reverse('admin:rh_poste_change', args=(d.poste.id,))
-                                 )
-            organigramme = u"""<a href="%s">Organigramme</a>""" % (reverse('rho_employe', args=(d.poste.id,)))
+            poste = u"""<a title="Aperçu du poste"
+                           href="%s"
+                           onclick="return showAddAnotherPopup(this);"
+                           title="Aperçu du poste">
+                           <img src="%simg/loupe.png" />
+                        </a>
+                        <a href="%s">Poste</a>
+                        &nbsp;""" % \
+            (reverse('poste_apercu', args=(d.poste.id,)),
+             settings.STATIC_URL,
+             reverse('admin:rh_poste_change', args=(d.poste.id,)))
+            organigramme = u"""<a href="%s">Organigramme</a>""" % \
+                    (reverse('rho_employe', args=(d.poste.id,)))
             link = u"""<li>%s - %s - %s : [%s] %s</li>""" % \
                 (poste, organigramme,
                  d.date_debut.year,
@@ -491,7 +595,6 @@ class EmployeProxyAdmin(EmployeAdmin):
     _organigramme.short_description = "Organigramme"
 
 
-
 class EmployeCommentaireAdmin(admin.ModelAdmin):
     pass
 
@@ -503,58 +606,64 @@ class EmployePieceAdmin(admin.ModelAdmin):
 class FamilleEmploiAdmin(AUFMetadataAdminMixin, admin.ModelAdmin):
     list_display = ('nom', '_date_modification', 'user_modification', )
     inlines = (TypePosteInline,)
-    fieldsets = AUFMetadataAdminMixin.fieldsets + ( 
-        (None, {
-            'fields': ('nom', )
-        }),
-        )
+    fieldsets = AUFMetadataAdminMixin.fieldsets + (
+        (None, {'fields': ('nom', )}),)
 
     def _date_modification(self, obj):
-        return date(obj.date_modification) if obj.date_modification is not None else "(aucune)"
+        return date(obj.date_modification) \
+                if obj.date_modification is not None else "(aucune)"
     _date_modification.short_description = u'date modification'
     _date_modification.admin_order_field = 'date_modification'
 
+
 class OrganismeBstgAdmin(AUFMetadataAdminMixin, admin.ModelAdmin):
     search_fields = ('nom',)
-    list_display = ('nom', 'type', 'pays', '_date_modification', 'user_modification', )
+    list_display = (
+            'nom',
+            'type',
+            'pays',
+            '_date_modification',
+            'user_modification',
+            )
     list_filter = ('type', )
     inlines = (DossierROInline,)
-    fieldsets = AUFMetadataAdminMixin.fieldsets + ( 
-        (None, {
-            'fields': ('nom', 'type', 'pays', )
-        }),
+    fieldsets = AUFMetadataAdminMixin.fieldsets + (
+        (None, {'fields': ('nom', 'type', 'pays',)}),
         )
 
     def _date_modification(self, obj):
-        return date(obj.date_modification) if obj.date_modification is not None else "(aucune)"
+        return date(obj.date_modification) \
+                if obj.date_modification is not None else "(aucune)"
     _date_modification.short_description = u'date modification'
     _date_modification.admin_order_field = 'date_modification'
 
 
-class PosteAdmin(DateRangeMixin, AUFMetadataAdminMixin, ProtectRegionMixin, admin.ModelAdmin, AjaxSelect,):
-    form =  make_ajax_form(rh.Poste, {
-        'implantation' : 'implantations',
-        'type_poste' : 'typepostes',
-        'responsable' : 'postes',
-        'valeur_point_min' : 'valeurpoints',
-        'valeur_point_max' : 'valeurpoints',
+class PosteAdmin(DateRangeMixin, AUFMetadataAdminMixin, \
+        ProtectRegionMixin, admin.ModelAdmin, AjaxSelect,):
+    form = make_ajax_form(rh.Poste, {
+        'implantation': 'implantations',
+        'type_poste': 'typepostes',
+        'responsable': 'postes',
+        'valeur_point_min': 'valeurpoints',
+        'valeur_point_max': 'valeurpoints',
     })
     alphabet_filter = 'nom'
-    search_fields = ('nom', 
-        'implantation__code', 
-        'implantation__nom', 
-        'implantation__region__code', 
-        'implantation__region__nom',
-        'rh_dossiers__employe__nom',
-        'rh_dossiers__employe__prenom',
-        )
+    search_fields = (
+            'nom',
+            'implantation__code',
+            'implantation__nom',
+            'implantation__region__code',
+            'implantation__region__nom',
+            'rh_dossiers__employe__nom',
+            'rh_dossiers__employe__prenom',
+            )
     list_display = (
         '_id',
         '_apercu',
-        '_nom', 
+        '_nom',
         '_occupe_par',
-        'implantation', 
-        '_service', 
+        'implantation',
+        '_service',
         '_responsable',
         'date_debut',
         'date_fin',
@@ -562,44 +671,60 @@ class PosteAdmin(DateRangeMixin, AUFMetadataAdminMixin, ProtectRegionMixin, admi
         'user_modification',
         )
     list_filter = (
-        'implantation__region', 
+        'implantation__region',
         'implantation',
-        'service', 
+        'service',
         'type_poste',
         'type_poste__famille_emploi',
         'vacant',
         )
     list_display_links = ('_nom',)
     fieldsets = AUFMetadataAdminMixin.fieldsets + (
-        (None, {
-            'fields': (('nom', 'nom_feminin'), 'implantation', 'type_poste',
-                       'service', 'responsable')
-        }),
+        (None, {'fields': (
+                ('nom', 'nom_feminin'),
+                'implantation',
+                'type_poste',
+                'service',
+                'responsable',
+                )}
+                ),
         ('Contrat', {
-            'fields': (('regime_travail', 'regime_travail_nb_heure_semaine'), )
-        }),
+            'fields': ((
+                'regime_travail',
+                'regime_travail_nb_heure_semaine'),
+                )}
+            ),
         ('Recrutement', {
-            'fields': (('local', 'expatrie', 'mise_a_disposition', 'appel'),)
-        }),
+            'fields': (('local', 'expatrie', 'mise_a_disposition', 'appel'),)}
+            ),
         ('Rémunération', {
-            'fields': (('classement_min', 'valeur_point_min', 'devise_min', 'salaire_min', 'indemn_min', 'autre_min', ),
-                       ('classement_max', 'valeur_point_max' ,'devise_max', 'salaire_max', 'indemn_max', 'autre_max', ),
-                        )
-        }),
+            'fields': (('classement_min',
+                        'valeur_point_min',
+                        'devise_min',
+                        'salaire_min',
+                        'indemn_min',
+                        'autre_min',),
+                       ('classement_max',
+                        'valeur_point_max',
+                        'devise_max',
+                        'salaire_max',
+                        'indemn_max',
+                        'autre_max',),
+                        )}),
         ('Comparatifs de rémunération', {
             'fields': ('devise_comparaison',
                        ('comp_locale_min', 'comp_locale_max'),
                        ('comp_universite_min', 'comp_universite_max'),
                        ('comp_fonctionpub_min', 'comp_fonctionpub_max'),
                        ('comp_ong_min', 'comp_ong_max'),
-                       ('comp_autre_min', 'comp_autre_max'))
-        }),
+                       ('comp_autre_min', 'comp_autre_max'))}
+            ),
         ('Justification', {
-            'fields': ('justification',)
-        }),
+            'fields': ('justification',)}
+            ),
         ('Autres Méta-données', {
-            'fields': ('date_debut', 'date_fin')
-        }),
+            'fields': ('date_debut', 'date_fin')}
+            ),
     )
 
     inlines = (PosteFinancementInline,
@@ -608,7 +733,6 @@ class PosteAdmin(DateRangeMixin, AUFMetadataAdminMixin, ProtectRegionMixin, admi
                PosteComparaisonInline,
                PosteCommentaireInline, )
 
-
     def lookup_allowed(self, key, value):
         if key in (
             'date_debut__gte',
@@ -626,13 +750,15 @@ class PosteAdmin(DateRangeMixin, AUFMetadataAdminMixin, ProtectRegionMixin, admi
             ):
             return True
 
-    
     def _apercu(self, poste):
-        view_link = u"""<a onclick="return showAddAnotherPopup(this);" title="Aperçu du poste" href='%s'><img src="%simg/loupe.png" /></a>""" % \
+        view_link = u"""<a onclick="return showAddAnotherPopup(this);"
+                           title="Aperçu du poste"
+                           href='%s'>
+                        <img src="%simg/loupe.png" />
+                        </a>""" % \
                 (reverse('poste_apercu', args=(poste.id,)),
-                 settings.STATIC_URL,
-                 )
-        return view_link 
+                 settings.STATIC_URL,)
+        return view_link
     _apercu.allow_tags = True
     _apercu.short_description = ''
 
@@ -651,26 +777,33 @@ class PosteAdmin(DateRangeMixin, AUFMetadataAdminMixin, ProtectRegionMixin, admi
 
     def _responsable(self, obj):
         try:
-            responsable = u"""<a href="%s" onclick="return showAddAnotherPopup(this)"><img src="%simg/loupe.png" title="Aperçu du poste"></a> <a href="%s">%s</a><br />""" % \
-                    (
-                            reverse('poste_apercu', args=(obj.responsable.id,)),
-                            settings.STATIC_URL,
-                            reverse('admin:rh_poste_change', args=(obj.responsable.id,)),
-                            obj.responsable.nom
-                    )
+            responsable = u"""<a href="%s"
+                                 onclick="return showAddAnotherPopup(this)">
+                                <img src="%simg/loupe.png"
+                                     title="Aperçu du poste" />
+                              </a>
+                              <a href="%s">%s</a>
+                              <br />""" % \
+                (reverse('poste_apercu', args=(obj.responsable.id,)),
+                settings.STATIC_URL,
+                reverse('admin:rh_poste_change', args=(obj.responsable.id,)),
+                obj.responsable.nom)
         except:
             responsable = ''
 
         try:
-            employeposte_change = "%s %s" % (obj.responsable.rh_dossiers.all()[0].employe.nom.upper(), obj.responsable.rh_dossiers.all()[0].employe.prenom)
             employe_id = obj.responsable.rh_dossiers.all()[0].id
-            employe = u"""<br /><a href="%s" onclick="return showAddAnotherPopup(this)"><img src="%simg/loupe.png" title="Aperçu de l'employé"></a> <a href="%s">%s</a>""" % \
-                    (
-                            reverse('employe_apercu', args=(employe_id,)),
-                            settings.STATIC_URL,
-                            reverse('admin:rh_employe_change', args=(employe_id,)),
-                            employe
-                    )
+            employe = u"""<br />
+                    <a href="%s"
+                       onclick="return showAddAnotherPopup(this)">
+                       <img src="%simg/loupe.png"
+                            title="Aperçu de l'employé">
+                    </a>
+                    <a href="%s">%s</a>""" % \
+                    (reverse('employe_apercu', args=(employe_id,)),
+                     settings.STATIC_URL,
+                     reverse('admin:rh_employe_change', args=(employe_id,)),
+                     employe)
         except:
             employe = ""
 
@@ -681,8 +814,7 @@ class PosteAdmin(DateRangeMixin, AUFMetadataAdminMixin, ProtectRegionMixin, admi
     def _nom(self, poste):
         return """<a href="%s">%s</a>""" % \
                 (reverse('admin:rh_poste_change', args=(poste.id,)),
-                poste.nom
-                )
+                poste.nom)
     _nom.allow_tags = True
     _nom.short_description = u'Nom'
     _nom.admin_order_field = 'nom'
@@ -701,17 +833,21 @@ class PosteAdmin(DateRangeMixin, AUFMetadataAdminMixin, ProtectRegionMixin, admi
         if employes:
             l = []
             for e in employes:
-                link = "<a href='%s' title='Aperçu de l\'employer' onclick='return showAddAnotherPopup(this)'><img src='%simg/loupe.png' /></a> <a href='%s'>%s</a>" % \
+                link = u"""<a href='%s'
+                              title='Aperçu de l\'employer'
+                              onclick='return showAddAnotherPopup(this)'>
+                              <img src='%simg/loupe.png' />
+                            </a>
+                            <a href='%s'>%s</a>""" % \
                      (reverse('employe_apercu', args=(e.id,)),
                      settings.STATIC_URL,
                      reverse('admin:rh_employe_change', args=(e.id,)),
-                     e
-                     )
+                     e)
                 l.append(link)
             output = "\n<br />".join(l)
         return output
     _occupe_par.allow_tags = True
-    _occupe_par.short_description = "Occupé par"   
+    _occupe_par.short_description = "Occupé par"
 
     def save_formset(self, request, form, formset, change):
         instances = formset.save(commit=False)
@@ -740,17 +876,22 @@ class RemunerationAdmin(admin.ModelAdmin):
 
 
 class ResponsableImplantationAdmin(AUFMetadataAdminMixin, admin.ModelAdmin):
-    fieldsets = AUFMetadataAdminMixin.fieldsets + ( 
+    fieldsets = AUFMetadataAdminMixin.fieldsets + (
         (None, {
             'fields': ('employe', 'implantation', ),
         }),
         )
-    
+
 
 class ServiceAdmin(AUFMetadataAdminMixin, admin.ModelAdmin):
-    list_display = ('nom', '_archive', '_date_modification', 'user_modification', )
+    list_display = (
+            'nom',
+            '_archive',
+            '_date_modification',
+            'user_modification',
+            )
     list_filter = ('archive', )
-    fieldsets = AUFMetadataAdminMixin.fieldsets + ( 
+    fieldsets = AUFMetadataAdminMixin.fieldsets + (
         (None, {
             'fields': ('nom', 'archive', ),
         }),
@@ -764,107 +905,144 @@ class ServiceAdmin(AUFMetadataAdminMixin, admin.ModelAdmin):
     _archive.short_description = u'Archivé'
 
     def _date_modification(self, obj):
-        return date(obj.date_modification) if obj.date_modification is not None else "(aucune)"
+        return date(obj.date_modification) \
+                if obj.date_modification is not None else "(aucune)"
     _date_modification.short_description = u'date modification'
     _date_modification.admin_order_field = 'date_modification'
 
 
 class StatutAdmin(AUFMetadataAdminMixin, admin.ModelAdmin):
     list_display = ('code', 'nom', '_date_modification', 'user_modification', )
-    fieldsets = AUFMetadataAdminMixin.fieldsets + ( 
+    fieldsets = AUFMetadataAdminMixin.fieldsets + (
         (None, {
             'fields': ('code', 'nom', ),
         }),
         )
 
     def _date_modification(self, obj):
-        return date(obj.date_modification) if obj.date_modification is not None else "(aucune)"
+        return date(obj.date_modification) \
+                if obj.date_modification is not None else "(aucune)"
     _date_modification.short_description = u'date modification'
     _date_modification.admin_order_field = 'date_modification'
 
+
 class TauxChangeAdmin(admin.ModelAdmin):
-    list_display = ('taux', 'devise', 'annee', '_date_modification', 'user_modification', )
+    list_display = (
+            'taux',
+            'devise',
+            'annee',
+            '_date_modification',
+            'user_modification',
+            )
     list_filter = ('devise', )
-    fieldsets = AUFMetadataAdminMixin.fieldsets + ( 
+    fieldsets = AUFMetadataAdminMixin.fieldsets + (
         (None, {
             'fields': ('taux', 'devise', 'annee', ),
         }),
         )
 
     def _date_modification(self, obj):
-        return date(obj.date_modification) if obj.date_modification is not None else "(aucune)"
+        return date(obj.date_modification) \
+                if obj.date_modification is not None else "(aucune)"
     _date_modification.short_description = u'date modification'
     _date_modification.admin_order_field = 'date_modification'
 
+
 class TypeContratAdmin(admin.ModelAdmin):
-    list_display = ('nom', 'nom_long', '_date_modification', 'user_modification', )
-    fieldsets = AUFMetadataAdminMixin.fieldsets + ( 
+    list_display = (
+            'nom',
+            'nom_long',
+            '_date_modification',
+            'user_modification',
+            )
+    fieldsets = AUFMetadataAdminMixin.fieldsets + (
         (None, {
             'fields': ('nom', 'nom_long', ),
         }),
         )
 
     def _date_modification(self, obj):
-        return date(obj.date_modification) if obj.date_modification is not None else "(aucune)"
+        return date(obj.date_modification) \
+                if obj.date_modification is not None else "(aucune)"
     _date_modification.short_description = u'date modification'
     _date_modification.admin_order_field = 'date_modification'
 
 
 class TypePosteAdmin(AUFMetadataAdminMixin, admin.ModelAdmin):
     search_fields = ('nom', 'nom_feminin', )
-    list_display = ('nom', 'famille_emploi', '_date_modification', 'user_modification', )
+    list_display = (
+            'nom',
+            'famille_emploi',
+            '_date_modification',
+            'user_modification',
+            )
     list_filter = ('famille_emploi', )
-    fieldsets = AUFMetadataAdminMixin.fieldsets + ( 
+    fieldsets = AUFMetadataAdminMixin.fieldsets + (
         (None, {
-            'fields': ('nom', 'nom_feminin', 'is_responsable', 'famille_emploi',  )
-        }),
+            'fields': (
+                'nom',
+                'nom_feminin',
+                'is_responsable',
+                'famille_emploi',
+                )}
+            ),
         )
 
     def _date_modification(self, obj):
-        return date(obj.date_modification) if obj.date_modification is not None else "(aucune)"
+        return date(obj.date_modification) \
+                if obj.date_modification is not None else "(aucune)"
     _date_modification.short_description = u'date modification'
     _date_modification.admin_order_field = 'date_modification'
 
 
 class TypeRemunerationAdmin(AUFMetadataAdminMixin, admin.ModelAdmin):
-    list_display = ('nom', 'type_paiement', 'nature_remuneration', '_date_modification', 'user_modification', )
-    fieldsets = AUFMetadataAdminMixin.fieldsets + ( 
-        (None, {
-            'fields': ('nom', 'type_paiement', 'nature_remuneration', )
-        }),
+    list_display = (
+            'nom',
+            'type_paiement',
+            'nature_remuneration',
+            '_date_modification',
+            'user_modification',)
+    fieldsets = AUFMetadataAdminMixin.fieldsets + (
+        (None, {'fields': ('nom', 'type_paiement', 'nature_remuneration',)}),
         )
 
     def _date_modification(self, obj):
-        return date(obj.date_modification) if obj.date_modification is not None else "(aucune)"
+        return date(obj.date_modification) \
+                if obj.date_modification is not None else "(aucune)"
     _date_modification.short_description = u'date modification'
     _date_modification.admin_order_field = 'date_modification'
 
 
 class TypeRevalorisationAdmin(AUFMetadataAdminMixin, admin.ModelAdmin):
     list_display = ('nom', '_date_modification', 'user_modification', )
-    fieldsets = AUFMetadataAdminMixin.fieldsets + ( 
-        (None, {
-            'fields': ('nom', )
-        }),
+    fieldsets = AUFMetadataAdminMixin.fieldsets + (
+        (None, {'fields': ('nom', )}),
         )
 
     def _date_modification(self, obj):
-        return date(obj.date_modification) if obj.date_modification is not None else "(aucune)"
+        return date(obj.date_modification) \
+                if obj.date_modification is not None else "(aucune)"
     _date_modification.short_description = u'date modification'
     _date_modification.admin_order_field = 'date_modification'
 
 
 class ValeurPointAdmin(AUFMetadataAdminMixin, admin.ModelAdmin):
-    list_display = ('_devise_code', '_devise_nom', 'annee', 'valeur',  '_date_modification', 'user_modification', )
+    list_display = (
+            '_devise_code',
+            '_devise_nom',
+            'annee',
+            'valeur',
+            '_date_modification',
+            'user_modification',
+            )
     list_filter = ('annee', 'devise', )
-    fieldsets = AUFMetadataAdminMixin.fieldsets + ( 
-        (None, {
-            'fields': ('valeur', 'devise', 'implantation', 'annee', )
-        }),
+    fieldsets = AUFMetadataAdminMixin.fieldsets + (
+        (None, {'fields': ('valeur', 'devise', 'implantation', 'annee', )}),
         )
 
     def _date_modification(self, obj):
-        return date(obj.date_modification) if obj.date_modification is not None else "(aucune)"
+        return date(obj.date_modification) \
+                if obj.date_modification is not None else "(aucune)"
     _date_modification.short_description = u'date modification'
     _date_modification.admin_order_field = 'date_modification'
 
@@ -880,7 +1058,7 @@ class ValeurPointAdmin(AUFMetadataAdminMixin, admin.ModelAdmin):
 admin.site.register(rh.Classement, ClassementAdmin)
 admin.site.register(rh.Devise, DeviseAdmin)
 admin.site.register(rh.Dossier, DossierAdmin)
-admin.site.register(rh.EmployeProxy, EmployeProxyAdmin)
+admin.site.register(EmployeProxy, EmployeProxyAdmin)
 admin.site.register(rh.Employe, EmployeAdmin)
 admin.site.register(rh.FamilleEmploi, FamilleEmploiAdmin)
 admin.site.register(rh.OrganismeBstg, OrganismeBstgAdmin)
index 0cbb1d4..f1d1b42 100644 (file)
@@ -4,11 +4,9 @@ import datetime
 from datetime import date
 from decimal import Decimal
 
-from django.db.models import signals
 from django.core.files.storage import FileSystemStorage
 from django.db import models
 from django.conf import settings
-from django.db.models import Q
 
 from auf.django.emploi.models import GENRE_CHOICES, SITUATION_CHOICES # devrait plutot être dans references
 from auf.django.metadata.models import AUFMetadata
@@ -200,6 +198,7 @@ class Poste_(AUFMetadata):
                             self.id)
         return representation
 
+
     prefix_implantation = "implantation__region"
     def get_regions(self):
         return [self.implantation.region]
@@ -473,12 +472,6 @@ class EmployeCommentaire(Commentaire):
         verbose_name = u"Employé commentaire"
         verbose_name_plural = u"Employé commentaires"
 
-class EmployeProxy(Employe):
-
-    class Meta:
-        proxy = True
-        verbose_name = u"Organigramme des employés"
-        verbose_name_plural = u"Organigramme des employés"
 
 LIEN_PARENTE_CHOICES = (
     ('Conjoint', 'Conjoint'),
@@ -646,6 +639,7 @@ class Dossier_(AUFMetadata):
         except:
             return None
 
+
 class Dossier(Dossier_):
     __doc__ = Dossier_.__doc__
     poste = models.ForeignKey('%s.Poste' % app_context(),
@@ -663,7 +657,7 @@ 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='+')
+    dossier = models.ForeignKey('%s.Dossier' % app_context(), db_column='dossier', related_name='%(app_label)s_dossierpieces')
     nom = models.CharField(verbose_name = u"Nom", max_length=255)
     fichier = models.FileField(verbose_name = u"Fichier",
                             upload_to=dossier_piece_dispatch,
@@ -704,7 +698,7 @@ class DossierComparaison_(models.Model):
         abstract = True
 
     def taux_devise(self):
-        annee = self.dossier.poste.date_debut.year
+        annee = self.dossier.contrat_date_debut.year
         taux = [tc.taux for tc in TauxChange.objects.filter(devise=self.devise, annee=annee)]
         taux = set(taux)
         if len(taux) != 1:
@@ -764,15 +758,17 @@ class Remuneration_(RemunerationMixin):
             return 1
 
         annee = datetime.datetime.now().year
-        if self.date_debut is not None:
-            annee = self.date_debut.year
         if self.dossier.poste.date_debut is not None:
             annee = self.dossier.poste.date_debut.year
+        if self.dossier.date_debut is not None:
+            annee = self.dossier.date_debut.year
+        if self.date_debut is not None:
+            annee = self.date_debut.year
 
         taux = [tc.taux for tc in TauxChange.objects.filter(devise=self.devise_id, annee=annee)]
         taux = set(taux)
         if len(taux) != 1:
-            raise Exception(u"Le taux de la devise %s n'a pas n'existe pas pour %s ou il existe plusieurs taux pour la même année" % (self.devise.id, annee))
+            raise Exception(u"Le taux de la devise %s n'a pas n'existe pas pour %s ou il existe plusieurs taux pour la même année %s (%s)" % (self.devise.code, annee, taux, self.dossier))
         else:
             return list(taux)[0]
 
@@ -1102,8 +1098,7 @@ class Classement_(AUFMetadata):
         verbose_name_plural = u"Classements"
 
     def __unicode__(self):
-        return u'%s.%s.%s (%s)' % (self.type, self.echelon, self.degre,
-                                   self.coefficient)
+        return u'%s.%s.%s' % (self.type, self.echelon, self.degre, )
 
 class Classement(Classement_):
     __doc__ = Classement_.__doc__
index f5222ce..dfb39e3 100644 (file)
@@ -1,21 +1,19 @@
 # -*- encoding: utf-8 -*-
-from sendfile import sendfile
+
+import unicodedata
 from datetime import date
 from itertools import izip
-from base64 import b64encode
 import networkx as nx
 
 from django.db.models import Q
 from django.contrib.auth.decorators import login_required
 from django.utils.encoding import smart_str
-from django.shortcuts import redirect, render_to_response, get_object_or_404
+from django.shortcuts import render_to_response, get_object_or_404
 from django.template import RequestContext
-from django.http import Http404
 from django.core.urlresolvers import reverse
 from django.http import HttpResponse
 
 from datamaster_modeles import models as ref
-from project.lib import get_employe_from_id
 
 from rh import models as rh
 from rh.lib import calc_remun
@@ -29,20 +27,20 @@ from dae.decorators import redirect_interdiction
 from dae.workflow import grp_drh, grp_correspondants_rh
 from django.conf import settings
 
-# homes
+
 @login_required
 def profil(request):
     """Profil personnel de l'employé - éditable"""
     rc = RequestContext(request)
     c = {}
-    
+
     employe = rc['this_employe']
-        
+
     c['user'] = request.user
     c['employe'] = employe
     return render_to_response('rh/profil.html', c, rc)
-    
-# employes
+
+
 @login_required
 def employes_liste(request):
     """Liste des employés."""
@@ -52,11 +50,14 @@ def employes_liste(request):
                     .exclude(dossiers__date_fin__lt=today) \
                     .order_by('nom')
     c = {
-        'user':request.user,
-        'employes':employes,
+        'user': request.user,
+        'employes': employes,
         }
-    return render_to_response('rh/employes_liste.html', c, RequestContext(request))
-    
+    return render_to_response('rh/employes_liste.html',
+            c,
+            RequestContext(request))
+
+
 @login_required
 def employe(request, id):
     """Information publique sur un employé."""
@@ -65,8 +66,8 @@ def employe(request, id):
     except:
         employe = rh.Employe.objects.none()
     c = {
-        'user':request.user,
-        'employe':employe,
+        'user': request.user,
+        'employe': employe,
         }
     return render_to_response('rh/employe.html', c, RequestContext(request))
 
@@ -89,21 +90,23 @@ def rapports_postes_hierarchie(request):
 
     c['postes'] = nx.to_dict_of_lists(graph)
 
-    return render_to_response('rh/rapports/postes_hierarchie.html', c, RequestContext(request))
+    return render_to_response('rh/rapports/postes_hierarchie.html',
+            c,
+            RequestContext(request))
+
 
 @login_required
 @drh_or_admin_required
 def hierarchie_poste(request):
     pass
 
+
 @login_required
 @drh_or_admin_required
 def rapports_poste(request):
 
     lookup_params = dict(request.GET.items())
 
-    comble = 'all'
-
     for key, value in lookup_params.items():
         if key == 'o' or key == 'ot':
             del lookup_params[key]
@@ -115,7 +118,6 @@ def rapports_poste(request):
             lookup_params[smart_str(key)] = value
 
         if key == 'comble':
-            comble = value
             del lookup_params[key]
 
     postes = rh.Poste.objects.select_related('implantation') \
@@ -176,7 +178,7 @@ def rapports_contrat(request):
             lookup_params[smart_str(key)] = value
 
     contrats = rh.Contrat.objects.select_related('dossier', 'dossier__poste', 'dossier__poste__implantation', 'type_contrat', 'dossier__employe')
-    
+
     cl = RechercheTemporelle(request, rh.Contrat)
     lookup_params = cl.purge_params(lookup_params)
     contrats = contrats.filter(**lookup_params).exclude(dossier__employe__supprime=1)
@@ -311,7 +313,7 @@ def rapports_employe_sans_contrat(request):
         employes_query = employes_query.order_by("%s%s" % ('-' if 'ot' in request.GET and request.GET['ot'] == "desc" else '', request.GET['o']))
 
     employes = {}
-   
+
     dossiers_en_cours = rh.Dossier.objects.filter(Q(date_fin=None) | Q(date_fin__gt=date.today()))
     tous_contrats_echus = rh.Contrat.objects.filter(date_fin__lt=date.today(), dossier__in=dossiers_en_cours)
     contrats = tous_contrats_echus.filter(**lookup_params).all()
@@ -319,7 +321,7 @@ def rapports_employe_sans_contrat(request):
         if c.dossier.employe.id not in employes.keys():
             employes[c.dossier.employe.id] = {'employe': c.dossier.employe, 'dossiers': []}
         employes[c.dossier.employe.id]['dossiers'] += [c.dossier,]
-            
+
 
 
     headers = [
@@ -400,7 +402,7 @@ def rapports_postes_service(request):
     for s in rh.Service.objects.all():
         postes = rh.Poste.objects.filter(service=s).all()
         num_postes = rh.Poste.objects.filter(service=s).count()
-        data.append({'service': s, 'num_postes': num_postes, 'postes': postes}) 
+        data.append({'service': s, 'num_postes': num_postes, 'postes': postes})
 
     c['data'] = data
     return render_to_response('rh/rapports/postes_service.html', c, RequestContext(request))
@@ -453,11 +455,8 @@ def poste_apercu(request, poste_id):
     return render_to_response('admin/rh/poste/apercu.html', c, RequestContext(request))
 
 def employe_apercu(request, employe_id):
-    from dae.workflow import grp_drh, grp_correspondants_rh
     employe = get_object_or_404(rh.Employe, pk=employe_id)
     user_groups = request.user.groups.all()
-
-    dernier_dossier = None
     dossiers = None
 
     if request.user.is_superuser or \
@@ -466,9 +465,9 @@ def employe_apercu(request, employe_id):
     if grp_correspondants_rh in user_groups:
         regions = [d.poste.implantation.region for d in employe.rh_dossiers.all()]
         q = Q(employe=employe) & Q(implantation__region__in=regions)
-     
-    dossiers = rh.Dossier.objects.filter(employe=employe).order_by('-date_debut')
-      
+
+    dossiers = rh.Dossier.objects.filter(q).order_by('-date_debut')
+
     c = {
         'is_popup' : request.GET.get('_popup', False),
         'employe' : employe,
@@ -500,12 +499,16 @@ def organigrammes_employe(request, id):
         for n in a.nodes():
             p = postes_by_id[int(n)]
             d = rh.Dossier.objects.select_related('employe').filter((Q(date_fin__gt=date.today()) | Q(date_fin=None)) & (Q(date_debut__lt=date.today()) | Q(date_debut=None)) & Q(poste=p)).exclude(supprime=True).exclude(poste__responsable=None).all()[0]
-            n.attr['label'] = "%s %s\\n%s\\n%s" % (d.id, d.poste.nom, "%s %s" % (d.employe.nom.upper(), d.employe.prenom), d.poste.implantation)
-            #n.attr['label'] = str(n.attr['label'].encode('ascii', 'xmlcharrefreplace'))
+
+            label = u"%s %s\\n%s\\n%s" % (d.id, d.poste.nom, "%s %s" %
+                    (d.employe.nom.upper(), d.employe.prenom),
+                    d.poste.implantation)
+            label = unicodedata.normalize('NFKD', label).encode('ascii','ignore')
+            n.attr['label'] = label
             n.attr['href'] = reverse("admin:rh_employe_change", args=(d.employe_id,))
 
-        a.graph_attr['normalize'] = True
-        a.graph_attr['level'] = 2
+        #a.graph_attr['normalize'] = True
+        #a.graph_attr['level'] = 2
         a.layout(prog='dot')
 
         svg = a.draw(format='svg')