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',) + | 
