diff options
Diffstat (limited to 'ishtar/furnitures/forms.py')
| -rw-r--r-- | ishtar/furnitures/forms.py | 77 | 
1 files changed, 63 insertions, 14 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), | 
