merge branche dev
authorOlivier Larchevêque <olivier.larcheveque@auf.org>
Tue, 31 May 2011 13:03:57 +0000 (09:03 -0400)
committerOlivier Larchevêque <olivier.larcheveque@auf.org>
Tue, 31 May 2011 13:03:57 +0000 (09:03 -0400)
1  2 
buildout.cfg
project/budget/admin.py
project/budget/models.py
project/rh/admin.py
project/rh/models.py

diff --cc buildout.cfg
@@@ -36,14 -36,13 +36,18 @@@ south = 0.
  auf.django.skin = 0.15dev
  auf.django.auth = 0.5.2dev
  django-reversion = 1.3.3
- auf.django.workflow = 0.10dev
+ auf.django.workflow = 0.14dev
  django-ajax-selects = 1.1.4
+ #reportlab = 2.5
+ #html5lib = 0.90
+ #pyPDF = 1.13
+ #pisa = 3.0.33
  
 +#reportlab = 2.5
 +#html5lib = 0.90
 +#pyPDF = 1.13
 +#pisa = 3.0.33
 +
  [django] 
  recipe = auf.recipe.django
  wsgi=true 
@@@ -2,13 -2,14 +2,26 @@@
  
  from django.contrib import admin
  
++<<<<<<< HEAD
 +from rh.admin import (DossierAdmin, EvenementAdmin, EvenementRemunerationAdmin,
 +                      PosteAdmin, PosteFinancementAdmin, RemunerationAdmin)
 +from models import *
 +
++=======
+ from budget.models import *
+ from rh.lib import *
+ admin.site.register(Classement, ClassementAdmin)
++>>>>>>> dev
  admin.site.register(Dossier, DossierAdmin)
  admin.site.register(Evenement, EvenementAdmin)
  admin.site.register(EvenementRemuneration, EvenementRemunerationAdmin)
  admin.site.register(Poste, PosteAdmin)
++<<<<<<< HEAD
 +admin.site.register(PosteFinancement, PosteFinancementAdmin)
 +admin.site.register(Remuneration, RemunerationAdmin)
++=======
+ admin.site.register(Remuneration, RemunerationAdmin)
+ admin.site.register(ValeurPoint, ValeurPointAdmin)
+ admin.site.register(TauxChange, TauxChangeAdmin)
++>>>>>>> dev
@@@ -1,7 -1,9 +1,6 @@@
  # -=- encoding: utf-8 -=-
  
 -import inspect
 -
  from django.db import models
--
  from rh import models as rh
  
  
@@@ -18,30 -63,38 +60,60 @@@ class Simulation(models.Model)
                             not f in obj._meta.parents.values()])
          return globals()[obj.__class__.__name__](**initial)
  
 +    def initialize(self):
 +        """ Copie les données nécessaires à une simulation. """
 +        if (self.poste_set.all().count() > 0 or
 +          self.dossier_set.all().count() > 0):
 +            raise ValueError(u'Cette simulation a déjà été initialisée.')
 +
 +        postes = {}
 +        for rh_p in rh.Poste.objects.all():
 +            sim_p = self.copy_rh_model(rh_p)
 +            sim_p.save()
 +            postes[rh_p.id] = sim_p
 +
 +        dossiers = {}
 +        for rh_d in rh.Dossier.objects.all():
 +            sim_d = self.copy_rh_model(rh_d)
 +            if not sim_d.poste.id in postes:
 +                self.poste_set.all().delete()
 +                self.dossier_set.all().delete()
 +                raise ValueError(u'Données inconsistantes.')
 +            sim_d.poste = postes[sim_d.poste.id]
 +            sim_d.save()
 +            dossiers[rh_d.id] = sim_d
 +
+     def xlate_dossier(self, d):
+         if not d.poste.id in self.seen_models['poste']:
+             raise ValueError(u'Données inconsistantes.')
+         d.poste = self.seen_models['poste'][d.poste.id]
+         if not d.classement.id in self.seen_models['classement']:
+             raise ValueError(u'Données inconsistantes.')
+         d.classement = self.seen_models['classement'] [d.classement.id]
+     def xlate_evenement(self, e):
+         if not e.dossier.id in self.seen_models['dossier']:
+             raise ValueError(u'Données inconsistantes.')
+         e.dossier = self.seen_models['dossier'][e.dossier.id]
+     def xlate_remuneration(self, r):
+         if not r.dossier.id in self.seen_models['dossier']:
+             raise ValueError(u'Données inconsistantes.')
+         r.dossier = self.seen_models['dossier'] [r.dossier.id]
+     def xlate_evenementremuneration(self, er):
+         if not er.dossier.id in self.seen_models['dossier']:
+             raise ValueError(u'Données inconsistantes.')
+         er.dossier = self.seen_models['dossier'] [er.dossier.id]
+         if not er.evenement.id in self.seen_models['evenement']:
+             raise ValueError(u'Données inconsistantes.')
+         er.evenement = self.seen_models['evenement'] [er.evenement.id]
+ class Classement(rh.Classement_):
+     __doc__ = rh.Classement_.__doc__
+     simulation = models.ForeignKey(Simulation)
 -
  class Dossier(rh.Dossier_):
      __doc__ = rh.Dossier_.__doc__
      simulation = models.ForeignKey(Simulation)
@@@ -1,9 -1,10 +1,11 @@@
  # -*- encoding: utf-8 -*-
  
- from models import *
  from django.contrib import admin
+ from rh.models import *
+ from rh.lib import *
  
 +
  class CommentaireAdmin(admin.ModelAdmin):
      pass
  
@@@ -187,17 -187,26 +187,30 @@@ class Poste_(Metadata)
      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_):
+     __doc__ = Poste_.__doc__
  
  
 +class Poste(Poste_):
 +    __doc__ = Poste_.__doc__
 +
 +
  POSTE_FINANCEMENT_CHOICES = (
      ('A', 'A - Frais de personnel'),
      ('B', 'B - Projet(s)-Titre(s)'),
@@@ -444,16 -480,21 +483,26 @@@ class Dossier_(Metadata)
      
      class Meta:
          abstract = True
-         ordering = ['poste__nom', 'employe__nom_affichage']
+         ordering = ['employe__nom_affichage', 'employe__nom', 'poste__nom']
+         verbose_name = "Dossier"
+         verbose_name_plural = "Dossiers"
          
      def __unicode__(self):
-         return u'%s - %s' % (self.poste.nom, self.employe)
+         poste = self.poste.nom
+         if self.employe.genre == 'F':
+             poste = self.poste.nom_feminin            
+         return u'%s - %s' % (self.employe, poste)
+ class Dossier(Dossier_):
+     __doc__ = Dossier_.__doc__
  
 +
 +class Dossier(Dossier_):
 +    __doc__ = Dossier_.__doc__
 +
 +
  class DossierPiece(models.Model):
      """Documents relatifs au Dossier (à l'occupation de ce poste par employé).
      Ex.: Lettre de motivation.
@@@ -604,15 -661,21 +669,28 @@@ class EvenementRemuneration_(Remunerati
      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_):
+     __doc__ = EvenementRemuneration_.__doc__
  
 +    class Meta:
 +        abstract = True
 +
 +
 +class EvenementRemuneration(EvenementRemuneration_):
 +    __doc__ = EvenementRemuneration_.__doc__
 +
  
  ### RÉFÉRENCES RH 
  
@@@ -795,38 -901,19 +916,33 @@@ 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:
 +        ordering = ['annee', 'implantation__nom']
+         abstract = True
+         ordering = ['annee']
+         verbose_name = "Valeur du point"
+         verbose_name_plural = "Valeurs du point"
  
++    # TODO : cette fonction n'était pas présente dans la branche dev, utilité?
 +    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
 +
      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)
-         
-     class Meta:
-         ordering = ['valeur']
+         return u'%s %s (%s)' % (self.valeur, self.devise, self.annee)
+ class ValeurPoint(ValeurPoint_):
+     __doc__ = ValeurPoint_.__doc__
  
  class Devise(Metadata):
      """Devise monétaire.