diff options
Diffstat (limited to 'ishtar/furnitures/forms.py')
-rw-r--r-- | ishtar/furnitures/forms.py | 160 |
1 files changed, 148 insertions, 12 deletions
diff --git a/ishtar/furnitures/forms.py b/ishtar/furnitures/forms.py index c79d70346..0cd704f53 100644 --- a/ishtar/furnitures/forms.py +++ b/ishtar/furnitures/forms.py @@ -260,14 +260,57 @@ class Wizard(NamedUrlSessionFormWizard): def save_model(self, dct, m2m, request, storage, form_list, return_object): dct = self.get_extra_model(dct, request, storage, form_list) obj = self.get_current_saved_object(request, storage) + + # manage dependant items + other_objs = {} + for k in dct.keys(): + if '__' not in k: + continue + vals = k.split('__') + assert len(vals) == 2, "Only one level of dependant item is managed" + dependant_item, key = vals + if dependant_item not in other_objs: + other_objs[dependant_item] = {} + other_objs[dependant_item][key] = dct.pop(k) if obj: for k in dct: if k.startswith('pk'): continue setattr(obj, k, dct[k]) + for dependant_item in other_objs: + c_item = getattr(obj, dependant_item) + if c_item: + # to check # + for k in other_objs[dependant_item]: + setattr(c_item, k, other_objs[dependant_item][k]) + c_item.save() + else: + m = getattr(self.model, dependant_item) + if hasattr(m, 'related'): + c_item = m.related.model(**other_objs[dependant_item]) + setattr(obj, dependant_item, c_item) + obj.save() + obj.save() else: + adds = {} + for dependant_item in other_objs: + m = getattr(self.model, dependant_item) + model = m.field.rel.to + c_dct = other_objs[dependant_item].copy() + if hasattr(model, 'history'): + c_dct['history_modifier'] = request.user + c_item = model(**c_dct) + c_item.save() + if hasattr(m, 'through'): + adds[dependant_item] = c_item + elif hasattr(m, 'field'): + dct[dependant_item] = c_item + if 'pk' in dct: + dct.pop('pk') obj = self.get_saved_model()(**dct) - obj.save() + obj.save() + for k in adds: + getattr(obj, k).add(adds[k]) m2m_items = {} for key, value in m2m: if key not in m2m_items: @@ -412,7 +455,7 @@ class Wizard(NamedUrlSessionFormWizard): idx = int(self.session_get_value(request, storage, main_form_key, 'pk')) current_obj = self.model.objects.get(pk=idx) - except(TypeError, ObjectDoesNotExist): + except(TypeError, ValueError, ObjectDoesNotExist): pass return current_obj @@ -456,15 +499,23 @@ class Wizard(NamedUrlSessionFormWizard): request.session[obj.__class__.__name__.lower()] = unicode(obj.pk) initial = {} if hasattr(c_form, 'base_fields'): - for field in c_form.base_fields.keys(): - if hasattr(obj, field): - value = getattr(obj, field) - if hasattr(value, 'pk'): - value = value.pk - if value in (True, False): - initial[field] = value - elif value != None: - initial[field] = unicode(value) + for base_field in c_form.base_fields.keys(): + fields = base_field.split('__') + value = obj + for field in fields: + if not hasattr(value, field) or \ + getattr(value, field) == None: + value = obj + break + value = getattr(value, field) + if value == obj: + continue + if hasattr(value, 'pk'): + value = value.pk + if value in (True, False): + initial[base_field] = value + elif value != None: + initial[base_field] = unicode(value) elif hasattr(c_form, 'management_form'): initial = [] key = current_step.split('-')[0] @@ -1768,7 +1819,7 @@ class RecordFormGeneral(forms.Form): ) class DatingForm(forms.Form): - form_label = _("Datings") + form_label = _("Dating") base_model = 'dating' associated_models = {'dating_type':models.DatingType, 'quality':models.DatingQuality, @@ -1849,3 +1900,88 @@ record_deletion_wizard = RecordDeletionWizard([ ('final-record_deletion', RecordDeletionForm)], url_name='record_deletion',) +class ItemWizard(Wizard): + model = models.Item + + def get_extra_model(self, dct, request, storage, form_list): + dct = super(ItemWizard, self).get_extra_model(dct, request, storage, + form_list) + dct['order'] = 1 + if 'pk' in dct and type(dct['pk']) == models.ContextRecord: + dct['base_items__context_record'] = dct.pop('pk') + return dct + +class ItemFormBase(forms.Form): + form_label = _("Base item") + base_model = 'base_items' + base_items__label = forms.CharField(label=_(u"General label"), + validators=[validators.MaxLengthValidator(60)]) + base_items__description = forms.CharField(label=_("General description"), + widget=forms.Textarea) + base_items__is_isolated = forms.NullBooleanField(label=_(u"Is isolated?"), + required=False) + +class ItemForm(forms.Form): + form_label = _("Item") + associated_models = {'material_type':models.MaterialType,} + label = forms.CharField(label=_(u"Label"), + validators=[validators.MaxLengthValidator(60)]) + description = forms.CharField(label=_("Precise description"), + widget=forms.Textarea) + material_type = forms.ChoiceField(label=_("Material type"), + choices=models.MaterialType.get_types()) + volume = forms.IntegerField(label=_(u"Volume")) + weight = forms.IntegerField(label=_(u"Weight")) + item_number = forms.IntegerField(label=_(u"Item number")) + +class DateForm(forms.Form): + form_label = _("Dating") + base_model = 'dating' + associated_models = {'dating__dating_type':models.DatingType, + 'dating__quality':models.DatingQuality, + 'dating__period':models.Period} + dating__period = forms.ChoiceField(label=_("Period"), + choices=models.Period.get_types()) + dating__start_date = forms.IntegerField(label=_(u"Start date")) + dating__end_date = forms.IntegerField(label=_(u"End date")) + dating__dating_type = forms.ChoiceField(label=_("Dating type"), + choices=models.DatingType.get_types()) + dating__quality = forms.ChoiceField(label=_("Quality"), + choices=models.DatingQuality.get_types()) + +item_creation_wizard = ItemWizard([ + ('selecrecord-item_creation', RecordFormSelection), + ('base_item-record_creation', ItemFormBase), + ('item-item_creation', ItemForm), + ('dating-item_creation', DateForm), + ('final-item_creation', FinalForm)], + url_name='item_creation',) + +class ItemSelect(forms.Form): + base_items__context_record__parcel__town = forms.IntegerField( + widget=widgets.JQueryAutoComplete("/" + settings.URL_PATH + \ + 'autocomplete-town', associated_model=models.Town), + validators=[models.valid_id(models.Town)], label=_(u"Town")) + base_items__context_record__parcel__year = forms.IntegerField( + label=_("Year")) + material_type = forms.ChoiceField( + label=_("Material type"), choices=models.MaterialType.get_types()) + dating__period = forms.ChoiceField( + label=_("Period"), choices=models.Period.get_types()) + +class ItemFormSelection(forms.Form): + form_label = _("Item") + associated_models = {'pk':models.Item} + currents = {'pk':models.Item} + pk = forms.IntegerField(label="", required=False, + widget=widgets.JQueryJqGrid(reverse_lazy('get-item'), + ItemSelect(), models.Item), + validators=[models.valid_id(models.Item)]) + +item_modification_wizard = ItemWizard([ + ('selec-item_modification', ItemFormSelection), + ('item-item_modification', ItemForm), + ('dating-item_modification', DateForm), + ('final-item_modification', FinalForm)], + url_name='item_modification',) + |