Merge branch 'reversion'
[auf_rh_dae.git] / project / dae / forms.py
index bd7a334..0de2b4b 100644 (file)
@@ -3,6 +3,7 @@
 import datetime
 
 from django import forms
+from django.forms.models import BaseInlineFormSet
 from django.contrib.admin import widgets as admin_widgets
 from django.db.models import Q, Max
 from django.forms.models import inlineformset_factory, modelformset_factory
@@ -17,8 +18,71 @@ from project.groups import \
         get_employe_from_user, is_user_dans_services_centraux
 
 from project.dae import models as dae
-from project.dae.workflow import \
-        grp_drh, POSTE_ETATS_BOUTONS, POSTE_ETAT_FINALISE
+from project.dae.workflow import grp_drh, POSTE_ETATS_BOUTONS
+
+
+class BaseInlineFormSetWithInitial(BaseInlineFormSet):
+    """
+    Cette classe permet de fournir l'option initial aux inlineformsets.
+    Elle devient désuette en django 1.4.
+    """
+    def __init__(self, data=None, files=None, instance=None,
+                 save_as_new=False, prefix=None, queryset=None, **kwargs):
+
+        self.initial_extra = kwargs.pop('initial', None)
+
+        from django.db.models.fields.related import RelatedObject
+        if instance is None:
+            self.instance = self.fk.rel.to()
+        else:
+            self.instance = instance
+        self.save_as_new = save_as_new
+        # is there a better way to get the object descriptor?
+        self.rel_name = RelatedObject(self.fk.rel.to, self.model, self.fk).get_accessor_name()
+        if queryset is None:
+            queryset = self.model._default_manager
+        qs = queryset.filter(**{self.fk.name: self.instance})
+        super(BaseInlineFormSetWithInitial, self).__init__(data, files, prefix=prefix,
+                                                queryset=qs, **kwargs)
+
+    def _construct_form(self, i, **kwargs):
+        if self.is_bound and i < self.initial_form_count():
+            # Import goes here instead of module-level because importing
+            # django.db has side effects.
+            from django.db import connections
+            pk_key = "%s-%s" % (self.add_prefix(i), self.model._meta.pk.name)
+            pk = self.data[pk_key]
+            pk_field = self.model._meta.pk
+            pk = pk_field.get_db_prep_lookup('exact', pk,
+                connection=connections[self.get_queryset().db])
+            if isinstance(pk, list):
+                pk = pk[0]
+            kwargs['instance'] = self._existing_object(pk)
+        if i < self.initial_form_count() and not kwargs.get('instance'):
+            kwargs['instance'] = self.get_queryset()[i]
+        if i >= self.initial_form_count() and self.initial_extra:
+            # Set initial values for extra forms
+            try:
+                kwargs['initial'] = self.initial_extra[i-self.initial_form_count()]
+            except IndexError:
+                pass
+
+        defaults = {'auto_id': self.auto_id, 'prefix': self.add_prefix(i)}
+        if self.is_bound:
+            defaults['data'] = self.data
+            defaults['files'] = self.files
+        if self.initial:
+            try:
+                defaults['initial'] = self.initial[i]
+            except IndexError:
+                pass
+        # Allow extra forms to be empty.
+        if i >= self.initial_form_count():
+            defaults['empty_permitted'] = True
+        defaults.update(kwargs)
+        form = self.form(**defaults)
+        self.add_fields(form, i)
+        return form
 
 
 def _implantation_choices(obj, request):
@@ -113,16 +177,30 @@ def label_poste_display(poste):
     annee = ""
     if poste.date_debut:
         annee = poste.date_debut.year
+
+    nom = poste.nom
+    
     label = u"%s %s - %s [%s]" % (
-        annee, poste.type_poste, poste.type_poste.categorie_emploi.nom,
-        poste.id
+        annee, nom, poste.type_poste.categorie_emploi.nom, poste.id
     )
     return label
 
-PostePieceForm = inlineformset_factory(dae.Poste, dae.PostePiece)
+
+PostePieceFormSet = inlineformset_factory(dae.Poste, dae.PostePiece,)
 DossierPieceForm = inlineformset_factory(dae.Dossier, dae.DossierPiece)
-FinancementForm = inlineformset_factory(
-    dae.Poste, dae.PosteFinancement, extra=2
+
+# Ce formset est utilisé dans le cas de la création de poste prépopulé avec les
+# données de RH
+FinancementFormSetInitial = inlineformset_factory(
+    dae.Poste,
+    dae.PosteFinancement,
+    formset=BaseInlineFormSetWithInitial,
+    extra=2
+)
+FinancementFormSet = inlineformset_factory(
+    dae.Poste,
+    dae.PosteFinancement,
+    extra=2
 )
 
 
@@ -150,8 +228,22 @@ class PosteComparaisonForm(forms.ModelForm):
         model = dae.PosteComparaison
         exclude = ('poste',)
 
-PosteComparaisonFormSet = modelformset_factory(
-    dae.PosteComparaison, extra=3, max_num=3, form=PosteComparaisonForm
+# Ce formset est utilisé dans le cas de la création de poste prépopulé avec les
+# données de RH
+PosteComparaisonFormSetInitial = inlineformset_factory(
+    dae.Poste,
+    dae.PosteComparaison,
+    extra=3,
+    max_num=3,
+    form=PosteComparaisonForm,
+    formset=BaseInlineFormSetWithInitial,
+)
+PosteComparaisonFormSet = inlineformset_factory(
+    dae.Poste,
+    dae.PosteComparaison,
+    extra=3,
+    max_num=3,
+    form=PosteComparaisonForm,
 )
 
 
@@ -254,6 +346,7 @@ class PosteForm(forms.ModelForm):
         request = kwargs.pop('request')
         super(PosteForm, self).__init__(*args, **kwargs)
         self.fields['poste'].choices = self._poste_choices(request)
+        
         self.fields['implantation'].choices = \
                 _implantation_choices(self, request)
 
@@ -265,23 +358,14 @@ class PosteForm(forms.ModelForm):
 
     def _poste_choices(self, request):
         """ Menu déroulant pour les postes.
-
-        Constitué des postes de dae et des postes de rh_v1 qui n'ont pas
-        d'équivalent dans dae.
-
+        Constitué des postes de RH
         """
-        copies = dae.Poste.objects \
-                .ma_region_ou_service(request.user) \
-                .exclude(id_rh__isnull=True) \
-                .filter(etat=POSTE_ETAT_FINALISE)
-        id_copies = [p.id_rh_id for p in copies.all()]
-        rhv1 = rh.Poste.objects.ma_region_ou_service(request.user) \
-                .exclude(id__in=id_copies)
-        # Optimisation de la requête
-        rhv1 = rhv1.select_related(depth=1)
+        postes_rh = rh.Poste.objects.ma_region_ou_service(request.user).all()
+        postes_rh = postes_rh.select_related(depth=1)
 
         return [('', 'Nouveau poste')] + \
-               sorted([('rh-%s' % p.id, label_poste_display(p)) for p in rhv1],
+               sorted([('rh-%s' % p.id, label_poste_display(p)) for p in
+                   postes_rh],
                       key=lambda t: t[1])
 
     def clean(self):