Changement de titre de "natures" de types de rémunérations, permettre de définir...
[auf_rh_dae.git] / project / dae / forms.py
index 5d31886..916f3ac 100644 (file)
@@ -1,6 +1,7 @@
 # -*- encoding: utf-8 -*-
 
 import datetime
+from ordereddict import OrderedDict
 from django import forms
 from django.core.urlresolvers import reverse
 from django.forms.models import BaseInlineFormSet
@@ -280,26 +281,67 @@ class FlexibleRemunForm(forms.ModelForm):
         else:
             return devise
 
+    def has_changed(self):
+        """
+        Modification de has_changed pour qu'il ignore les montant a 0
+        et les 'types'.
+        """
+
+        changed_data = self.changed_data
+
+        # Type is set in hidden fields, it shouldn't be changed by the
+        # user; ignore when checking if data has changed.
+        if 'type' in changed_data:
+            changed_data.pop(changed_data.index('type'))
+
+        # Montant is set to 0 in javascript, ifnore 'montant' data if
+        # its value is 0.
+
+        # Generer le key tel qu'identifié dans self.data:
+        montant_key = '-'.join((self.prefix, 'montant'))
+
+        if ('montant' in changed_data and
+            self.data.get(montant_key, '0') == '0'):
+            changed_data.pop(changed_data.index('montant'))
+        
+        return bool(changed_data)
+
 
 class GroupedInlineFormset(BaseInlineFormSet):
 
-    def set_groups(self, group_accessor):
+    def set_groups(self, group_accessor, group_order=[]):
         """
         group_accessor: A function that will get the key and name from
         each form.
+        group_order: list the group keys here in a list and
+        GroupedInlineFormset.groups will be ordered (ordereddict) by
+        the key sequence provided here. Any missing key from the
+        sequence will 
         """
 
         # Build group list.
-        self.groups = {}
+        self.groups = OrderedDict()
+        temp_groups = {}
         # self.groups_and_forms = []
         for form in self.forms:
             group_key, group_name = group_accessor(form)
-            if not self.groups.has_key(group_key):
-                self.groups[group_key] = {
+            if not temp_groups.has_key(group_key):
+                temp_groups[group_key] = {
                     'name': group_name,
+                    'key': group_key,
                     'forms': [],
                     }
-            self.groups[group_key]['forms'].append(form)
+            temp_groups[group_key]['forms'].append(form)
+
+        for order_key in group_order:
+            if temp_groups.has_key(order_key):
+                self.groups[order_key] = temp_groups.pop(order_key)
+
+        for key in temp_groups:
+            self.groups[key] = temp_groups[key]
+
+        del temp_groups
+            
         self.group_list = self.groups.values()
 
 
@@ -313,13 +355,8 @@ def remun_formset_factory(parent_model,
                           can_order=False,
                           can_delete=True,
                           max_num=None,
-                          formfield_callback=None):
-    """
-    Returns an ``InlineFormSet`` for the given kwargs.
-
-    You must provide ``fk_name`` if ``model`` has more than one ``ForeignKey``
-    to ``parent_model``.
-    """
+                          formfield_callback=None,
+                          group_order=None):
     trs = rh.TypeRemuneration.objects.all()
     extra = max_num = trs.count()
     fk = _get_foreign_key(parent_model, model, fk_name=fk_name)
@@ -356,7 +393,7 @@ def remun_formset_factory(parent_model,
                 }
 
         # Set form grouping.
-        inst.set_groups(grouper)
+        inst.set_groups(grouper, group_order)
 
     FormSet.__init__ = __init__
 
@@ -364,7 +401,15 @@ def remun_formset_factory(parent_model,
 
 
 RemunForm = remun_formset_factory(
-    dae.Dossier, dae.Remuneration, form=FlexibleRemunForm
+    dae.Dossier,
+    dae.Remuneration,
+    form=FlexibleRemunForm,
+    group_order = [
+        u'Traitement',
+        u'Indemnité',
+        u'Charges',
+        u'Accessoire',
+        ]
     )