summaryrefslogtreecommitdiff
path: root/archaeological_operations/forms.py
diff options
context:
space:
mode:
authorÉtienne Loks <etienne.loks@proxience.com>2015-07-21 18:36:21 +0200
committerÉtienne Loks <etienne.loks@proxience.com>2015-07-21 18:36:21 +0200
commit83cda4b1d3d7b2c26f93b5005944f124ad6e7bf5 (patch)
tree580466f9a251f0744aaca72553b4003d79f4a116 /archaeological_operations/forms.py
parentc55c4fad9972df04273e9a98f9dd4918998e4e70 (diff)
downloadIshtar-83cda4b1d3d7b2c26f93b5005944f124ad6e7bf5.tar.bz2
Ishtar-83cda4b1d3d7b2c26f93b5005944f124ad6e7bf5.zip
Improve parcel result displaying
Diffstat (limited to 'archaeological_operations/forms.py')
-rw-r--r--archaeological_operations/forms.py73
1 files changed, 73 insertions, 0 deletions
diff --git a/archaeological_operations/forms.py b/archaeological_operations/forms.py
index 0bc759b9c..691b0c90c 100644
--- a/archaeological_operations/forms.py
+++ b/archaeological_operations/forms.py
@@ -21,6 +21,7 @@
Operations forms definitions
"""
import datetime
+from itertools import groupby
from django import forms
from django.conf import settings
@@ -109,6 +110,78 @@ class ParcelForm(forms.Form):
u"fields are required."))
return self.cleaned_data
+ @classmethod
+ def get_formated_datas(cls, cleaned_datas):
+ result, current, deleted = [], [], []
+ towns = {}
+ for data in cleaned_datas:
+ if not data:
+ continue
+ town = data.get('town') or ''
+ if town:
+ if town in towns:
+ town = towns[town]
+ else:
+ try:
+ towns[town] = unicode(Town.objects.get(pk=town))
+ town = towns[town]
+ except (Town.DoesNotExist, ValueError):
+ town = ''
+ parcel_number = data.get('parcel_number') or ''
+ c_number = 0
+ if parcel_number:
+ parcel_nb = list(reversed(list(parcel_number)))
+ c_number = ''
+ while parcel_nb:
+ c = parcel_nb.pop()
+ try:
+ c_number += str(int(c))
+ except ValueError:
+ break
+ if c_number:
+ c_number = int(c_number)
+ else:
+ c_number = 0
+ values = [town, data.get('year') or '', data.get('section') or '',
+ c_number, data.get('parcel_number') or '']
+ if data.get('DELETE'):
+ deleted.append(values)
+ else:
+ current.append(values)
+ if current:
+ result.append((_("Current parcels"), cls._format_parcels(current)))
+ if deleted:
+ result.append((_("Deleted parcels"), cls._format_parcels(deleted)))
+ return result
+
+ @classmethod
+ def _format_parcels(cls, parcels):
+ sortkeyfn = lambda s:(s[0], s[1], s[2])
+ parcels = sorted(parcels, key=sortkeyfn)
+ grouped = []
+ for keys, parcel_grp in groupby(parcels, key=sortkeyfn):
+ keys = list(keys)
+ keys.append([gp[-1] for gp in parcel_grp])
+ grouped.append(keys)
+ res = ''
+ c_town, c_section, c_year = '', '', ''
+ for idx, parcel in enumerate(grouped):
+ town, year, section, parcel_numbers = parcel
+ if c_town != town:
+ c_town = town
+ c_section, c_year = '', ''
+ if idx:
+ res += " ; "
+ res += town + u' : '
+ if c_section:
+ res += u" / "
+ c_section = section
+ res += section + u' '
+ res += u", ".join(parcel_numbers)
+ if year:
+ res += " (%s)" % unicode(year)
+ return res
+
class ParcelSelectionForm(forms.Form):
_town = forms.ChoiceField(label=_("Town"), choices=(), required=False,
validators=[valid_id(models.Town)])