summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorÉtienne Loks <etienne.loks@peacefrogs.net>2011-01-31 21:28:02 +0100
committerÉtienne Loks <etienne.loks@peacefrogs.net>2011-01-31 21:28:02 +0100
commit3aa079f4d19771dbb7e02bcd33927d4c8bfe6179 (patch)
treefa4bdd92fb48644dd2565d2c8651029f638a545d
parent69ced5d239c6bb4c05a83440ccd6f85c7ddc0b8e (diff)
downloadIshtar-3aa079f4d19771dbb7e02bcd33927d4c8bfe6179.tar.bz2
Ishtar-3aa079f4d19771dbb7e02bcd33927d4c8bfe6179.zip
Link parcels to operations (closes #153)
-rw-r--r--ishtar/furnitures/forms.py91
-rw-r--r--ishtar/furnitures/models.py2
2 files changed, 81 insertions, 12 deletions
diff --git a/ishtar/furnitures/forms.py b/ishtar/furnitures/forms.py
index abf76d781..db440081c 100644
--- a/ishtar/furnitures/forms.py
+++ b/ishtar/furnitures/forms.py
@@ -289,7 +289,7 @@ class Wizard(NamedUrlSessionFormWizard):
return super(Wizard, self).process_post_request(request, storage, *args,
**kwargs)
@classmethod
- def session_has_key(cls, request, storage, form_key, key=None):
+ def session_has_key(cls, request, storage, form_key, key=None, multi=None):
"""
Check if the session has value of a specific form and (if provided)
of a key
@@ -299,18 +299,28 @@ class Wizard(NamedUrlSessionFormWizard):
and form_key in request.session[storage.prefix]['step_data']
if not key or not test:
return test
- key = key.startswith(form_key) and key or form_key + '-' + key
+ key = key.startswith(form_key) and key or \
+ not multi and form_key + '-' + key or \
+ form_key + '-0-' + key #only check if the first field is available
return key in request.session[storage.prefix]['step_data'][form_key]
@classmethod
- def session_get_value(cls, request, storage, form_key, key):
+ def session_get_value(cls, request, storage, form_key, key, multi=False):
"""
Get the value of a specific form
"""
- if not cls.session_has_key(request, storage, form_key, key):
+ if not cls.session_has_key(request, storage, form_key, key, multi):
return
- key = key.startswith(form_key) and key or form_key + '-' + key
- return request.session[storage.prefix]['step_data'][form_key][key]
+ if not multi:
+ key = key.startswith(form_key) and key or form_key + '-' + key
+ return request.session[storage.prefix]['step_data'][form_key][key]
+ vals = []
+ for k in request.session[storage.prefix]['step_data'][form_key]:
+ if k.startswith(form_key) and k.endswith(key) and \
+ request.session[storage.prefix]['step_data'][form_key][k]:
+ vals.append(request.session[storage.prefix]['step_data']\
+ [form_key][k])
+ return vals
def get_current_object(self, request, storage):
"""
@@ -1046,16 +1056,21 @@ class OperationWizard(Wizard):
def process_post_request(self, request, storage, *args, **kwargs):
"""
- Change the town form to a free selection town's form if no archaelogical
- file is provided
+ Change the town (and parcel) form to a free selection town's (parcel's)
+ form if no archaelogical file is provided
"""
file_key = 'general-' + self.url_name + '-associated_file'
if file_key in request.POST.keys():
- form_key = 'towns-' + self.url_name
+ town_form_key = 'towns-' + self.url_name
+ parcel_form_key = 'parcels-' + self.url_name
if request.POST[file_key]:
- self.form_list[unicode(form_key)] = SelectedTownFormSet
+ self.form_list[unicode(town_form_key)] = SelectedTownFormSet
+ self.form_list[unicode(parcel_form_key)] = SelectedParcelFormSet
else:
- self.form_list[unicode(form_key)] = SelectedTownGeneralFormSet
+ self.form_list[unicode(town_form_key)] = \
+ SelectedTownGeneralFormSet
+ self.form_list[unicode(parcel_form_key)] = \
+ SelectedParcelGeneralFormSet
return super(OperationWizard, self).process_post_request(request,
storage, *args, **kwargs)
@@ -1096,6 +1111,30 @@ class OperationWizard(Wizard):
except (ValueError, ObjectDoesNotExist):
pass
data['TOWNS'] = sorted(towns, key=lambda x:x[1])
+ elif step.startswith('parcels-') and hasattr(form, 'management_form'):
+ file_id = self.session_get_value(request, storage, general_form_key,
+ "associated_file")
+ if file_id:
+ parcels = []
+ try:
+ for parcel in models.File.objects.get(pk=int(file_id)
+ ).parcels.all():
+ parcels.append((parcel.pk, unicode(parcel)))
+ except (ValueError, ObjectDoesNotExist):
+ pass
+ data['PARCELS'] = sorted(parcels, key=lambda x:x[1])
+ else:
+ towns = []
+ town_form_key = 'towns-' + self.url_name
+ town_ids = self.session_get_value(request, storage,
+ town_form_key, 'town', multi=True)
+ for town_id in town_ids:
+ try:
+ town = models.Town.objects.get(pk=int(town_id))
+ towns.append((town.pk, unicode(town)))
+ except (ValueError, ObjectDoesNotExist):
+ pass
+ data['TOWNS'] = sorted(towns, key=lambda x:x[1])
data = data or None
form = super(OperationWizard, self).get_form(request, storage, step,
data, files)
@@ -1229,6 +1268,34 @@ SelectedTownGeneralFormSet = formset_factory(TownForm, can_delete=True,
formset=TownFormSet)
SelectedTownGeneralFormSet.form_label = _("Towns")
+class SelectedParcelForm(forms.Form):
+ form_label = _("Parcels")
+ associated_models = {'parcel':models.Parcel}
+ parcel = forms.ChoiceField(label=_("Parcel"), choices=(),
+ validators=[models.valid_id(models.Parcel)])
+ def __init__(self, *args, **kwargs):
+ parcels = None
+ if 'data' in kwargs and 'PARCELS' in kwargs['data']:
+ parcels = kwargs['data']['PARCELS']
+ # clean data if not "real" data
+ prefix_value = kwargs['prefix'] + '-parcel'
+ if not [k for k in kwargs['data'].keys()
+ if k.startswith(prefix_value) and kwargs['data'][k]]:
+ kwargs['data'] = None
+ if 'files' in kwargs:
+ kwargs.pop('files')
+ super(SelectedParcelForm, self).__init__(*args, **kwargs)
+ if parcels:
+ self.fields['parcel'].choices = [('', '--')] + parcels
+
+SelectedParcelFormSet = formset_factory(SelectedParcelForm, can_delete=True,
+ formset=ParcelFormSet)
+SelectedParcelFormSet.form_label = _("Parcels")
+
+SelectedParcelGeneralFormSet = formset_factory(ParcelForm, can_delete=True,
+ formset=ParcelFormSet)
+SelectedParcelGeneralFormSet.form_label = _("Parcels")
+
class RemainForm(forms.Form):
form_label = _("Remain types")
associated_models = {'remain':models.RemainType}
@@ -1261,6 +1328,7 @@ operation_creation_wizard = OperationWizard([
('general-operation_creation', OperationFormGeneral),
('refs-operation_creation', OperationFormReference),
('towns-operation_creation', SelectedTownFormSet),
+ ('parcels-operation_creation', SelectedParcelFormSet),
('remains-operation_creation', RemainFormSet),
('final-operation_creation', FinalForm)],
url_name='operation_creation',)
@@ -1270,6 +1338,7 @@ operation_modification_wizard = OperationWizard([
('general-operation_modification', OperationFormGeneral),
('refs-operation_modification', OperationFormReference),
('towns-operation_modification', SelectedTownFormSet),
+ ('parcels-operation_modification', SelectedParcelFormSet),
('remains-operation_modification', RemainFormSet),
('final-operation_modification', FinalForm)],
url_name='operation_modification',)
diff --git a/ishtar/furnitures/models.py b/ishtar/furnitures/models.py
index 445a0fed0..2b82fe6b4 100644
--- a/ishtar/furnitures/models.py
+++ b/ishtar/furnitures/models.py
@@ -396,7 +396,7 @@ class Operation(BaseHistorizedItem, OwnPerms):
class Parcel(LightHistorizedItem):
associated_file = models.ForeignKey(File, related_name='parcels',
blank=True, null=True, verbose_name=_(u"File"))
- operation = models.ForeignKey(Operation, related_name='parcel', blank=True,
+ operation = models.ForeignKey(Operation, related_name='parcels', blank=True,
null=True, verbose_name=_(u"Operation"))
year = models.IntegerField(_(u"Year"),
default=lambda:datetime.datetime.now().year)