diff options
-rw-r--r-- | ishtar/furnitures/forms.py | 77 | ||||
-rw-r--r-- | ishtar/furnitures/models.py | 3 |
2 files changed, 65 insertions, 15 deletions
diff --git a/ishtar/furnitures/forms.py b/ishtar/furnitures/forms.py index e3a982771..b59829784 100644 --- a/ishtar/furnitures/forms.py +++ b/ishtar/furnitures/forms.py @@ -201,18 +201,36 @@ class Wizard(NamedUrlSessionFormWizard): associated_models = hasattr(base_form, 'associated_models') and \ base_form.associated_models or {} if hasattr(form, 'forms'): + multi = False + if form.forms: + frm = form.forms[0] + fields = frm.fields.copy() + if 'DELETE' in fields: + fields.pop('DELETE') + multi = len(fields) > 1 + if multi: + assert hasattr(frm, 'base_model'), \ + u"Must define a base_model for " + unicode(frm.__class__) for frm in form.forms: if not frm.is_valid(): continue - for key in frm.cleaned_data: - if key not in associated_models: - # datas not managed + vals = {} + if "DELETE" in frm.cleaned_data: + if frm.cleaned_data["DELETE"]: continue + frm.cleaned_data.pop('DELETE') + for key in frm.cleaned_data: value = frm.cleaned_data[key] if not value and value != False: continue - value = associated_models[key].objects.get(pk=value) - m2m.append((key, value)) + if key in associated_models: + value = associated_models[key].objects.get(pk=value) + if multi: + vals[key] = value + else: + m2m.append((key, value)) + if multi and vals: + m2m.append((frm.base_model, vals)) elif type(form.cleaned_data) == dict: for key in form.cleaned_data: if key.startswith('hidden_'): @@ -250,8 +268,24 @@ class Wizard(NamedUrlSessionFormWizard): else: obj = self.get_saved_model()(**dct) obj.save() + m2m_items = {} for key, value in m2m: - if value not in getattr(obj, key+'s').all(): + if key not in m2m_items: + getattr(obj, key+'s').clear() + if type(key) == dict: + vals = [] + for item in getattr(obj, key+'s').all(): + v = {} + for k in value.keys(): + v[k] = getattr(item, k) + vals.append(v) + m2m_items[key] = vals + else: + m2m_items[key] = getattr(obj, key+'s').all() + if value not in m2m_items[key]: + if type(value) == dict: + value = getattr(obj, key+'s').model.objects.create(**value) + value.save() getattr(obj, key+'s').add(value) obj.save() res = render_to_response('wizard_done.html', {}, @@ -1607,7 +1641,7 @@ class RecordWizard(Wizard): form = self.get_form_list(request, storage)[step] current_object = self.get_current_object(request, storage) if step.startswith('general-') and current_object: - data['operation'] = current_object + data[self.model._meta.object_name] = current_object form = super(RecordWizard, self).get_form(request, storage, step, data, files) return form @@ -1616,14 +1650,19 @@ class RecordWizard(Wizard): return models.ContextRecord def get_current_saved_object(self, request, storage): - return None + """ + Permit a distinguo when saved model is not the base selected model + """ + if self.model == models.Operation: + return None + return self.get_current_object(request, storage) def save_model(self, dct, m2m, request, storage, form_list, return_object): if 'pk' in dct: dct.pop('pk') return super(RecordWizard, self).save_model(dct, m2m, request, storage, form_list, return_object) - + """ def done(self, request, storage, form_list, **kwargs): ''' Save datings @@ -1670,6 +1709,9 @@ class RecordWizard(Wizard): dating.save() obj.datings.add(dating) return res +""" +class RecordModifWizard(RecordWizard): + model = models.ContextRecord class RecordSelect(forms.Form): parcel__town = forms.IntegerField(label=_(u"Town"), @@ -1715,8 +1757,11 @@ class RecordFormGeneral(forms.Form): def __init__(self, *args, **kwargs): operation = None if 'data' in kwargs and kwargs['data'] and \ - 'operation' in kwargs['data']: - operation = kwargs['data']['operation'] + ('Operation' in kwargs['data'] or 'ContextRecord' in kwargs['data']): + if 'Operation' in kwargs['data']: + operation = kwargs['data']['Operation'] + if 'ContextRecord' in kwargs['data']: + operation = kwargs['data']['ContextRecord'].parcel.operation # clean data if not "real" data prefix_value = kwargs['prefix'] if not [k for k in kwargs['data'].keys() @@ -1737,6 +1782,10 @@ class RecordFormGeneral(forms.Form): class DatingForm(forms.Form): form_label = _("Datings") + base_model = 'dating' + associated_models = {'dating_type':models.DatingType, + 'quality':models.DatingQuality, + 'period':models.Period} period = forms.ChoiceField(label=_("Period"), choices=models.Period.get_types()) start_date = forms.IntegerField(label=_(u"Start date")) @@ -1766,8 +1815,8 @@ UnitFormSet.form_label = _("Unit") class RecordFormInterpretation(forms.Form): form_label = _("Interpretation") - associated_models = {'parcel':models.Parcel,} - has_furniture = forms.BooleanField(label=_(u"Has furniture?")) + has_furniture = forms.NullBooleanField(label=_(u"Has furniture?"), + required=False) filling = forms.CharField(label=_(u"Filling"), widget=forms.Textarea, required=False) interpretation = forms.CharField(label=_(u"Interpretation"), @@ -1788,7 +1837,7 @@ record_creation_wizard = RecordWizard([ ('final-record_creation', FinalForm)], url_name='record_creation',) -record_modification_wizard = RecordWizard([ +record_modification_wizard = RecordModifWizard([ ('selec-record_modification', RecordFormSelection), ('general-record_modification', RecordFormGeneral), ('datings-record_modification', DatingFormSet), diff --git a/ishtar/furnitures/models.py b/ishtar/furnitures/models.py index 78507f971..e93b74612 100644 --- a/ishtar/furnitures/models.py +++ b/ishtar/furnitures/models.py @@ -578,7 +578,8 @@ class ContextRecord(BaseHistorizedItem, OwnPerms): help_text=_(u"A short description of the location of the context record")) datings = models.ManyToManyField(Dating) units = models.ManyToManyField(Unit) - has_furniture = models.BooleanField(u"Has furniture?") + has_furniture = models.NullBooleanField(u"Has furniture?", blank=True, + null=True) filling = models.TextField(_(u"Filling"), blank=True, null=True) interpretation = models.TextField(_(u"Interpretation"), blank=True, null=True) |