diff options
author | Étienne Loks <etienne.loks@proxience.com> | 2015-07-16 22:28:38 +0200 |
---|---|---|
committer | Étienne Loks <etienne.loks@proxience.com> | 2015-07-16 22:28:38 +0200 |
commit | 7e2f7de59cb0000b132f2e8767bc496431d1935f (patch) | |
tree | bcc5a05539d6cc7375a5dc9e8a3aea414c8ae525 /archaeological_operations/forms.py | |
parent | 45c418d867ec7a0fda582686d2f33ba8a694a930 (diff) | |
parent | d058c10237b024961426e9f5344df8d214b29f51 (diff) | |
download | Ishtar-7e2f7de59cb0000b132f2e8767bc496431d1935f.tar.bz2 Ishtar-7e2f7de59cb0000b132f2e8767bc496431d1935f.zip |
Merge branch 'stable'
Conflicts:
ishtar_common/locale/fr/LC_MESSAGES/django.po
Diffstat (limited to 'archaeological_operations/forms.py')
-rw-r--r-- | archaeological_operations/forms.py | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/archaeological_operations/forms.py b/archaeological_operations/forms.py index d0e4be0d3..0bc759b9c 100644 --- a/archaeological_operations/forms.py +++ b/archaeological_operations/forms.py @@ -36,6 +36,8 @@ from django.utils.safestring import mark_safe from ishtar_common.models import valid_id, PersonType, Person, Town, \ DocumentTemplate, Organization, OrganizationType +from ishtar_common.wizards import MultiValueDict + FILES_AVAILABLE = 'archaeological_files' in settings.INSTALLED_APPS if FILES_AVAILABLE: @@ -120,6 +122,8 @@ class ParcelFormSet(FormSet): SELECTION_FORM = ParcelSelectionForm def __init__(self, *args, **kwargs): + if 'data' in kwargs and kwargs['data']: + kwargs['data'] = self.rearrange_parcels(kwargs['data']) super(FormSet, self).__init__(*args, **kwargs) self.extra_form = None if self.forms[0].__class__.__name__ == 'ParcelForm': @@ -133,6 +137,68 @@ class ParcelFormSet(FormSet): if town_choices: self.selection_form.fields['_town'].choices = town_choices + def rearrange_parcels(self, parcels): + """ + Simple database ordering is not possible as a numeric ordering of parcel + number have to be made but with parcel number not strictly numeric + Very complicated for a simple thing :( + """ + prefix, ordering_keys, values = '', {}, {} + new_values = MultiValueDict() + for k in parcels: + value = parcels[k] + splitted = k.split('-') + if len(splitted) < 4: + new_values[k] = value + continue + if not prefix: + prefix = "-".join(splitted[:-2]) + field = splitted[-1] + number = splitted[-2] + + if number not in values: + values[number] = {} + values[number][field] = value + + if number not in ordering_keys: + ordering_keys[number] = ['', '', '', ''] + if field == 'town': + ordering_keys[number][0] = value + if field == 'year': + ordering_keys[number][1] = value + if field == 'section': + ordering_keys[number][2] = value + if field == 'parcel_number': + ordering_keys[number][3] = value + + reverse_ordering_keys = {} + for number in ordering_keys: + reverse_ordering_keys[tuple(ordering_keys[number])] = number + + for new_idx, keys in enumerate(sorted(reverse_ordering_keys.keys(), + key=self._parcel_sorting)): + number = reverse_ordering_keys[keys] + prefx = '%s-%d-' % (prefix, new_idx) + for field in values[number]: + new_key = prefx + field + new_values[new_key] = values[number][field] + return new_values + + def _parcel_sorting(self, key): + town, year, section, parcel = key + # deal with parcel_number such as '34p' and convert to int + parcel_number = '' + for p in parcel: + try: + parcel_number += str(int(p)) + except ValueError: + break + if not parcel_number: + parcel_number = 0 + else: + parcel_number = int(parcel_number) + return (town, year, section, parcel_number) + def as_table(self): # add dynamic widget render = self.selection_form.as_table() |