summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorÉtienne Loks <etienne.loks@peacefrogs.net>2013-04-05 00:33:07 +0200
committerÉtienne Loks <etienne.loks@peacefrogs.net>2013-04-05 00:33:07 +0200
commite51684c2adb656d3ef14e40e649e280a6c0bf1b8 (patch)
treea2c624b1ce76c6d57a8a156766e4863710d8ae19
parentc5e94062adefdd8cb0aeb730830921d5d546a86b (diff)
downloadIshtar-e51684c2adb656d3ef14e40e649e280a6c0bf1b8.tar.bz2
Ishtar-e51684c2adb656d3ef14e40e649e280a6c0bf1b8.zip
UI improvment for parcels management (refs #151)
-rw-r--r--archaeological_files/wizards.py8
-rw-r--r--archaeological_operations/forms.py12
-rw-r--r--archaeological_operations/wizards.py36
-rw-r--r--ishtar_common/widgets.py2
-rw-r--r--ishtar_common/wizards.py21
5 files changed, 62 insertions, 17 deletions
diff --git a/archaeological_files/wizards.py b/archaeological_files/wizards.py
index e2f6722ef..c475de47d 100644
--- a/archaeological_files/wizards.py
+++ b/archaeological_files/wizards.py
@@ -25,16 +25,18 @@ from django.template import RequestContext
from django.utils.translation import ugettext_lazy as _
from ishtar_common.wizards import Wizard, ClosingWizard
-from archaeological_operations.wizards import OperationAdministrativeActWizard,\
+from archaeological_operations.wizards import OperationWizard,\
+ OperationAdministrativeActWizard,\
AdministrativeActDeletionWizard
from ishtar_common.models import Town
from archaeological_operations.models import AdministrativeAct, Parcel, \
Operation
import models
-class FileWizard(Wizard):
+class FileWizard(OperationWizard):
model = models.File
object_parcel_type = 'associated_file'
+ parcel_step_key = 'parcels-'
def get_form(self, step=None, data=None, files=None):
"""
@@ -103,7 +105,7 @@ class FileWizard(Wizard):
continue
try:
dct['town'] = models.Town.objects.get(pk=int(dct['town']))
- except (ValueError, ObjectDoesNotExist):
+ except (ValueError, ObjectDoesNotExist, KeyError):
continue
dct['associated_file'], dct['operation'] = None, None
dct[self.object_parcel_type] = obj
diff --git a/archaeological_operations/forms.py b/archaeological_operations/forms.py
index 741dfb2b7..72834d8f0 100644
--- a/archaeological_operations/forms.py
+++ b/archaeological_operations/forms.py
@@ -59,13 +59,13 @@ class ParcelForm(forms.Form):
associated_models = {'parcel':models.Parcel, 'town':models.Town}
town = forms.ChoiceField(label=_("Town"), choices=(), required=False,
validators=[valid_id(models.Town)])
+ year = forms.IntegerField(label=_("Year"), required=False,
+ validators=[validators.MinValueValidator(1900),
+ validators.MaxValueValidator(2100)])
section = forms.CharField(label=_(u"Section"), required=False,
validators=[validators.MaxLengthValidator(4)])
parcel_number = forms.CharField(label=_(u"Parcel number"), required=False,
validators=[validators.MaxLengthValidator(6)])
- year = forms.IntegerField(label=_("Year"), required=False,
- validators=[validators.MinValueValidator(1900),
- validators.MaxValueValidator(2100)])
def __init__(self, *args, **kwargs):
towns = None
if 'data' in kwargs and 'TOWNS' in kwargs['data']:
@@ -85,9 +85,11 @@ class ParcelForm(forms.Form):
"""Check required fields"""
if any(self.errors):
return
- if not self.cleaned_data or DELETION_FIELD_NAME in self.cleaned_data \
- and self.cleaned_data[DELETION_FIELD_NAME]:
+ if not self.cleaned_data or (DELETION_FIELD_NAME in self.cleaned_data \
+ and self.cleaned_data[DELETION_FIELD_NAME]):
return
+ if not self.cleaned_data.get('parcel_number'):
+ return {}
for key in ('town', 'parcel_number', 'section'):
if not key in self.cleaned_data or not self.cleaned_data[key]:
raise forms.ValidationError(_(u"Town section and parcel number "
diff --git a/archaeological_operations/wizards.py b/archaeological_operations/wizards.py
index 2b13e3353..4205144e6 100644
--- a/archaeological_operations/wizards.py
+++ b/archaeological_operations/wizards.py
@@ -27,16 +27,19 @@ from django.utils.translation import ugettext_lazy as _
from ishtar_common.wizards import Wizard, ClosingWizard, DeletionWizard, \
SourceWizard
import models
+from forms import ParcelForm
class OperationWizard(Wizard):
model = models.Operation
object_parcel_type = 'operation'
+ parcel_step_key = 'parcelsgeneral-'
def get_template_names(self):
templates = super(OperationWizard, self).get_template_names()
current_step = self.steps.current
if current_step.startswith('towns-'):
- templates = ['ishtar/wizard/towns_wizard.html'] + templates
+ #templates = ['ishtar/wizard/towns_wizard.html'] + templates
+ pass
if current_step.startswith('parcels-') or \
current_step.startswith('parcelsgeneral-') :
templates = ['ishtar/wizard/parcels_wizard.html'] + templates
@@ -124,7 +127,7 @@ class OperationWizard(Wizard):
Show a specific warning if no archaelogical file is provided
"""
datas = super(OperationWizard, self).get_formated_datas(forms)
- # if the general town form is used the advertissement is pertinent
+ # if the general town form is used the advertissement is relevant
has_no_af = [form.prefix for form in forms
if form.prefix == 'townsgeneral-operation'] and True
if has_no_af:
@@ -133,6 +136,33 @@ class OperationWizard(Wizard):
+ datas
return datas
+ def get_form_initial(self, step, data=None):
+ initial = super(OperationWizard, self).get_form_initial(step)
+ self.form_initialized = False
+ if not step.startswith(self.parcel_step_key):
+ return initial
+ if initial:
+ default = initial[-1].copy()
+ if 'parcel_number' in default:
+ default.pop('parcel_number')
+ initial.append(default)
+ # necessary to get the appropriate form number
+ self.form_initialized = True
+ elif data:
+ numbers, keys = set(), set()
+ for k in data:
+ items = k.split('-')
+ try:
+ numbers.add(int(items[-2]))
+ except (ValueError, IndexError):
+ continue
+ keys.add(items[-1])
+ if max(numbers) - 1:
+ initial = [dict([(k, data[step+'-'+unicode(max(numbers)-1)+'-'+k])
+ for k in keys if k != 'parcel_number'])]
+ self.form_initialized = True
+ return initial
+
class OperationModificationWizard(OperationWizard):
modification = True
@@ -148,7 +178,7 @@ class OperationDeletionWizard(DeletionWizard):
class OperationSourceWizard(SourceWizard):
model = models.OperationSource
- def get_form_initial(self, step):
+ def get_form_initial(self, step, data=None):
initial = super(OperationSourceWizard, self).get_form_initial(step)
# put default index and operation_id field in the main source form
general_form_key = 'selec-' + self.url_name
diff --git a/ishtar_common/widgets.py b/ishtar_common/widgets.py
index 1fd0b6ac0..06d6f20f0 100644
--- a/ishtar_common/widgets.py
+++ b/ishtar_common/widgets.py
@@ -206,7 +206,7 @@ class JQueryJqGrid(forms.RadioSelect):
self.source_full = source_full
def render(self, name, value=None, attrs=None):
- t = loader.get_template('form_snippet.html')
+ t = loader.get_template('blocks/form_snippet.html')
rendered = t.render(Context({'form':self.form}))
rendered += u"\n</table>\n"\
u"<button id='search_%s' class='submit'>%s</button>" % (
diff --git a/ishtar_common/wizards.py b/ishtar_common/wizards.py
index 8b6e1a50d..e421c25dd 100644
--- a/ishtar_common/wizards.py
+++ b/ishtar_common/wizards.py
@@ -1,6 +1,6 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (C) 2010-2012 Étienne Loks <etienne.loks_AT_peacefrogsDOTnet>
+# Copyright (C) 2010-2013 Étienne Loks <etienne.loks_AT_peacefrogsDOTnet>
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
@@ -461,15 +461,26 @@ class Wizard(NamedUrlWizardView):
k = u'-'.join(items)
data[k] = data.pop(key)[0]
# get a form key
- base_key = form.form.base_fields.keys()[0]
- init = self.get_form_initial(step)
+ frm = form.form
+ if callable(frm):
+ frm = frm()
+ base_key = frm.base_fields.keys()[-1]
+ init = self.get_form_initial(step, data=data)
total_field = len([key for key in data.keys()
if base_key in key.split('-')
and data[key]])
- if init and not to_delete:
+ if init and not to_delete and (
+ not hasattr(self, 'form_initialized') or
+ not self.form_initialized):
total_field = max((total_field, len(init)))
data[step + u'-INITIAL_FORMS'] = unicode(total_field)
data[step + u'-TOTAL_FORMS'] = unicode(total_field + 1)
+ # update initialization
+ if request.POST and init and hasattr(self, 'form_initialized') \
+ and self.form_initialized:
+ for k in init[0]:
+ data[step + '-' + unicode(total_field) + '-' + k] = \
+ init[0][k]
data = data or None
form = super(Wizard, self).get_form(step, data, files)
return form
@@ -561,7 +572,7 @@ class Wizard(NamedUrlWizardView):
pass
return current_obj
- def get_form_initial(self, step):
+ def get_form_initial(self, step, data=None):
current_obj = self.get_current_object()
current_step = self.steps.current
request = self.request