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
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)
)
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
)
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,
)
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:
# 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():
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
# '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)