rh.models, rh.admin
authordavin baragiotta <davin.baragiotta@u-db.(none)>
Fri, 27 May 2011 02:27:17 +0000 (22:27 -0400)
committerDavin BARAGIOTTA <davin.baragiotta@auf.org>
Fri, 27 May 2011 02:27:17 +0000 (22:27 -0400)
project/rh/admin.py
project/rh/models.py

index 2d3f8c1..570432c 100644 (file)
@@ -131,20 +131,23 @@ class DeviseAdmin(admin.ModelAdmin):
 class TypeContratAdmin(admin.ModelAdmin):
     pass
 
+class ResponsableImplantationAdmin(admin.ModelAdmin):
+    pass
+
 
-admin.site.register(Commentaire, CommentaireAdmin)
+#admin.site.register(Commentaire, CommentaireAdmin)
 admin.site.register(Poste, PosteAdmin)
-admin.site.register(PosteFinancement, PosteFinancementAdmin)
-admin.site.register(PostePiece, PostePieceAdmin)
-admin.site.register(PosteCommentaire, PosteCommentaireAdmin)
+#admin.site.register(PosteFinancement, PosteFinancementAdmin)
+#admin.site.register(PostePiece, PostePieceAdmin)
+#admin.site.register(PosteCommentaire, PosteCommentaireAdmin)
 admin.site.register(Employe, EmployeAdmin)
-admin.site.register(EmployePiece, EmployePieceAdmin)
-admin.site.register(EmployeCommentaire, EmployeCommentaireAdmin)
+#admin.site.register(EmployePiece, EmployePieceAdmin)
+#admin.site.register(EmployeCommentaire, EmployeCommentaireAdmin)
 admin.site.register(AyantDroit, AyantDroitAdmin)
-admin.site.register(AyantDroitCommentaire, AyantDroitCommentaireAdmin)
+#admin.site.register(AyantDroitCommentaire, AyantDroitCommentaireAdmin)
 admin.site.register(Dossier, DossierAdmin)
-admin.site.register(DossierPiece, DossierPieceAdmin)
-admin.site.register(DossierCommentaire, DossierCommentaireAdmin)
+#admin.site.register(DossierPiece, DossierPieceAdmin)
+#admin.site.register(DossierCommentaire, DossierCommentaireAdmin)
 admin.site.register(Remuneration, RemunerationAdmin)
 admin.site.register(Contrat, ContratAdmin)
 admin.site.register(Evenement, EvenementAdmin)
@@ -161,3 +164,4 @@ admin.site.register(TauxChange, TauxChangeAdmin)
 admin.site.register(ValeurPoint, ValeurPointAdmin)
 admin.site.register(Devise, DeviseAdmin)
 admin.site.register(TypeContrat, TypeContratAdmin)
+admin.site.register(ResponsableImplantation, ResponsableImplantationAdmin)
index 1a390ac..dce2dee 100644 (file)
@@ -10,7 +10,7 @@ import datamaster_modeles.models as ref
 
 
 # Constantes
-HELP_TEXT_DATE = u"format: aaaa-mm-jj"
+HELP_TEXT_DATE = "format: aaaa-mm-jj"
 REGIME_TRAVAIL_DEFAULT = 100.00
 REGIME_TRAVAIL_NB_HEURE_SEMAINE_DEFAULT = 35.00
 
@@ -76,9 +76,9 @@ class Poste_(Metadata):
     """
     # Identification
     nom = models.CharField(max_length=255, 
-                            verbose_name=u"Titre du poste", )
+                            verbose_name="Titre du poste", )
     nom_feminin = models.CharField(max_length=255,
-                            verbose_name=u"Titre du poste (au féminin)",
+                            verbose_name="Titre du poste (au féminin)",
                             null=True)
     implantation = models.ForeignKey(ref.Implantation, 
                             db_column='implantation', related_name='+')
@@ -87,33 +87,33 @@ class Poste_(Metadata):
                             null=True)
     service = models.ForeignKey('Service', db_column='service', 
                             related_name='+',
-                            verbose_name=u"Direction/Service/Pôle support",
+                            verbose_name="Direction/Service/Pôle support",
                             default=1)  # default = Rectorat
     responsable = models.ForeignKey('Poste', db_column='responsable', 
                             related_name='+',
-                            verbose_name=u"Poste du responsable",
+                            verbose_name="Poste du responsable",
                             default=149)    # default = Recteur
                                 
     # Contrat
     regime_travail = models.DecimalField(max_digits=12, decimal_places=2,
                             default=REGIME_TRAVAIL_DEFAULT, 
-                            verbose_name=u"Temps de travail", 
-                            help_text=u"% du temps complet")
+                            verbose_name="Temps de travail", 
+                            help_text="% du temps complet")
     regime_travail_nb_heure_semaine = models.DecimalField(max_digits=12,
                             decimal_places=2,
                             default=REGIME_TRAVAIL_NB_HEURE_SEMAINE_DEFAULT,
-                            verbose_name=u"Nb. heures par semaine")
+                            verbose_name="Nb. heures par semaine")
 
     # Recrutement
-    local = models.BooleanField(verbose_name=u"Local", default=True, 
+    local = models.BooleanField(verbose_name="Local", default=True, 
                             blank=True)
-    expatrie = models.BooleanField(verbose_name=u"Expatrié", default=False, 
+    expatrie = models.BooleanField(verbose_name="Expatrié", default=False, 
                             blank=True)
     mise_a_disposition = models.BooleanField(
-                            verbose_name=u"Mise à disposition",
+                            verbose_name="Mise à disposition",
                             default=False)
     appel = models.CharField(max_length=10, 
-                            verbose_name=u"Appel à candidature",
+                            verbose_name="Appel à candidature",
                             choices=POSTE_APPEL_CHOICES,
                             default='interne')
 
@@ -178,20 +178,29 @@ class Poste_(Metadata):
 
     # Autres Metadata
     date_validation = models.DateTimeField(null=True, blank=True)   # de dae
-    date_debut = models.DateField(verbose_name=u"Date de début",
+    date_debut = models.DateField(verbose_name="Date de début",
                             help_text=HELP_TEXT_DATE)
-    date_fin = models.DateField(verbose_name=u"Date de fin",
+    date_fin = models.DateField(verbose_name="Date de fin",
                             help_text=HELP_TEXT_DATE,
                             null=True, blank=True)
 
     class Meta:
         abstract = True
         ordering = ['implantation__nom', 'nom']
+        verbose_name = "Poste"
+        verbose_name_plural = "Postes"
 
     def __unicode__(self):
-        # TODO : gérer si poste est vacant ou non dans affichage
-        # TODO : gérer le nom_feminin (autre méthode appelée par __unicode__ ?)
-        return u'%s - %s [%s]' % (self.implantation, self.nom, self.id)
+        representation = u'%s - %s [%s]' % (self.implantation, self.nom, 
+                            self.id)
+        if self.is_vacant():
+            representation = representation + u' (vacant)'
+        return representation
+        
+    def is_vacant(self):
+        # TODO : si existe un dossier actif pour ce poste, return False
+        # self.dossier_set.all() fonctionne pas
+        return False
 
 
 class Poste(Poste_):
@@ -213,9 +222,9 @@ class PosteFinancement_(models.Model):
                             related_name='%(app_label)s_financements')
     type = models.CharField(max_length=1, choices=POSTE_FINANCEMENT_CHOICES)
     pourcentage = models.DecimalField(max_digits=12, decimal_places=2,
-            help_text=u"ex.: 33.33 % (décimale avec point)")
+            help_text="ex.: 33.33 % (décimale avec point)")
     commentaire = models.TextField(
-            help_text=u"Spécifiez la source de financement.")
+            help_text="Spécifiez la source de financement.")
 
     class Meta:
         abstract = True
@@ -233,10 +242,10 @@ class PostePiece(models.Model):
     """Documents relatifs au Poste.
     Ex.: Description de poste
     """
-    poste = models.ForeignKey("Poste", db_column='poste', 
+    poste = models.ForeignKey('Poste', db_column='poste', 
                             related_name='pieces')
-    nom = models.CharField(verbose_name=u"Nom", max_length=255)
-    fichier = models.FileField(verbose_name=u"Fichier", 
+    nom = models.CharField(verbose_name="Nom", max_length=255)
+    fichier = models.FileField(verbose_name="Fichier", 
                             upload_to=poste_piece_dispatch, 
                             storage=storage_prive)
 
@@ -247,7 +256,7 @@ class PostePiece(models.Model):
         return u'%s' % (self.nom)
 
 class PosteCommentaire(Commentaire):
-    poste = models.ForeignKey("Poste", db_column='poste', related_name='+')
+    poste = models.ForeignKey('Poste', db_column='poste', related_name='+')
 
 
 ### EMPLOYÉ/PERSONNE
@@ -271,29 +280,35 @@ class Employe(Metadata):
     """
     # Identification
     nom = models.CharField(max_length=255)
-    prenom = models.CharField(max_length=255, verbose_name=u"Prénom")
-    # TODO : nom_affichage doit être obligatoire, pas nom et prenom
+    prenom = models.CharField(max_length=255, verbose_name="Prénom")
     nom_affichage = models.CharField(max_length=255, 
-                            verbose_name=u"Nom d'affichage",
+                            verbose_name="Nom d'affichage",
                             null=True, blank=True)
     nationalite = models.ForeignKey(ref.Pays, to_field='code', 
                             db_column='nationalite',
-                            related_name='employes_nationalite')
+                            related_name='employes_nationalite',
+                            verbose_name="Nationalité")
     date_naissance = models.DateField(help_text=HELP_TEXT_DATE,
+                            verbose_name="Date de naissance",
                             null=True, blank=True)
     genre = models.CharField(max_length=1, choices=GENRE_CHOICES)
     
     # Infos personnelles
     situation_famille = models.CharField(max_length=1, 
                             choices=SITUATION_CHOICES,
+                            verbose_name="Situation familiale",
                             null=True, blank=True)
-    date_entree = models.DateField(verbose_name=u"Date d'entrée à l'AUF",
+    date_entree = models.DateField(verbose_name="Date d'entrée à l'AUF",
                             help_text=HELP_TEXT_DATE, 
                             null=True, blank=True)
     
     # Coordonnées
-    tel_domicile = models.CharField(max_length=255, null=True, blank=True)
-    tel_cellulaire = models.CharField(max_length=255, null=True, blank=True)
+    tel_domicile = models.CharField(max_length=255, 
+                            verbose_name="Tél. domicile",
+                            null=True, blank=True)
+    tel_cellulaire = models.CharField(max_length=255, 
+                            verbose_name="Tél. cellulaire",
+                            null=True, blank=True)
     adresse = models.CharField(max_length=255, null=True, blank=True)
     ville = models.CharField(max_length=255, null=True, blank=True)
     province = models.CharField(max_length=255, null=True, blank=True)
@@ -304,22 +319,26 @@ class Employe(Metadata):
 
     class Meta:
         ordering = ['nom_affichage','nom','prenom']
+        verbose_name = "Employé"
+        verbose_name_plural = "Employés"
         
     def __unicode__(self):
-        # TODO : gérer nom d'affichage
+        return u'%s' % (self.get_nom())
+        
+    def get_nom(self):
         nom_affichage = self.nom_affichage
         if not nom_affichage:
             nom_affichage = u'%s %s' % (self.nom.upper(), self.prenom)
-        return u'%s' % (nom_affichage)
+        return nom_affichage
 
 class EmployePiece(models.Model):
     """Documents relatifs à un employé.
     Ex.: CV...
     """
-    employe = models.ForeignKey("Employe", db_column='employe', 
+    employe = models.ForeignKey('Employe', db_column='employe', 
                             related_name='+')
-    nom = models.CharField(verbose_name=u"Nom", max_length=255)
-    fichier = models.FileField(verbose_name=u"Fichier", 
+    nom = models.CharField(verbose_name="Nom", max_length=255)
+    fichier = models.FileField(verbose_name="Fichier", 
                             upload_to=dossier_piece_dispatch, 
                             storage=storage_prive)
 
@@ -330,7 +349,7 @@ class EmployePiece(models.Model):
         return u'%s' % (self.nom)
 
 class EmployeCommentaire(Commentaire):
-    employe = models.ForeignKey("Employe", db_column='employe',
+    employe = models.ForeignKey('Employe', db_column='employe',
                             related_name='+')
 
 
@@ -346,33 +365,45 @@ class AyantDroit(Metadata):
     """
     # Identification
     nom = models.CharField(max_length=255)
-    prenom = models.CharField(max_length=255)
-    # TODO : nom_affichage doit être obligatoire, pas nom et prenom
+    prenom = models.CharField(max_length=255,
+                            verbose_name="Prénom",)
     nom_affichage = models.CharField(max_length=255, 
-                            verbose_name=u"Nom d'affichage",
+                            verbose_name="Nom d'affichage",
                             null=True, blank=True)
     nationalite = models.ForeignKey(ref.Pays, to_field='code', 
                             db_column='nationalite',
-                            related_name='ayantdroits_nationalite')
+                            related_name='ayantdroits_nationalite',
+                            verbose_name="Nationalité")
     date_naissance = models.DateField(help_text=HELP_TEXT_DATE,
+                            verbose_name="Date de naissance",
                             null=True, blank=True)
     genre = models.CharField(max_length=1, choices=GENRE_CHOICES)
     
     # Relation
     employe = models.ForeignKey('Employe', db_column='employe', 
-                            related_name='ayantdroits')
+                            related_name='ayantdroits',
+                            verbose_name="Employé")
     lien_parente = models.CharField(max_length=10, 
                             choices=LIEN_PARENTE_CHOICES,
+                            verbose_name="Lien de parenté",
                             null=True, blank=True)
 
     class Meta:
         ordering = ['nom_affichage']
+        verbose_name = "Ayant droit"
+        verbose_name_plural = "Ayants droit"
+        
     def __unicode__(self):
-        # TODO : gérer nom d'affichage
-        return u'%s %s' % (self.prenom, self.nom.upper())
+        return u'%s' % (self.get_nom())
+        
+    def get_nom(self):
+        nom_affichage = self.nom_affichage
+        if not nom_affichage:
+            nom_affichage = u'%s %s' % (self.nom.upper(), self.prenom)
+        return nom_affichage
 
 class AyantDroitCommentaire(Commentaire):
-    ayant_droit = models.ForeignKey("AyantDroit", db_column='ayant_droit',
+    ayant_droit = models.ForeignKey('AyantDroit', db_column='ayant_droit',
                             related_name='+')
 
 
@@ -401,15 +432,16 @@ class Dossier_(Metadata):
     """
     # Identification
     employe = models.ForeignKey('Employe', db_column='employe', 
-                            related_name='+')
+                            related_name='+',
+                            verbose_name="Employé")
     poste = models.ForeignKey('Poste', db_column='poste', 
                             related_name='+', editable=False)
     statut = models.ForeignKey('Statut', related_name='+', default=3)
     organisme_bstg = models.ForeignKey('OrganismeBstg', 
                             db_column='organisme_bstg',
                             related_name='+',
-                            verbose_name=u"Organisme", 
-                            help_text=u"Si détaché (DET) ou \
+                            verbose_name="Organisme", 
+                            help_text="Si détaché (DET) ou \
                                     mis à disposition (MAD), \
                                     préciser l'organisme.",
                             null=True, blank=True)
@@ -417,7 +449,7 @@ class Dossier_(Metadata):
     # Recrutement
     remplacement = models.BooleanField(default=False)
     statut_residence = models.CharField(max_length=10, default='local', 
-                            verbose_name=u"Statut",
+                            verbose_name="Statut",
                             choices=STATUT_RESIDENCE_CHOICES)
    
     # Rémunération
@@ -427,18 +459,18 @@ class Dossier_(Metadata):
     regime_travail = models.DecimalField(max_digits=12, 
                             decimal_places=2,
                             default=REGIME_TRAVAIL_DEFAULT,
-                            verbose_name=u"Régime de travail",
-                            help_text=u"% du temps complet")
+                            verbose_name="Régime de travail",
+                            help_text="% du temps complet")
     regime_travail_nb_heure_semaine = models.DecimalField(max_digits=12,
                             decimal_places=2, 
                             default=REGIME_TRAVAIL_NB_HEURE_SEMAINE_DEFAULT,
-                            verbose_name=u"Nb. heures par semaine")
+                            verbose_name="Nb. heures par semaine")
 
     # Occupation du Poste par cet Employe (anciennement "mandat")
-    date_debut = models.DateField(verbose_name=u"Date de début d'occupation \
+    date_debut = models.DateField(verbose_name="Date de début d'occupation \
                             de poste",
                             help_text=HELP_TEXT_DATE)
-    date_fin = models.DateField(verbose_name=u"Date de fin d'occupation \
+    date_fin = models.DateField(verbose_name="Date de fin d'occupation \
                             de poste",
                             help_text=HELP_TEXT_DATE,
                             null=True, blank=True)
@@ -449,9 +481,14 @@ class Dossier_(Metadata):
     class Meta:
         abstract = True
         ordering = ['employe__nom_affichage', 'employe__nom', 'poste__nom']
+        verbose_name = "Dossier"
+        verbose_name_plural = "Dossiers"
         
     def __unicode__(self):
-        return u'%s - %s' % (self.employe, self.poste.nom)
+        poste = self.poste.nom
+        if self.employe.genre == 'F':
+            poste = self.poste.nom_feminin            
+        return u'%s - %s' % (self.employe, poste)
 
 
 class Dossier(Dossier_):
@@ -462,10 +499,10 @@ class DossierPiece(models.Model):
     """Documents relatifs au Dossier (à l'occupation de ce poste par employé).
     Ex.: Lettre de motivation.
     """
-    dossier = models.ForeignKey("Dossier", db_column='dossier', 
+    dossier = models.ForeignKey('Dossier', db_column='dossier', 
                             related_name='+')
-    nom = models.CharField(verbose_name=u"Nom", max_length=255)
-    fichier = models.FileField(verbose_name=u"Fichier", 
+    nom = models.CharField(verbose_name="Nom", max_length=255)
+    fichier = models.FileField(verbose_name="Fichier", 
                             upload_to=dossier_piece_dispatch, 
                             storage=storage_prive)
 
@@ -476,7 +513,7 @@ class DossierPiece(models.Model):
         return u'%s' % (self.nom)
 
 class DossierCommentaire(Commentaire):
-    dossier = models.ForeignKey("Dossier", db_column='dossier', 
+    dossier = models.ForeignKey('Dossier', db_column='dossier', 
                             related_name='+')
 
 
@@ -487,10 +524,12 @@ class RemunerationMixin(Metadata):
     dossier = models.ForeignKey('Dossier', db_column='dossier',
                         related_name='%(app_label)s_%(class)s_remunerations')
     type = models.ForeignKey('TypeRemuneration', db_column='type', 
-                            related_name='+')
+                            related_name='+',
+                            verbose_name="Type de rémunération")
     type_revalorisation = models.ForeignKey('TypeRevalorisation', 
                             db_column='type_revalorisation', 
                             related_name='+',
+                            verbose_name="Type de revalorisation",
                             null=True, blank=True)
     montant = models.FloatField(null=True, blank=True,
                             default=0)
@@ -501,9 +540,11 @@ class RemunerationMixin(Metadata):
     # commentaire = precision
     commentaire = models.CharField(max_length=255, null=True, blank=True)
     # date_debut = anciennement date_effectif
-    date_debut = models.DateField(help_text=HELP_TEXT_DATE, 
+    date_debut = models.DateField(help_text=HELP_TEXT_DATE,
+                            verbose_name="Date de début",
                             null=True, blank=True)
     date_fin = models.DateField(help_text=HELP_TEXT_DATE,
+                            verbose_name="Date de fin",
                             null=True, blank=True)
     
     class Meta: 
@@ -540,6 +581,8 @@ class Remuneration_(RemunerationMixin):
 
     class Meta:
         abstract = True
+        verbose_name = "Rémunération"
+        verbose_name_plural = "Rémunérations"
 
 
 class Remuneration(Remuneration_):
@@ -556,16 +599,21 @@ class Contrat(Metadata):
     dossier = models.ForeignKey('Dossier', db_column='dossier', 
                             related_name='+')
     type_contrat = models.ForeignKey('TypeContrat', db_column='type_contrat', 
-                            related_name='+')
-    date_debut = models.DateField(help_text=HELP_TEXT_DATE)
+                            related_name='+',
+                            verbose_name="Type de contrat")
+    date_debut = models.DateField(help_text=HELP_TEXT_DATE,
+                            verbose_name="Date de début")
     date_fin = models.DateField(help_text=HELP_TEXT_DATE,
+                            verbose_name="Date de fin",
                             null=True, blank=True)
 
     class Meta:
         ordering = ['dossier__employe__nom_affichage']
+        verbose_name = "Contrat"
+        verbose_name_plural = "Contrats"
         
     def __unicode__(self):
-        return u'%s - %s' % (self.dossier.employe.nom_affichage, self.id)
+        return u'%s - %s' % (self.dossier, self.id)
         
 # TODO? class ContratPiece(models.Model):
     
@@ -584,16 +632,20 @@ class Evenement_(Metadata):
     conserver le Dossier intact afin d'éviter une re-saisie des données lors
     du retour à la normale.
     """
-    dossier = models.ForeignKey("Dossier", db_column='dossier', 
+    dossier = models.ForeignKey('Dossier', db_column='dossier', 
                             related_name='+')
     nom = models.CharField(max_length=255)
-    date_debut = models.DateField(help_text=HELP_TEXT_DATE)
-    date_fin = models.DateField(help_text=HELP_TEXT_DATE, 
+    date_debut = models.DateField(help_text=HELP_TEXT_DATE,
+                            verbose_name="Date de début")
+    date_fin = models.DateField(help_text=HELP_TEXT_DATE,
+                            verbose_name="Date de fin",
                             null=True, blank=True)
 
     class Meta:
         abstract = True
         ordering = ['nom']
+        verbose_name = "Évènement"
+        verbose_name_plural = "Évènements"
                             
     def __unicode__(self):
         return u'%s' % (self.nom)
@@ -609,10 +661,16 @@ class EvenementRemuneration_(RemunerationMixin):
     de l'Evenement.
     """
     evenement = models.ForeignKey("Evenement", db_column='evenement',
-                            related_name='+')
+                            related_name='+',
+                            verbose_name="Évènement")
+    # TODO : le champ dossier hérité de Remuneration doit être dérivé
+    # de l'Evenement associé
 
     class Meta:
         abstract = True
+        ordering = ['evenement', 'type__nom', '-date_fin']
+        verbose_name = "Évènement - rémunération"
+        verbose_name_plural = "Évènements - rémunérations"
 
 
 class EvenementRemuneration(EvenementRemuneration_):
@@ -627,6 +685,11 @@ class FamilleEmploi(Metadata):
     """
     nom = models.CharField(max_length=255)
     
+    class Meta:
+        ordering = ['nom']
+        verbose_name = "Famille d'emploi"
+        verbose_name_plural = "Familles d'emploi"
+    
     def __unicode__(self):
         return u'%s' % (self.nom)
 
@@ -634,18 +697,22 @@ class TypePoste(Metadata):
     """Catégorie de Poste.
     """
     nom = models.CharField(max_length=255)
-    nom_feminin = models.CharField(max_length=255)
+    nom_feminin = models.CharField(max_length=255,
+                            verbose_name="Nom féminin")
     
-    is_responsable = models.BooleanField(default=False)
+    is_responsable = models.BooleanField(default=False,
+                            verbose_name="Poste de responsabilité")
     famille_emploi = models.ForeignKey('FamilleEmploi', 
                             db_column='famille_emploi',
-                            related_name='+')
+                            related_name='+',
+                            verbose_name="Famille d'emploi")
 
     class Meta:
         ordering = ['nom']
+        verbose_name = "Type de poste"
+        verbose_name_plural = "Types de poste"
         
     def __unicode__(self):
-        # TODO : gérer nom féminin
         return u'%s' % (self.nom)
 
 
@@ -667,9 +734,16 @@ class TypeRemuneration(Metadata):
     """
     nom = models.CharField(max_length=255)
     type_paiement = models.CharField(max_length=30, 
-                            choices=TYPE_PAIEMENT_CHOICES)
+                            choices=TYPE_PAIEMENT_CHOICES,
+                            verbose_name="Type de paiement")
     nature_remuneration = models.CharField(max_length=30, 
-                            choices=NATURE_REMUNERATION_CHOICES)
+                            choices=NATURE_REMUNERATION_CHOICES,
+                            verbose_name="Nature de la rémunération")
+                            
+    class Meta:
+        ordering = ['nom']
+        verbose_name = "Type de rémunération"
+        verbose_name_plural = "Types de rémunération"
 
     def __unicode__(self):
         return u'%s' % (self.nom)
@@ -679,6 +753,11 @@ class TypeRevalorisation(Metadata):
     (Actuellement utilisé dans aucun traitement informatique.)
     """
     nom = models.CharField(max_length=255)
+    
+    class Meta:
+        ordering = ['nom']
+        verbose_name = "Type de revalorisation"
+        verbose_name_plural = "Types de revalorisation"
 
     def __unicode__(self):
         return u'%s' % (self.nom)
@@ -690,6 +769,8 @@ class Service(Metadata):
         
     class Meta:
         ordering = ['nom']
+        verbose_name = "Service"
+        verbose_name_plural = "Services"
 
     def __unicode__(self):
         return u'%s' % (self.nom)
@@ -715,9 +796,11 @@ class OrganismeBstg(Metadata):
 
     class Meta:
         ordering = ['type', 'nom']
+        verbose_name = "Organisme BSTG"
+        verbose_name_plural = "Organismes BSTG"
 
     def __unicode__(self):
-        return u'%s (%s)' % (self.nom, self.type)
+        return u'%s (%s)' % (self.nom, self.get_type_display())
 
 class Statut(Metadata):
     """Statut de l'Employe dans le cadre d'un Dossier particulier.
@@ -728,6 +811,8 @@ class Statut(Metadata):
 
     class Meta:
         ordering = ['code']
+        verbose_name = "Statut d'employé"
+        verbose_name_plural = "Statuts d'employé"
         
     def __unicode__(self):
         return u'%s : %s' % (self.code, self.nom)
@@ -755,9 +840,9 @@ class Classement_(Metadata):
     """
     # Identification
     type = models.CharField(max_length=10, choices=TYPE_CLASSEMENT_CHOICES)
-    echelon = models.IntegerField()
-    degre = models.IntegerField()
-    coefficient = models.FloatField(default=0)
+    echelon = models.IntegerField(verbose_name="Échelon")
+    degre = models.IntegerField(verbose_name="Degré")
+    coefficient = models.FloatField(default=0, verbose_name="Coéfficient")
     # Méta
     # annee # au lieu de date_debut et date_fin
     commentaire = models.TextField(null=True, blank=True)
@@ -765,6 +850,8 @@ class Classement_(Metadata):
     class Meta:
         abstract = True
         ordering = ['type','echelon','degre','coefficient']
+        verbose_name = "Classement"
+        verbose_name_plural = "Classements"
 
     def __unicode__(self):
         return u'%s.%s.%s (%s)' % (self.type, self.echelon, self.degre,
@@ -779,17 +866,19 @@ class TauxChange_(Metadata):
     pour chaque année budgétaire.
     """
     # Identification
-    devise = models.ForeignKey('Devise', to_field='code', db_column='devise',
+    devise = models.ForeignKey('Devise', db_column='devise',
                             related_name='+')
-    annee = models.IntegerField()
-    taux = models.FloatField()
+    annee = models.IntegerField(verbose_name="Année")
+    taux = models.FloatField(verbose_name="Taux vers l'euro")
 
     class Meta:
         abstract = True
-        ordering = ['annee', 'devise__code']
+        ordering = ['-annee', 'devise__code']
+        verbose_name = "Taux de change"
+        verbose_name_plural = "Taux de change"
     
     def __unicode__(self):
-        return u'%s : %s €' % (self.devise.code, self.taux)
+        return u'%s : %s € (%s)' % (self.devise, self.taux, self.annee)
 
 
 class TauxChange(TauxChange_):
@@ -799,7 +888,7 @@ class TauxChange(TauxChange_):
 class ValeurPoint_(Metadata):
     """Utile pour connaître, pour un Dossier, le salaire de base théorique lié 
     au classement dans la grille. La ValeurPoint s'obtient par l'implantation 
-    du POste de ce Dossier : dossier.poste.implantation (pseudo code).
+    du Poste de ce Dossier : dossier.poste.implantation (pseudo code).
 
     salaire de base = coefficient * valeur du point de l'Implantation du Poste
     """
@@ -812,36 +901,14 @@ class ValeurPoint_(Metadata):
     # Méta
     annee = models.IntegerField()
 
-    # Stockage de tous les taux de change 
-    # pour optimiser la recherche de la devise associée
-    annee_courante = datetime.datetime.now().year
-    tauxchange = TauxChange.objects.select_related('devise')    \
-                            .filter(annee=annee_courante)
-
     class Meta:
         abstract = True
-        ordering = ['valeur']
-
-    def get_tauxchange_courant(self):
-        """
-        Recherche le taux courant associé à la valeur d'un point.
-        Tous les taux de l'année courante sont chargés, pour optimiser un
-        affichage en liste. (On pourrait probablement améliorer le manager pour
-        lui greffer le taux courant sous forme de JOIN)
-        """
-        for tauxchange in self.tauxchange:
-            if tauxchange.implantation_id == self.implantation_id:
-                return tauxchange
-        return None
+        ordering = ['annee']
+        verbose_name = "Valeur du point"
+        verbose_name_plural = "Valeurs du point"
 
     def __unicode__(self):
-        tx = self.get_tauxchange_courant()
-        if tx:
-            devise_code = tx.devise.code
-        else:
-            devise_code = "??"
-        return u'%s %s (%s-%s)' % (self.valeur, devise_code, 
-                            self.implantation_id, self.annee)
+        return u'%s %s (%s)' % (self.valeur, self.devise, self.annee)
 
 
 class ValeurPoint(ValeurPoint_):
@@ -856,6 +923,8 @@ class Devise(Metadata):
 
     class Meta:
         ordering = ['code']
+        verbose_name = "Devise"
+        verbose_name_plural = "Devises"
         
     def __unicode__(self):
         return u'%s - %s' % (self.code, self.nom)
@@ -866,6 +935,11 @@ class TypeContrat(Metadata):
     nom = models.CharField(max_length=255)
     nom_long = models.CharField(max_length=255)
 
+    class Meta:
+        ordering = ['nom']
+        verbose_name = "Type de contrat"
+        verbose_name_plural = "Types de contrat"
+
     def __unicode__(self):
         return u'%s' % (self.nom)
         
@@ -888,3 +962,5 @@ class ResponsableImplantation(Metadata):
         
     class Meta:
         ordering = ['implantation__nom']
+        verbose_name = "Responsable d'implantation"
+        verbose_name_plural = "Responsables d'implantation"