+def remun_formset_factory_factory(
+ read_only=False,
+ parent_model=dae.Dossier,
+ model=dae.Remuneration,
+ exclude_archived=False):
+ """
+ Don't we love factory factories?
+ """
+
+ null_choice = ('', '-' * 10)
+ extras = 2 if not read_only else 0
+ can_delete = False if read_only else True
+ form_class = ReadOnlyRemunForm if read_only else FlexibleRemunForm
+
+ choice_override_extra_q = {}
+
+ if exclude_archived:
+ choice_override_extra_q.update({
+ 'archive': False
+ })
+
+ return remun_formset_factory(
+ parent_model,
+ model,
+ form=form_class,
+ extra=extras,
+ can_delete=can_delete,
+ read_only=read_only,
+ groups = rh.NATURE_REMUNERATION_CHOICES,
+ choice_overrides = {
+ u'Traitement': {
+ 'type': [null_choice] + list(
+ rh.TypeRemuneration.objects.filter(
+ nature_remuneration=u'Traitement',
+ **choice_override_extra_q).values_list(
+ 'id', 'nom')
+ )
+ },
+ u'Indemnité': {
+ 'type': [null_choice] + list(
+ rh.TypeRemuneration.objects.filter(
+ nature_remuneration=u'Indemnité',
+ **choice_override_extra_q).values_list(
+ 'id', 'nom')
+ )
+ },
+ u'Charges': {
+ 'type': [null_choice] + list(
+ rh.TypeRemuneration.objects.filter(
+ nature_remuneration=u'Charges',
+ **choice_override_extra_q).values_list(
+ 'id', 'nom')
+ )
+ },
+ u'Accessoire': {
+ 'type': [null_choice] + list(
+ rh.TypeRemuneration.objects.filter(
+ nature_remuneration=u'Accessoire',
+ **choice_override_extra_q).values_list(
+ 'id', 'nom')
+ )
+ },
+ u'RAS': {
+ 'type': [null_choice] + list(
+ rh.TypeRemuneration.objects.filter(
+ nature_remuneration=u'RAS',
+ **choice_override_extra_q).values_list(
+ 'id', 'nom')
+ )
+ },
+ },
+ )
+
+
+RemunForm = remun_formset_factory_factory(
+ read_only=False,
+ parent_model=dae.Dossier,
+ model=dae.Remuneration,
+ exclude_archived=True,
+)
+
+ReadOnlyRemunFormSet = remun_formset_factory_factory(
+ read_only=True,
+ parent_model=dae.Dossier,
+ model=dae.Remuneration,
+ )
+
+PosteCompReadOnlyRemunFormSet = remun_formset_factory_factory(
+ read_only=True,
+ parent_model=dae.PosteComparaison,
+ model=dae.PosteComparaisonRemuneration,