diff options
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 |
commit | 3aa079f4d19771dbb7e02bcd33927d4c8bfe6179 (patch) | |
tree | fa4bdd92fb48644dd2565d2c8651029f638a545d | |
parent | 69ced5d239c6bb4c05a83440ccd6f85c7ddc0b8e (diff) | |
download | Ishtar-3aa079f4d19771dbb7e02bcd33927d4c8bfe6179.tar.bz2 Ishtar-3aa079f4d19771dbb7e02bcd33927d4c8bfe6179.zip |
Link parcels to operations (closes #153)
-rw-r--r-- | ishtar/furnitures/forms.py | 91 | ||||
-rw-r--r-- | ishtar/furnitures/models.py | 2 |
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) |