move lib
authorOlivier Larchevêque <olivier.larcheveque@gmail.com>
Thu, 26 Jan 2012 15:22:03 +0000 (10:22 -0500)
committerOlivier Larchevêque <olivier.larcheveque@gmail.com>
Thu, 26 Jan 2012 15:22:03 +0000 (10:22 -0500)
project/rh/admin.py
project/rh/lib.py

index 52b61d5..f6fb026 100644 (file)
-# -*- encoding: utf-8 
+# -*- 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 rh.models import *
-from rh.lib import *
-
-AyantDroitInline.model = AyantDroit
-AyantDroitCommentaireInline.model = AyantDroitCommentaire
-ContratInline.model = Contrat
-DossierROInline.model = Dossier
-DossierCommentaireInline.model = DossierCommentaire
-DossierPieceInline.model = DossierPiece
-EmployeInline.model = Employe
-EmployeCommentaireInline.model = EmployeCommentaire
-EmployePieceInline.model = EmployePiece
-#EvenementInline.model = Evenement
-#EvenementRemunerationInline.model = EvenementRemuneration
-PosteCommentaireInline.model = PosteCommentaire
-PosteFinancementInline.model = PosteFinancement
-PostePieceInline.model = PostePiece
-RemunerationInline.model = Remuneration
-TypePosteInline.model = TypePoste
-
-#admin.site.register(AyantDroit, AyantDroitAdmin)
-#admin.site.register(AyantDroitCommentaire, AyantDroitCommentaireAdmin)
-admin.site.register(Classement, ClassementAdmin)
-#admin.site.register(Commentaire, CommentaireAdmin)
-#admin.site.register(Contrat, ContratAdmin)
-admin.site.register(Devise, DeviseAdmin)
-admin.site.register(Dossier, DossierAdmin)
-#admin.site.register(DossierCommentaire, DossierCommentaireAdmin)
-#admin.site.register(DossierPiece, DossierPieceAdmin)
-admin.site.register(Employe, EmployeAdmin)
-#admin.site.register(EmployeCommentaire, EmployeCommentaireAdmin)
-#admin.site.register(EmployePiece, EmployePieceAdmin)
-#admin.site.register(Evenement, EvenementAdmin)
-#admin.site.register(EvenementRemuneration, EvenementRemunerationAdmin)
-admin.site.register(FamilleEmploi, FamilleEmploiAdmin)
-admin.site.register(OrganismeBstg, OrganismeBstgAdmin)
-admin.site.register(Poste, PosteAdmin)
-#admin.site.register(PosteCommentaire, PosteCommentaireAdmin)
-#admin.site.register(PosteFinancement, PosteFinancementAdmin)
-#admin.site.register(PostePiece, PostePieceAdmin)
-#admin.site.register(Remuneration, RemunerationAdmin)
-admin.site.register(ResponsableImplantation, ResponsableImplantationAdmin)
-admin.site.register(Service, ServiceAdmin)
-admin.site.register(Statut, StatutAdmin)  # FIXME: timeout in admin
-admin.site.register(TauxChange, TauxChangeAdmin)
-admin.site.register(TypeContrat, TypeContratAdmin)  # FIXME: timeout in admin
-admin.site.register(TypePoste, TypePosteAdmin)
-admin.site.register(TypeRemuneration, TypeRemunerationAdmin)
-admin.site.register(TypeRevalorisation, TypeRevalorisationAdmin)
-admin.site.register(ValeurPoint, ValeurPointAdmin)
+from django.conf import settings
+from django.db.models import Q
+from ajax_select import make_ajax_form
+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
+import models as rh
+
+# Override of the InlineModelAdmin to support the link in the tabular inline
+class LinkedInline(admin.options.InlineModelAdmin):
+    template = "admin/linked.html"
+    admin_model_path = None
+
+    def __init__(self, *args):
+        super(LinkedInline, self).__init__(*args)
+        if self.admin_model_path is None:
+            self.admin_model_path = self.model.__name__.lower()
+
+
+class ProtectRegionMixin(object):
+
+    def queryset(self, request):
+        from dae.workflow import grp_drh, grp_correspondants_rh
+        qs = super(ProtectRegionMixin, self).queryset(request)
+
+        if request.user.is_superuser:
+            return qs
+
+        user_groups = request.user.groups.all()
+
+        if grp_drh in user_groups:
+            return qs
+
+        if grp_correspondants_rh in user_groups:
+            employe = get_employe_from_user(request.user)
+            q = Q(**{self.model.prefix_implantation: employe.implantation.region})
+            qs = qs.filter(q).distinct()
+            return qs
+        return qs.none()
+
+    def has_change_permission(self, request, obj=None):
+        if obj is None:
+            return True
+        ids = [o.id for o in self.queryset(request)]
+        return obj.id in ids
+
+
+# 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]
+
+
+class AyantDroitInline(AUFMetadataInlineAdminMixin, admin.StackedInline):
+    model = rh.AyantDroit
+    form = AyantDroitForm
+    extra = 0
+
+    fieldsets = (
+        (None, {
+            'fields': (('nom', 'prenom'), ('nom_affichage', 'genre'), 'nationalite', 'date_naissance', 'lien_parente', )
+        }),
+    )
+
+
+class AyantDroitCommentaireInline(AUFMetadataInlineAdminMixin, admin.TabularInline):
+    readonly_fields = ('owner', )
+    model = rh.AyantDroitCommentaire
+    extra = 1
+
+
+class ContratInline(AUFMetadataInlineAdminMixin, admin.TabularInline):
+    form = ContratForm
+    model = rh.Contrat
+    extra = 1
+
+
+class DossierROInline(ReadOnlyInlineMixin, LinkedInline):
+    template = "admin/rh/dossier/linked.html"
+    exclude = AUF_METADATA_READONLY_FIELDS
+    model = rh.Dossier
+    extra = 0
+    can_delete = False
+
+    def has_add_permission(self, request=None):
+        return False
+
+    def has_change_permission(self, request, obj=None):
+        return False
+
+    def has_delete_permission(self, request, obj=None):
+        return False
+
+
+class DossierCommentaireInline(AUFMetadataInlineAdminMixin, admin.TabularInline):
+    readonly_fields = ('owner', )
+    model = rh.DossierCommentaire
+    extra = 1
+
+
+class DossierPieceInline(admin.TabularInline):
+    model = rh.DossierPiece
+    extra = 4
+
+
+class EmployeInline(admin.TabularInline):
+    model = rh.Employe
+
+class EmployeCommentaireInline(AUFMetadataInlineAdminMixin, admin.TabularInline):
+    readonly_fields = ('owner', )
+    model = rh.EmployeCommentaire
+    extra = 1
+
+
+class EmployePieceInline(admin.TabularInline):
+    model = rh.EmployePiece
+    extra = 4
+
+
+#class EvenementInline(AUFMetadataInlineAdminMixin, admin.TabularInline):
+#    model = rh.Evenement
+#    extra = 1
+
+
+#class EvenementRemunerationInline(AUFMetadataInlineAdminMixin, admin.TabularInline):
+#    model = EvenementRemuneration
+#    extra = 1
+
+#class EvenementAdmin(admin.ModelAdmin):
+#    inlines = (EvenementRemunerationInline,)
+#
+#
+#class EvenementRemunerationAdmin(admin.ModelAdmin):
+#    pass
+
+
+class PosteCommentaireInline(AUFMetadataInlineAdminMixin, admin.TabularInline):
+    readonly_fields = ('owner', )
+    model = rh.PosteCommentaire
+    extra = 1
+
+
+class PosteFinancementInline(admin.TabularInline):
+    model = rh.PosteFinancement
+
+
+class PostePieceInline(admin.TabularInline):
+    model = rh.PostePiece
+
+
+class RemunerationInline(AUFMetadataInlineAdminMixin, admin.TabularInline):
+    model = rh.Remuneration
+    extra = 1
+
+
+class RemunerationROInline(ReadOnlyInlineMixin, RemunerationInline):
+    pass
+
+
+class TypePosteInline(AUFMetadataInlineAdminMixin, admin.TabularInline):
+    model = rh.TypePoste
+
+
+class AyantDroitAdmin(AUFMetadataAdminMixin, ProtectRegionMixin, admin.ModelAdmin):
+    """
+    L'ajout d'un nouvel ayantdroit se fait dans l'admin de l'employé.
+    """
+    alphabet_filter = 'nom'
+    search_fields = ('nom', 'prenom', 'employe__nom', 'employe__prenom', )
+    list_display = ('_employe', 'lien_parente', '_ayantdroit', )
+    inlines = (AyantDroitCommentaireInline,)
+    readonly_fields = AUFMetadataAdminMixin.readonly_fields + ('employe',)
+    fieldsets = AUFMetadataAdminMixin.fieldsets + (
+        ("Lien avec l'employé", {
+            'fields': (('employe', 'lien_parente'), )
+        }),
+
+        ('Identification', {
+            'fields': (('nom', 'prenom'), ('nom_affichage', 'genre'), 'nationalite', 'date_naissance', )
+        }),
+    )
+
+    def save_formset(self, request, form, formset, change):
+        instances = formset.save(commit=False)
+        for instance in instances:
+            if instance.__class__ == rh.AyantDroitCommentaire:
+                instance.owner = request.user
+            instance.save()
+
+    def _ayantdroit(self, obj):
+        return unicode(obj)
+    _ayantdroit.short_description = u'Ayant droit'
+
+    def _employe(self, obj):
+        return unicode(obj.employe)
+    _employe.short_description = u'Employé'
+
+    def has_add_permission(self, request):
+        return False
+
+class AyantDroitCommentaireAdmin(admin.ModelAdmin):
+    pass
+
+
+class ClassementAdmin(AUFMetadataAdminMixin, admin.ModelAdmin):
+    fieldsets = AUFMetadataAdminMixin.fieldsets + (
+        (None, {
+            'fields': ('type', 'echelon', 'degre', 'coefficient',  )
+        }),
+    )
+
+
+class CommentaireAdmin(admin.ModelAdmin):
+    pass
+
+
+#class ContratAdmin(AUFMetadataAdminMixin, admin.ModelAdmin):
+#    form = ContratForm
+#    alphabet_filter = 'dossier__employe__nom'
+#    search_fields = ('dossier__employe__nom', 'dossier__employe__prenom', 'dossier__poste__nom', 'dossier__poste__nom_feminin', )
+#    list_display = ('id', '_employe', '_poste', 'date_debut', 'date_fin', '_implantation', )
+#    fieldsets = AUFMetadataAdminMixin.fieldsets + (
+#        (None, {
+#            'fields': ('dossier', 'type_contrat', 'date_debut', 'date_fin', )
+#        }),
+#    )
+#
+#    def lookup_allowed(self, key, value):
+#        if key in ('dossier__employe__nom__istartswith',  ):
+#            return True
+#
+#    def _employe(self, obj):
+#        return unicode(obj.dossier.employe)
+#    _employe.short_description = "Employé"
+#
+#    def _poste(self, obj):
+#        return obj.dossier.poste.nom
+#    _poste.short_description = "Poste"
+#
+#    def _implantation(self, obj):
+#        return obj.dossier.poste.implantation
+#    _poste.short_description = "Implantation"
+
+class DeviseAdmin(AUFMetadataAdminMixin, admin.ModelAdmin):
+    fieldsets = AUFMetadataAdminMixin.fieldsets + (
+        (None, {
+            'fields': ('code', 'nom', ),
+        }),
+    )
+
+
+class DossierAdmin(AUFMetadataAdminMixin, ProtectRegionMixin, admin.ModelAdmin, AjaxSelect):
+    alphabet_filter = 'employe__nom'
+    search_fields = ('employe__nom', 'employe__prenom', 'poste__nom', 'poste__nom_feminin')
+    list_display = (
+        '_id',
+        '_poste',
+        '_employe',
+        '_date_debut',
+        '_date_fin',
+        'date_modification',
+        'actif',
+    )
+    list_filter = (
+        'poste__implantation__region',
+        'poste__implantation',
+        'poste__type_poste',
+        'poste__type_poste__famille_emploi',
+        'rh_contrats__type_contrat',
+        'actif',
+    )
+    inlines = (DossierPieceInline, ContratInline,
+               RemunerationInline,
+               #EvenementInline,
+               DossierCommentaireInline,
+              )
+    fieldsets = AUFMetadataAdminMixin.fieldsets + (
+        (None, {
+            'fields': ('employe', 'poste', 'statut', 'organisme_bstg',)
+        }),
+        ('Recrutement', {
+            'fields': ('statut_residence', 'remplacement', 'remplacement_de', )
+        }),
+        ('Rémunération', {
+            'fields': ('classement', ('regime_travail', 'regime_travail_nb_heure_semaine'),)
+        }),
+        ('Occupation du Poste par cet Employe', {
+            'fields': (('date_debut', 'date_fin'), )
+        }),
+    )
+    form =  make_ajax_form(rh.Dossier, {
+        'employe' : 'employes',
+        'poste' : 'postes',
+        'remplacement_de' : 'dossiers',
+    })
+
+    def lookup_allowed(self, key, value):
+        if key in (
+            'employe__nom__istartswith',
+            'actif__exact',
+            'poste__implantation__region__id__exact',
+            'poste__implantation__id__exact',
+            'poste__type_poste__id__exact',
+            'poste__type_poste__famille_emploi__id__exact',
+            'rh_contrats__type_contrat__id__exact',
+            ):
+            return True
+
+    def _id(self, d):
+        link = u"""<a onclick="return showAddAnotherPopup(this);" href='%s'>%s</a> <a href="%s" title="Modifier le dossier"><img src="%simg/page_edit.png" /></a>""" % \
+            (reverse('dossier_apercu', args=(d.id,)),
+             d.id,
+             reverse('admin:rh_dossier_change', args=(d.id,)),
+             settings.MEDIA_URL,
+             )
+        return link
+    _id.allow_tags = True
+    _id.short_description = u'#'
+    _id.admin_order_field = 'id'
+    
+
+    def _actif(self, dossier):
+        if dossier.employe.actif:
+          html = """<img alt="True" src="%simg/admin/icon-yes.gif">"""
+        else:
+          html = """<img alt="False" src="%simg/admin/icon-no.gif">"""
+        return html % settings.ADMIN_MEDIA_PREFIX 
+    _actif.allow_tags = True
+    _actif.short_description = u'Employé actif'
+    _actif.admin_order_field = 'employe__actif'
+
+    def _date_debut(self, obj):
+        return obj.date_debut
+    _date_debut.short_description = u'Occupation début'
+    _date_debut.admin_order_field = 'date_debut'
+
+    def _date_fin(self, obj):
+        return obj.date_fin
+    _date_fin.short_description = u'Occupation fin'
+    _date_fin.admin_order_field = 'date_fin'
+
+    def _poste(self, dossier):
+        link = u"""<a onclick="return showAddAnotherPopup(this);" href='%s'>%s</a> <a href="%s" title="Modifier le poste"><img src="%simg/page_edit.png" /></a>""" % \
+                (reverse('poste_apercu', args=(dossier.poste.id,)),
+                 dossier.poste,
+                 reverse('admin:rh_poste_change', args=(dossier.poste.id,)),
+                 settings.MEDIA_URL,
+                 )
+        return link
+    _poste.allow_tags = True
+    _poste.short_description = u'Poste'
+    _poste.admin_order_field = 'poste__nom'
+
+    def _employe(self, obj):
+        employe = obj.employe
+        view_link = reverse('employe_apercu', args=(employe.id,))
+        edit_link = reverse('admin:rh_employe_change', args=(employe.id,))
+
+        if employe.actif == False:
+            style = "color: grey";
+            edit = ""
+        else:
+            style = ""
+            edit = u"""<a href="%s" title="Modifier l'employé"><img src="%simg/user_edit.png" /></a>""" % (edit_link, settings.MEDIA_URL,)
+        return u"""<a onclick="return showAddAnotherPopup(this);" href='%s' style="%s;">[%s] %s %s</a>%s
+                  """ % \
+        (view_link, style, employe.id, employe.nom.upper(), employe.prenom.title(), edit)
+    _employe.allow_tags = True
+    _employe.short_description = u"Employé ([code] NOM Prénom)"
+    _employe.admin_order_field = "employe__nom"
+   
+    def save_formset(self, request, form, formset, change):
+        instances = formset.save(commit=False)
+        for instance in instances:
+            if instance.__class__ == rh.DossierCommentaire:
+                instance.owner = request.user
+            instance.save()
+
+
+class DossierPieceAdmin(admin.ModelAdmin):
+    pass
+
+
+class DossierCommentaireAdmin(admin.ModelAdmin):
+    pass
+
+
+class EmployeAdmin(AUFMetadataAdminMixin, ProtectRegionMixin, admin.ModelAdmin):
+    alphabet_filter = 'nom'
+    DEFAULT_ALPHABET = u'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+    search_fields = ('id', 'nom', 'prenom', 'nom_affichage', )
+    ordering = ('nom', )
+    form = EmployeAdminForm
+    list_display = ('_nom', '_dossiers', 'date_modification',  'user_modification', 'actif',)
+    list_filter = ('rh_dossiers__poste__implantation__region',  'rh_dossiers__poste__implantation', 'actif', )
+    inlines = (AyantDroitInline,
+               DossierROInline,
+               EmployePieceInline,
+               EmployeCommentaireInline)
+    fieldsets = AUFMetadataAdminMixin.fieldsets + (
+        ('Identification', {
+            'fields': (('nom', 'prenom'), ('nom_affichage', 'genre'), 'nationalite', 'date_naissance', )
+        }),
+        ('Informations personnelles', {
+            'fields': ('situation_famille', 'date_entree', )
+        }),
+        ('Coordonnées', {
+            'fields': (('tel_domicile', 'tel_cellulaire'), ('adresse', 'ville'), ('code_postal', 'province'), 'pays', )
+        }),
+        )
+
+    def _nom(self, obj):
+        view_link = reverse('employe_apercu', args=(obj.id,))
+        edit_link = reverse('admin:rh_employe_change', args=(obj.id,))
+        return u"""<a onclick="return showAddAnotherPopup(this);" href='%s'>[%s] %s %s</a>
+                  <a href="%s" title="Modifier l'employé"><img src="%simg/user_edit.png" /></a>""" % \
+        (view_link, obj.id, obj.nom.upper(), obj.prenom.title(), edit_link, settings.MEDIA_URL,)
+    _nom.allow_tags = True
+    _nom.short_description = u"Employé ([code] NOM Prénom)"
+    _nom.admin_order_field = "nom"
+
+    def _dossiers(self, obj):
+        l = []
+        for d in obj.rh_dossiers.all().order_by('-date_debut'):
+            style = ""
+            edit = u"""<a href="%s" title="Modifier le dossier"><img src="%simg/page_edit.png" /></a>""" % (reverse('admin:rh_dossier_change', args=(d.id,)), settings.MEDIA_URL,)
+            if d.date_fin is not None:
+                edit = ""
+                style = u"color: grey";
+            link = u"""<li><a style="%s;" onclick="return showAddAnotherPopup(this);" href='%s'>%s : %s</a>%s</li>""" % \
+                (style,
+                 reverse('dossier_apercu', args=(d.id,)),
+                 d.date_debut.year,
+                 d.poste,
+                 edit,
+                 )
+            l.append(link)
+        return "<ul>%s</ul>" % "\n".join(l)
+    _dossiers.allow_tags = True
+    _dossiers.short_description = u"Dossiers"
+
+    def queryset(self, request):
+        qs = super(EmployeAdmin, self).queryset(request) 
+        return qs.select_related(depth=1).order_by('nom')
+
+    def save_formset(self, request, form, formset, change):
+        instances = formset.save(commit=False)
+        for instance in instances:
+            if instance.__class__ == rh.EmployeCommentaire:
+                instance.owner = request.user
+            instance.save()
+
+
+
+class EmployeCommentaireAdmin(admin.ModelAdmin):
+    pass
+
+
+class EmployePieceAdmin(admin.ModelAdmin):
+    pass
+
+
+class FamilleEmploiAdmin(AUFMetadataAdminMixin, admin.ModelAdmin):
+    inlines = (TypePosteInline,)
+    fieldsets = AUFMetadataAdminMixin.fieldsets + ( 
+        (None, {
+            'fields': ('nom', )
+        }),
+        )
+
+
+class OrganismeBstgAdmin(AUFMetadataAdminMixin, ProtectRegionMixin, admin.ModelAdmin):
+    search_fields = ('nom', )
+    list_display = ('nom', 'type', 'pays', )
+    inlines = (DossierROInline,)
+    fieldsets = AUFMetadataAdminMixin.fieldsets + ( 
+        (None, {
+            'fields': ('nom', 'type', 'pays', )
+        }),
+        )
+
+
+class PosteAdmin(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',
+        )
+    list_display = (
+        '_nom', 
+        '_occupe_par',
+        'implantation', 
+        'service', 
+        'date_debut', 
+        'date_fin',
+        'date_modification',
+        'user_modification',
+        'actif',
+        )
+    list_filter = ('service', 
+        'implantation__region', 
+        'implantation',
+        'type_poste',
+        'type_poste__famille_emploi',
+        'actif',
+        )
+    fieldsets = AUFMetadataAdminMixin.fieldsets + (
+        (None, {
+            'fields': (('nom', 'nom_feminin'), 'implantation', 'type_poste',
+                       'service', 'responsable')
+        }),
+        ('Contrat', {
+            'fields': (('regime_travail', 'regime_travail_nb_heure_semaine'), )
+        }),
+        ('Recrutement', {
+            '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', ),
+                        )
+        }),
+        ('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'))
+        }),
+        ('Justification', {
+            'fields': ('justification',)
+        }),
+        ('Autres Metadata', {
+            'fields': ('date_debut', 'date_fin')
+        }),
+    )
+
+    inlines = (PosteFinancementInline,
+               PostePieceInline,
+               DossierROInline,
+               PosteCommentaireInline, )
+
+
+    def _nom(self, poste):
+        link = u"""<a onclick="return showAddAnotherPopup(this);" href='%s'>%s</a> <a href="%s" title="Modifier le poste"><img src="%simg/page_edit.png" /></a>""" % \
+                (reverse('poste_apercu', args=(poste.id,)),
+                 poste.nom,
+                 reverse('admin:rh_poste_change', args=(poste.id,)),
+                 settings.MEDIA_URL,
+                 )
+        return link
+    _nom.allow_tags = True
+    _nom.short_description = u'Nom'
+    _nom.admin_order_field = 'nom'
+
+    def _occupe_par(self, obj):
+        """Formatte la méthode Poste.occupe_par() pour l'admin"""
+        output = "VACANT"
+        employes = obj.occupe_par()
+        if employes:
+            l = []
+            for e in employes:
+                link = "<a href='%s'>%s</a>" % \
+                    (reverse('admin:rh_employe_change', args=(e.id,)),
+                     e)
+                l.append(link)
+            output = "\n<br />".join(l)
+        return output
+    _occupe_par.allow_tags = True
+    _occupe_par.short_description = "Occupé par"   
+
+    def save_formset(self, request, form, formset, change):
+        instances = formset.save(commit=False)
+        for instance in instances:
+            if instance.__class__ == rh.PosteCommentaire:
+                instance.owner = request.user
+            instance.save()
+        formset.save_m2m()
+
+
+class PosteCommentaireAdmin(admin.ModelAdmin):
+    pass
+
+
+class PosteFinancementAdmin(admin.ModelAdmin):
+    pass
+
+
+class PostePieceAdmin(admin.ModelAdmin):
+    fk_name = 'poste'
+
+
+class RemunerationAdmin(admin.ModelAdmin):
+    pass
+
+
+class ResponsableImplantationAdmin(AUFMetadataAdminMixin, admin.ModelAdmin):
+    fieldsets = AUFMetadataAdminMixin.fieldsets + ( 
+        (None, {
+            'fields': ('employe', 'implantation', ),
+        }),
+        )
+    
+
+class ServiceAdmin(AUFMetadataAdminMixin, admin.ModelAdmin):
+    list_display = ('nom', 'actif', )
+    fieldsets = AUFMetadataAdminMixin.fieldsets + ( 
+        (None, {
+            'fields': ('nom', ),
+        }),
+        )
+
+class StatutAdmin(AUFMetadataAdminMixin, admin.ModelAdmin):
+    fieldsets = AUFMetadataAdminMixin.fieldsets + ( 
+        (None, {
+            'fields': ('code', 'nom', ),
+        }),
+        )
+
+class TauxChangeAdmin(admin.ModelAdmin):
+    list_display = ('taux', 'devise', 'annee', )
+    list_filter = ('devise', )
+    fieldsets = AUFMetadataAdminMixin.fieldsets + ( 
+        (None, {
+            'fields': ('taux', 'devise', 'annee', ),
+        }),
+        )
+
+class TypeContratAdmin(admin.ModelAdmin):
+    fieldsets = AUFMetadataAdminMixin.fieldsets + ( 
+        (None, {
+            'fields': ('nom', 'nom_long', ),
+        }),
+        )
+
+
+class TypePosteAdmin(AUFMetadataAdminMixin, admin.ModelAdmin):
+    search_fields = ('nom', 'nom_feminin', )
+    list_display = ('nom', 'famille_emploi', )
+    list_filter = ('famille_emploi', )
+    fieldsets = AUFMetadataAdminMixin.fieldsets + ( 
+        (None, {
+            'fields': ('nom', 'nom_feminin', 'is_responsable', 'famille_emploi',  )
+        }),
+        )
+
+
+class TypeRemunerationAdmin(AUFMetadataAdminMixin, admin.ModelAdmin):
+    list_display = ('nom', 'type_paiement', 'nature_remuneration', )
+    #inlines = (RemunerationROInline,) utilité?
+    fieldsets = AUFMetadataAdminMixin.fieldsets + ( 
+        (None, {
+            'fields': ('nom', 'type_paiement', 'nature_remuneration', )
+        }),
+        )
+
+
+class TypeRevalorisationAdmin(AUFMetadataAdminMixin, admin.ModelAdmin):
+    #inlines = (RemunerationROInline,) utilité?
+    fieldsets = AUFMetadataAdminMixin.fieldsets + ( 
+        (None, {
+            'fields': ('nom', )
+        }),
+        )
+
+
+class ValeurPointAdmin(AUFMetadataAdminMixin, admin.ModelAdmin):
+    list_display = ('_devise_code', '_devise_nom', 'annee', 'valeur', )
+    fieldsets = AUFMetadataAdminMixin.fieldsets + ( 
+        (None, {
+            'fields': ('valeur', 'devise', 'implantation', 'annee', )
+        }),
+        )
+
+    def _devise_code(self, obj):
+        return obj.devise.code
+    _devise_code.short_description = "Code de la devise"
+
+    def _devise_nom(self, obj):
+        return obj.devise.nom
+    _devise_nom.short_description = "Nom de la devise"
+
+
+admin.site.register(rh.Classement, ClassementAdmin)
+admin.site.register(rh.Devise, DeviseAdmin)
+admin.site.register(rh.Dossier, DossierAdmin)
+admin.site.register(rh.Employe, EmployeAdmin)
+admin.site.register(rh.FamilleEmploi, FamilleEmploiAdmin)
+admin.site.register(rh.OrganismeBstg, OrganismeBstgAdmin)
+admin.site.register(rh.Poste, PosteAdmin)
+admin.site.register(rh.ResponsableImplantation, ResponsableImplantationAdmin)
+admin.site.register(rh.Service, ServiceAdmin)
+admin.site.register(rh.Statut, StatutAdmin)  # FIXME: timeout in admin
+admin.site.register(rh.TauxChange, TauxChangeAdmin)
+admin.site.register(rh.TypeContrat, TypeContratAdmin)  # FIXME: timeout in admin
+admin.site.register(rh.TypePoste, TypePosteAdmin)
+admin.site.register(rh.TypeRemuneration, TypeRemunerationAdmin)
+admin.site.register(rh.TypeRevalorisation, TypeRevalorisationAdmin)
+admin.site.register(rh.ValeurPoint, ValeurPointAdmin)
index 986a3f6..80be156 100644 (file)
@@ -1,709 +1,3 @@
-# -*- 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 ajax_select import make_ajax_form
-from auf.django.metadata.admin import AUFMetadataAdminMixin, AUFMetadataInlineAdminMixin, AUF_METADATA_READONLY_FIELDS
-from project.rh import models as rh
-from forms import ContratForm, AyantDroitForm, EmployeAdminForm, AjaxSelect
-from dae.utils import get_employe_from_user
-
-
-# Override of the InlineModelAdmin to support the link in the tabular inline
-class LinkedInline(admin.options.InlineModelAdmin):
-    template = "admin/linked.html"
-    admin_model_path = None
-
-    def __init__(self, *args):
-        super(LinkedInline, self).__init__(*args)
-        if self.admin_model_path is None:
-            self.admin_model_path = self.model.__name__.lower()
-
-
-class ProtectRegionMixin(object):
-
-    def queryset(self, request):
-        from dae.workflow import grp_drh, grp_correspondants_rh
-        qs = super(ProtectRegionMixin, self).queryset(request)
-
-        if request.user.is_superuser:
-            return qs
-
-        user_groups = request.user.groups.all()
-
-        if grp_drh in user_groups:
-            return qs
-
-        if grp_correspondants_rh in user_groups:
-            employe = get_employe_from_user(request.user)
-            q = Q(**{self.model.prefix_implantation: employe.implantation.region})
-            qs = qs.filter(q).distinct()
-            return qs
-        return qs.none()
-
-    def has_change_permission(self, request, obj=None):
-        if obj is None:
-            return True
-        ids = [o.id for o in self.queryset(request)]
-        return obj.id in ids
-
-
-# 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]
-
-
-class AyantDroitInline(AUFMetadataInlineAdminMixin, admin.StackedInline):
-    model = models.Model  # à remplacer dans admin.py
-    form = AyantDroitForm
-    extra = 0
-
-    fieldsets = (
-        (None, {
-            'fields': (('nom', 'prenom'), ('nom_affichage', 'genre'), 'nationalite', 'date_naissance', 'lien_parente', )
-        }),
-    )
-
-
-class AyantDroitCommentaireInline(AUFMetadataInlineAdminMixin, admin.TabularInline):
-    readonly_fields = ('owner', )
-    model = models.Model  # à remplacer dans admin.py
-    extra = 1
-
-
-class ContratInline(AUFMetadataInlineAdminMixin, admin.TabularInline):
-    form = ContratForm
-    model = models.Model  # à remplacer dans admin.py
-    extra = 1
-
-
-class DossierROInline(ReadOnlyInlineMixin, LinkedInline):
-    template = "admin/rh/dossier/linked.html"
-    exclude = AUF_METADATA_READONLY_FIELDS
-    model = models.Model  # à remplacer dans admin.py
-    extra = 0
-    can_delete = False
-
-    def has_add_permission(self, request=None):
-        return False
-
-    def has_change_permission(self, request, obj=None):
-        return False
-
-    def has_delete_permission(self, request, obj=None):
-        return False
-
-
-class DossierCommentaireInline(AUFMetadataInlineAdminMixin, admin.TabularInline):
-    readonly_fields = ('owner', )
-    model = models.Model  # à remplacer dans admin.py
-    extra = 1
-
-
-class DossierPieceInline(admin.TabularInline):
-    model = models.Model  # à remplacer dans admin.py
-    extra = 4
-
-
-class EmployeInline(admin.TabularInline):
-    model = models.Model  # à remplacer dans admin.py
-
-class EmployeCommentaireInline(AUFMetadataInlineAdminMixin, admin.TabularInline):
-    readonly_fields = ('owner', )
-    model = models.Model  # à remplacer dans admin.py
-    extra = 1
-
-
-class EmployePieceInline(admin.TabularInline):
-    model = models.Model  # à remplacer dans admin.py
-    extra = 4
-
-
-class EvenementInline(AUFMetadataInlineAdminMixin, admin.TabularInline):
-    model = models.Model  # à remplacer dans admin.py
-    extra = 1
-
-
-class EvenementRemunerationInline(AUFMetadataInlineAdminMixin, admin.TabularInline):
-    model = models.Model  # à remplacer dans admin.py
-    extra = 1
-
-
-class PosteCommentaireInline(AUFMetadataInlineAdminMixin, admin.TabularInline):
-    readonly_fields = ('owner', )
-    model = models.Model  # à remplacer dans admin.py
-    extra = 1
-
-
-class PosteFinancementInline(admin.TabularInline):
-    model = models.Model  # à remplacer dans admin.py
-
-
-class PostePieceInline(admin.TabularInline):
-    model = models.Model  # à remplacer dans admin.py
-
-
-class RemunerationInline(AUFMetadataInlineAdminMixin, admin.TabularInline):
-    model = models.Model  # à remplacer dans admin.py
-    extra = 1
-
-
-class RemunerationROInline(ReadOnlyInlineMixin, RemunerationInline):
-    pass
-
-
-class TypePosteInline(AUFMetadataInlineAdminMixin, admin.TabularInline):
-    model = models.Model  # à remplacer dans admin.py
-
-
-# Admins
-
-class AyantDroitAdmin(AUFMetadataAdminMixin, ProtectRegionMixin, admin.ModelAdmin):
-    """
-    L'ajout d'un nouvel ayantdroit se fait dans l'admin de l'employé.
-    """
-    alphabet_filter = 'nom'
-    search_fields = ('nom', 'prenom', 'employe__nom', 'employe__prenom', )
-    list_display = ('_employe', 'lien_parente', '_ayantdroit', )
-    inlines = (AyantDroitCommentaireInline,)
-    readonly_fields = AUFMetadataAdminMixin.readonly_fields + ('employe',)
-    fieldsets = AUFMetadataAdminMixin.fieldsets + (
-        ("Lien avec l'employé", {
-            'fields': (('employe', 'lien_parente'), )
-        }),
-
-        ('Identification', {
-            'fields': (('nom', 'prenom'), ('nom_affichage', 'genre'), 'nationalite', 'date_naissance', )
-        }),
-    )
-
-    def save_formset(self, request, form, formset, change):
-        instances = formset.save(commit=False)
-        for instance in instances:
-            if instance.__class__ == rh.AyantDroitCommentaire:
-                instance.owner = request.user
-            instance.save()
-
-    def _ayantdroit(self, obj):
-        return unicode(obj)
-    _ayantdroit.short_description = u'Ayant droit'
-
-    def _employe(self, obj):
-        return unicode(obj.employe)
-    _employe.short_description = u'Employé'
-
-    def has_add_permission(self, request):
-        return False
-
-class AyantDroitCommentaireAdmin(admin.ModelAdmin):
-    pass
-
-
-class ClassementAdmin(AUFMetadataAdminMixin, admin.ModelAdmin):
-    fieldsets = AUFMetadataAdminMixin.fieldsets + (
-        (None, {
-            'fields': ('type', 'echelon', 'degre', 'coefficient',  )
-        }),
-    )
-
-
-class CommentaireAdmin(admin.ModelAdmin):
-    pass
-
-
-#class ContratAdmin(AUFMetadataAdminMixin, admin.ModelAdmin):
-#    form = ContratForm
-#    alphabet_filter = 'dossier__employe__nom'
-#    search_fields = ('dossier__employe__nom', 'dossier__employe__prenom', 'dossier__poste__nom', 'dossier__poste__nom_feminin', )
-#    list_display = ('id', '_employe', '_poste', 'date_debut', 'date_fin', '_implantation', )
-#    fieldsets = AUFMetadataAdminMixin.fieldsets + (
-#        (None, {
-#            'fields': ('dossier', 'type_contrat', 'date_debut', 'date_fin', )
-#        }),
-#    )
-#
-#    def lookup_allowed(self, key, value):
-#        if key in ('dossier__employe__nom__istartswith',  ):
-#            return True
-#
-#    def _employe(self, obj):
-#        return unicode(obj.dossier.employe)
-#    _employe.short_description = "Employé"
-#
-#    def _poste(self, obj):
-#        return obj.dossier.poste.nom
-#    _poste.short_description = "Poste"
-#
-#    def _implantation(self, obj):
-#        return obj.dossier.poste.implantation
-#    _poste.short_description = "Implantation"
-
-class DeviseAdmin(AUFMetadataAdminMixin, admin.ModelAdmin):
-    fieldsets = AUFMetadataAdminMixin.fieldsets + (
-        (None, {
-            'fields': ('code', 'nom', ),
-        }),
-    )
-
-
-class DossierAdmin(AUFMetadataAdminMixin, ProtectRegionMixin, admin.ModelAdmin, AjaxSelect):
-    alphabet_filter = 'employe__nom'
-    search_fields = ('employe__nom', 'employe__prenom', 'poste__nom', 'poste__nom_feminin')
-    list_display = (
-        '_id',
-        '_poste',
-        '_employe',
-        '_date_debut',
-        '_date_fin',
-        'date_modification',
-        'actif',
-    )
-    list_filter = (
-        'poste__implantation__region',
-        'poste__implantation',
-        'poste__type_poste',
-        'poste__type_poste__famille_emploi',
-        'rh_contrats__type_contrat',
-        'actif',
-    )
-    inlines = (DossierPieceInline, ContratInline,
-               RemunerationInline,
-               #EvenementInline,
-               DossierCommentaireInline,
-              )
-    fieldsets = AUFMetadataAdminMixin.fieldsets + (
-        (None, {
-            'fields': ('employe', 'poste', 'statut', 'organisme_bstg',)
-        }),
-        ('Recrutement', {
-            'fields': ('statut_residence', 'remplacement', 'remplacement_de', )
-        }),
-        ('Rémunération', {
-            'fields': ('classement', ('regime_travail', 'regime_travail_nb_heure_semaine'),)
-        }),
-        ('Occupation du Poste par cet Employe', {
-            'fields': (('date_debut', 'date_fin'), )
-        }),
-    )
-    form =  make_ajax_form(rh.Dossier, {
-        'employe' : 'employes',
-        'poste' : 'postes',
-        'remplacement_de' : 'dossiers',
-    })
-
-    def lookup_allowed(self, key, value):
-        if key in (
-            'employe__nom__istartswith',
-            'actif__exact',
-            'poste__implantation__region__id__exact',
-            'poste__implantation__id__exact',
-            'poste__type_poste__id__exact',
-            'poste__type_poste__famille_emploi__id__exact',
-            'rh_contrats__type_contrat__id__exact',
-            ):
-            return True
-
-    def _id(self, d):
-        link = u"""<a onclick="return showAddAnotherPopup(this);" href='%s'>%s</a> <a href="%s" title="Modifier le dossier"><img src="%simg/page_edit.png" /></a>""" % \
-            (reverse('dossier_apercu', args=(d.id,)),
-             d.id,
-             reverse('admin:rh_dossier_change', args=(d.id,)),
-             settings.MEDIA_URL,
-             )
-        return link
-    _id.allow_tags = True
-    _id.short_description = u'#'
-    _id.admin_order_field = 'id'
-    
-
-    def _actif(self, dossier):
-        if dossier.employe.actif:
-          html = """<img alt="True" src="%simg/admin/icon-yes.gif">"""
-        else:
-          html = """<img alt="False" src="%simg/admin/icon-no.gif">"""
-        return html % settings.ADMIN_MEDIA_PREFIX 
-    _actif.allow_tags = True
-    _actif.short_description = u'Employé actif'
-    _actif.admin_order_field = 'employe__actif'
-
-    def _date_debut(self, obj):
-        return obj.date_debut
-    _date_debut.short_description = u'Occupation début'
-    _date_debut.admin_order_field = 'date_debut'
-
-    def _date_fin(self, obj):
-        return obj.date_fin
-    _date_fin.short_description = u'Occupation fin'
-    _date_fin.admin_order_field = 'date_fin'
-
-    def _poste(self, dossier):
-        link = u"""<a onclick="return showAddAnotherPopup(this);" href='%s'>%s</a> <a href="%s" title="Modifier le poste"><img src="%simg/page_edit.png" /></a>""" % \
-                (reverse('poste_apercu', args=(dossier.poste.id,)),
-                 dossier.poste,
-                 reverse('admin:rh_poste_change', args=(dossier.poste.id,)),
-                 settings.MEDIA_URL,
-                 )
-        return link
-    _poste.allow_tags = True
-    _poste.short_description = u'Poste'
-    _poste.admin_order_field = 'poste__nom'
-
-    def _employe(self, obj):
-        employe = obj.employe
-        view_link = reverse('employe_apercu', args=(employe.id,))
-        edit_link = reverse('admin:rh_employe_change', args=(employe.id,))
-
-        if employe.actif == False:
-            style = "color: grey";
-            edit = ""
-        else:
-            style = ""
-            edit = u"""<a href="%s" title="Modifier l'employé"><img src="%simg/user_edit.png" /></a>""" % (edit_link, settings.MEDIA_URL,)
-        return u"""<a onclick="return showAddAnotherPopup(this);" href='%s' style="%s;">[%s] %s %s</a>%s
-                  """ % \
-        (view_link, style, employe.id, employe.nom.upper(), employe.prenom.title(), edit)
-    _employe.allow_tags = True
-    _employe.short_description = u"Employé ([code] NOM Prénom)"
-    _employe.admin_order_field = "employe__nom"
-   
-    def save_formset(self, request, form, formset, change):
-        instances = formset.save(commit=False)
-        for instance in instances:
-            if instance.__class__ == rh.DossierCommentaire:
-                instance.owner = request.user
-            instance.save()
-
-
-class DossierPieceAdmin(admin.ModelAdmin):
-    pass
-
-
-class DossierCommentaireAdmin(admin.ModelAdmin):
-    pass
-
-
-class EmployeAdmin(AUFMetadataAdminMixin, ProtectRegionMixin, admin.ModelAdmin):
-    alphabet_filter = 'nom'
-    DEFAULT_ALPHABET = u'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
-    search_fields = ('id', 'nom', 'prenom', 'nom_affichage', )
-    ordering = ('nom', )
-    form = EmployeAdminForm
-    list_display = ('_nom', '_dossiers', 'date_modification',  'user_modification', 'actif',)
-    list_filter = ('rh_dossiers__poste__implantation__region',  'rh_dossiers__poste__implantation', 'actif', )
-    inlines = (AyantDroitInline,
-               DossierROInline,
-               EmployePieceInline,
-               EmployeCommentaireInline)
-    fieldsets = AUFMetadataAdminMixin.fieldsets + (
-        ('Identification', {
-            'fields': (('nom', 'prenom'), ('nom_affichage', 'genre'), 'nationalite', 'date_naissance', )
-        }),
-        ('Informations personnelles', {
-            'fields': ('situation_famille', 'date_entree', )
-        }),
-        ('Coordonnées', {
-            'fields': (('tel_domicile', 'tel_cellulaire'), ('adresse', 'ville'), ('code_postal', 'province'), 'pays', )
-        }),
-        )
-
-    def _nom(self, obj):
-        view_link = reverse('employe_apercu', args=(obj.id,))
-        edit_link = reverse('admin:rh_employe_change', args=(obj.id,))
-        return u"""<a onclick="return showAddAnotherPopup(this);" href='%s'>[%s] %s %s</a>
-                  <a href="%s" title="Modifier l'employé"><img src="%simg/user_edit.png" /></a>""" % \
-        (view_link, obj.id, obj.nom.upper(), obj.prenom.title(), edit_link, settings.MEDIA_URL,)
-    _nom.allow_tags = True
-    _nom.short_description = u"Employé ([code] NOM Prénom)"
-    _nom.admin_order_field = "nom"
-
-    def _dossiers(self, obj):
-        l = []
-        for d in obj.rh_dossiers.all().order_by('-date_debut'):
-            style = ""
-            edit = u"""<a href="%s" title="Modifier le dossier"><img src="%simg/page_edit.png" /></a>""" % (reverse('admin:rh_dossier_change', args=(d.id,)), settings.MEDIA_URL,)
-            if d.date_fin is not None:
-                edit = ""
-                style = u"color: grey";
-            link = u"""<li><a style="%s;" onclick="return showAddAnotherPopup(this);" href='%s'>%s : %s</a>%s</li>""" % \
-                (style,
-                 reverse('dossier_apercu', args=(d.id,)),
-                 d.date_debut.year,
-                 d.poste,
-                 edit,
-                 )
-            l.append(link)
-        return "<ul>%s</ul>" % "\n".join(l)
-    _dossiers.allow_tags = True
-    _dossiers.short_description = u"Dossiers"
-
-    def queryset(self, request):
-        qs = super(EmployeAdmin, self).queryset(request) 
-        return qs.select_related(depth=1).order_by('nom')
-
-    def save_formset(self, request, form, formset, change):
-        instances = formset.save(commit=False)
-        for instance in instances:
-            if instance.__class__ == rh.EmployeCommentaire:
-                instance.owner = request.user
-            instance.save()
-
-
-
-class EmployeCommentaireAdmin(admin.ModelAdmin):
-    pass
-
-
-class EmployePieceAdmin(admin.ModelAdmin):
-    pass
-
-
-class EvenementAdmin(admin.ModelAdmin):
-    inlines = (EvenementRemunerationInline,)
-
-
-class EvenementRemunerationAdmin(admin.ModelAdmin):
-    pass
-
-
-class FamilleEmploiAdmin(AUFMetadataAdminMixin, admin.ModelAdmin):
-    inlines = (TypePosteInline,)
-    fieldsets = AUFMetadataAdminMixin.fieldsets + ( 
-        (None, {
-            'fields': ('nom', )
-        }),
-        )
-
-
-class OrganismeBstgAdmin(AUFMetadataAdminMixin, ProtectRegionMixin, admin.ModelAdmin):
-    search_fields = ('nom', )
-    list_display = ('nom', 'type', 'pays', )
-    inlines = (DossierROInline,)
-    fieldsets = AUFMetadataAdminMixin.fieldsets + ( 
-        (None, {
-            'fields': ('nom', 'type', 'pays', )
-        }),
-        )
-
-
-class PosteAdmin(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',
-        )
-    list_display = (
-        '_nom', 
-        '_occupe_par',
-        'implantation', 
-        'service', 
-        'date_debut', 
-        'date_fin',
-        'date_modification',
-        'user_modification',
-        'actif',
-        )
-    list_filter = ('service', 
-        'implantation__region', 
-        'implantation',
-        'type_poste',
-        'type_poste__famille_emploi',
-        'actif',
-        )
-    fieldsets = AUFMetadataAdminMixin.fieldsets + (
-        (None, {
-            'fields': (('nom', 'nom_feminin'), 'implantation', 'type_poste',
-                       'service', 'responsable')
-        }),
-        ('Contrat', {
-            'fields': (('regime_travail', 'regime_travail_nb_heure_semaine'), )
-        }),
-        ('Recrutement', {
-            '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', ),
-                        )
-        }),
-        ('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'))
-        }),
-        ('Justification', {
-            'fields': ('justification',)
-        }),
-        ('Autres Metadata', {
-            'fields': ('date_debut', 'date_fin')
-        }),
-    )
-
-    inlines = (PosteFinancementInline,
-               PostePieceInline,
-               DossierROInline,
-               PosteCommentaireInline, )
-
-
-    def _nom(self, poste):
-        link = u"""<a onclick="return showAddAnotherPopup(this);" href='%s'>%s</a> <a href="%s" title="Modifier le poste"><img src="%simg/page_edit.png" /></a>""" % \
-                (reverse('poste_apercu', args=(poste.id,)),
-                 poste.nom,
-                 reverse('admin:rh_poste_change', args=(poste.id,)),
-                 settings.MEDIA_URL,
-                 )
-        return link
-    _nom.allow_tags = True
-    _nom.short_description = u'Nom'
-    _nom.admin_order_field = 'nom'
-
-    def _occupe_par(self, obj):
-        """Formatte la méthode Poste.occupe_par() pour l'admin"""
-        output = "VACANT"
-        employes = obj.occupe_par()
-        if employes:
-            l = []
-            for e in employes:
-                link = "<a href='%s'>%s</a>" % \
-                    (reverse('admin:rh_employe_change', args=(e.id,)),
-                     e)
-                l.append(link)
-            output = "\n<br />".join(l)
-        return output
-    _occupe_par.allow_tags = True
-    _occupe_par.short_description = "Occupé par"   
-
-    def save_formset(self, request, form, formset, change):
-        instances = formset.save(commit=False)
-        for instance in instances:
-            if instance.__class__ == rh.PosteCommentaire:
-                instance.owner = request.user
-            instance.save()
-        formset.save_m2m()
-
-
-class PosteCommentaireAdmin(admin.ModelAdmin):
-    pass
-
-
-class PosteFinancementAdmin(admin.ModelAdmin):
-    pass
-
-
-class PostePieceAdmin(admin.ModelAdmin):
-    fk_name = 'poste'
-
-
-class RemunerationAdmin(admin.ModelAdmin):
-    pass
-
-
-class ResponsableImplantationAdmin(AUFMetadataAdminMixin, admin.ModelAdmin):
-    fieldsets = AUFMetadataAdminMixin.fieldsets + ( 
-        (None, {
-            'fields': ('employe', 'implantation', ),
-        }),
-        )
-    
-
-class ServiceAdmin(AUFMetadataAdminMixin, admin.ModelAdmin):
-    list_display = ('nom', 'actif', )
-    fieldsets = AUFMetadataAdminMixin.fieldsets + ( 
-        (None, {
-            'fields': ('nom', ),
-        }),
-        )
-
-class StatutAdmin(AUFMetadataAdminMixin, admin.ModelAdmin):
-    fieldsets = AUFMetadataAdminMixin.fieldsets + ( 
-        (None, {
-            'fields': ('code', 'nom', ),
-        }),
-        )
-
-class TauxChangeAdmin(admin.ModelAdmin):
-    list_display = ('taux', 'devise', 'annee', )
-    list_filter = ('devise', )
-    fieldsets = AUFMetadataAdminMixin.fieldsets + ( 
-        (None, {
-            'fields': ('taux', 'devise', 'annee', ),
-        }),
-        )
-
-class TypeContratAdmin(admin.ModelAdmin):
-    fieldsets = AUFMetadataAdminMixin.fieldsets + ( 
-        (None, {
-            'fields': ('nom', 'nom_long', ),
-        }),
-        )
-
-
-class TypePosteAdmin(AUFMetadataAdminMixin, admin.ModelAdmin):
-    search_fields = ('nom', 'nom_feminin', )
-    list_display = ('nom', 'famille_emploi', )
-    list_filter = ('famille_emploi', )
-    fieldsets = AUFMetadataAdminMixin.fieldsets + ( 
-        (None, {
-            'fields': ('nom', 'nom_feminin', 'is_responsable', 'famille_emploi',  )
-        }),
-        )
-
-
-class TypeRemunerationAdmin(AUFMetadataAdminMixin, admin.ModelAdmin):
-    list_display = ('nom', 'type_paiement', 'nature_remuneration', )
-    #inlines = (RemunerationROInline,) utilité?
-    fieldsets = AUFMetadataAdminMixin.fieldsets + ( 
-        (None, {
-            'fields': ('nom', 'type_paiement', 'nature_remuneration', )
-        }),
-        )
-
-
-class TypeRevalorisationAdmin(AUFMetadataAdminMixin, admin.ModelAdmin):
-    #inlines = (RemunerationROInline,) utilité?
-    fieldsets = AUFMetadataAdminMixin.fieldsets + ( 
-        (None, {
-            'fields': ('nom', )
-        }),
-        )
-
-
-class ValeurPointAdmin(AUFMetadataAdminMixin, admin.ModelAdmin):
-    list_display = ('_devise_code', '_devise_nom', 'annee', 'valeur', )
-    fieldsets = AUFMetadataAdminMixin.fieldsets + ( 
-        (None, {
-            'fields': ('valeur', 'devise', 'implantation', 'annee', )
-        }),
-        )
-
-    def _devise_code(self, obj):
-        return obj.devise.code
-    _devise_code.short_description = "Code de la devise"
-
-    def _devise_nom(self, obj):
-        return obj.devise.nom
-    _devise_nom.short_description = "Nom de la devise"
-
 
 def calc_remun(dossier):
         thisyear = datetime.date.today().year
@@ -728,3 +22,5 @@ def calc_remun(dossier):
             remun[n] = [sums[n], sums_euro[n]]
 
         return remun, remun_sum, remun_sum_euro
+
+