fix prepopulation DAE from RH
authorOlivier Larchevêque <olivier.larcheveque@auf.org>
Tue, 3 Jul 2012 20:47:13 +0000 (16:47 -0400)
committerOlivier Larchevêque <olivier.larcheveque@auf.org>
Tue, 3 Jul 2012 20:47:13 +0000 (16:47 -0400)
project/dae/forms.py
project/dae/templates/dae/poste.html
project/dae/views.py

index 6ddd45b..e7f9408 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
@@ -21,6 +22,70 @@ from project.dae.workflow import \
         grp_drh, POSTE_ETATS_BOUTONS, POSTE_ETAT_FINALISE
 
 
+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):
     # TRAITEMENT NORMAL
     employe = get_employe_from_user(request.user)
@@ -119,10 +184,21 @@ def label_poste_display(poste):
     )
     return label
 
-PostePieceForm = inlineformset_factory(dae.Poste, dae.PostePiece)
+PostePieceForm = inlineformset_factory(
+        dae.Poste,
+        dae.PostePiece,
+        #formset=BaseInlineFormSetWithInitial,
+        )
+
+
 DossierPieceForm = inlineformset_factory(dae.Dossier, dae.DossierPiece)
+
+
 FinancementForm = inlineformset_factory(
-    dae.Poste, dae.PosteFinancement, extra=2
+    dae.Poste,
+    dae.PosteFinancement,
+    formset=BaseInlineFormSetWithInitial,
+    extra=2
 )
 
 
@@ -150,8 +226,14 @@ class PosteComparaisonForm(forms.ModelForm):
         model = dae.PosteComparaison
         exclude = ('poste',)
 
-PosteComparaisonFormSet = modelformset_factory(
-    dae.PosteComparaison, extra=3, max_num=3, form=PosteComparaisonForm
+PosteComparaisonFormSet = inlineformset_factory(
+    dae.Poste,
+    dae.PosteComparaison,
+    extra=3,
+    max_num=3,
+    form=PosteComparaisonForm,
+    #formset=BaseModelFormSetWithInitial,
+    formset=BaseInlineFormSetWithInitial,
 )
 
 
index 1bf7167..52e3d06 100644 (file)
@@ -320,6 +320,10 @@ Demande d'autorisation d'engagement
     <fieldset>
     <h2>Pièces jointes</h2>
     <p class="info">Compléter uniquement lors de la création d'un poste</p>
+    <ul>{% for piece in poste_rh.rh_pieces.all %}
+        <li>Ce <a target="_blank" href="{{ piece.fichier.url }}">{{ piece.nom }}</a> RH sera automatiquement
+    ajouté.</li>
+    {% endfor %}</ul>
     {% include "dae/pieces.html" %}
     </fieldset>
 
index e5e456c..d3346c9 100644 (file)
@@ -125,12 +125,18 @@ def poste(request, key=None):
 
         if source == 'dae':
             poste = get_object_or_404(dae.Poste, pk=id)
+            poste_rh = None
         elif source == 'rh':
-            p = get_object_or_404(rh.Poste, pk=id)
+            poste_rh = get_object_or_404(rh.Poste, pk=id)
             # Initialisation avec les valeurs du poste de rh_v1
-            poste = dae.Poste(id_rh=p, nom=p.type_poste.nom)
-            for field in ('implantation', 'type_poste', ):
-                setattr(poste, field, getattr(p, field))
+            poste = dae.Poste(id_rh=poste_rh)
+            exclus = ('id', 'supprime', 'date_creation',
+                    'user_creation', 'date_modification',
+                    'user_modification', )
+            fields = [f for f in poste_rh._meta.fields if f.name not in exclus]
+            for field in fields:
+                setattr(poste, field.name, getattr(poste_rh, field.name))
+
         if poste.id_rh_id:
             data['poste'] = 'rh-' + str(poste.id_rh_id)
         else:
@@ -139,24 +145,41 @@ def poste(request, key=None):
         # Nouveau poste
         vars['new'] = True
 
+    # prépopuler pour la modification de poste
+
+    if poste_rh is None: # poste RH n'est pas un modele
+        qs_financements = poste.dae_financements.all()
+        qs_comparaisons = poste.dae_comparaisons_internes.all()
+    else:
+        qs_financements = poste_rh.rh_financements.all()
+        qs_comparaisons = poste_rh.rh_comparaisons_internes.all()
+
+    financements = [{'type': f.type, 'pourcentage': f.pourcentage,
+        'commentaire': f.commentaire} for f in qs_financements]
+    comparaisons = [{'implantation': c.implantation, 'nom': c.nom,
+        'montant': c.montant, 'devise': c.devise} for c in qs_comparaisons]
+
+
     if request.POST:
         data.update(dict(request.POST.items()))
         form = PosteForm(data, instance=poste, request=request)
-        financementForm = FinancementForm(request.POST, instance=poste)
+        financementForm = FinancementForm(request.POST, instance=poste,
+                )
         piecesForm = PostePieceForm(
-            request.POST, request.FILES, instance=poste
+            request.POST, request.FILES, instance=poste,
         )
         if isinstance(poste, dae.Poste):
             comparaisons_formset = PosteComparaisonFormSet(
                 request.POST,
                 queryset=poste.dae_comparaisons_internes.ma_region_ou_service(
-                    request.user
+                    request.user,
                 )
             )
         else:
             comparaisons_formset = PosteComparaisonFormSet(
                 request.POST,
-                queryset=dae.PosteComparaison.objects.none()
+                initial=comparaisons,
+                queryset=dae.PosteComparaison.objects.none(),
             )
         if form.is_valid() and piecesForm.is_valid() and \
            financementForm.is_valid() and comparaisons_formset.is_valid():
@@ -172,6 +195,11 @@ def poste(request, key=None):
                 comparaison.poste = poste
                 comparaison.save()
 
+            # dans le cas d'une modification de poste de RH, on recopie les PJ
+            if poste_rh is not None:
+                for piece in poste_rh.rh_pieces.all():
+                    dae.PostePiece(poste=poste, nom=piece.nom,
+                            fichier=piece.fichier).save()
             messages.add_message(
                 request, messages.SUCCESS,
                 "Le poste %s a été sauvegardé." % poste
@@ -191,23 +219,30 @@ def poste(request, key=None):
         # 'initial' évite la validation prémature lors d'une copie de poste de
         # rh_v1 vers dae.
         form = PosteForm(initial=data, instance=poste, request=request)
-        piecesForm = PostePieceForm(instance=poste)
-        financementForm = FinancementForm(instance=poste)
+
+        piecesForm = PostePieceForm(
+                #initial=pieces,
+                instance=poste)
+        financementForm = FinancementForm(initial=financements, instance=poste)
+        
         if isinstance(poste, dae.Poste):
             comparaisons_formset = PosteComparaisonFormSet(
+                initial=comparaisons,
                 queryset=poste.dae_comparaisons_internes.ma_region_ou_service(
                     request.user
                 )
             )
         else:
             comparaisons_formset = PosteComparaisonFormSet(
+                initial=comparaisons,
                 queryset=dae.PosteComparaison.objects.none()
             )
 
     vars.update(dict(
         form=form, poste=poste, poste_key=key, piecesForm=piecesForm,
         financementForm=financementForm,
-        comparaisons_formset=comparaisons_formset
+        comparaisons_formset=comparaisons_formset,
+        poste_rh=poste_rh,
     ))
 
     return render(request, 'dae/poste.html', vars)