diff options
Diffstat (limited to 'ishtar_common')
| -rw-r--r-- | ishtar_common/forms_common.py | 7 | ||||
| -rw-r--r-- | ishtar_common/widgets.py | 22 | ||||
| -rw-r--r-- | ishtar_common/wizards.py | 24 | 
3 files changed, 42 insertions, 11 deletions
diff --git a/ishtar_common/forms_common.py b/ishtar_common/forms_common.py index 9e082bccf..22cd81e7b 100644 --- a/ishtar_common/forms_common.py +++ b/ishtar_common/forms_common.py @@ -1089,7 +1089,8 @@ class BaseImageForm(ManageOldType):      form_label = _(u"Images")      base_model = 'image'      associated_models = {'licence': models.LicenseType, -                         'image_type': models.ImageType} +                         'image_type': models.ImageType, +                         'authors': models.Author}      pk = forms.IntegerField(label=" ", widget=forms.HiddenInput,                              required=False) @@ -1098,6 +1099,10 @@ class BaseImageForm(ManageOldType):          max_length=255, required=False, widget=widgets.ImageFileInput())      image_type = forms.ChoiceField(label=_(u"Type"), required=False, choices=[])      name = forms.CharField(label=_(u"Name"), max_length=250, required=False) +    authors = widgets.Select2MultipleField( +        model=models.Author, remote=True, label=_(u"Authors"), +        required=False, long_widget=True +    )      description = forms.CharField(label=_(u"Description"), required=False,                                    widget=forms.Textarea)      creation_date = forms.DateField( diff --git a/ishtar_common/widgets.py b/ishtar_common/widgets.py index 22e4901cf..e33669e19 100644 --- a/ishtar_common/widgets.py +++ b/ishtar_common/widgets.py @@ -229,12 +229,20 @@ class Select2MultipleField(forms.MultipleChoiceField):              if remote:                  self.remote = reverse_lazy(                      'autocomplete-' + self.model.__name__.lower()) +        long_widget = False +        if 'long_widget' in kwargs: +            long_widget = kwargs.pop('long_widget')          self.available = False          if 'available' in kwargs:              self.available = kwargs.pop('available') -        kwargs['widget'] = Select2Multiple(model=self.model, -                                           available=self.available, -                                           remote=self.remote) +        attrs = {} +        if long_widget: +            attrs['cols'] = True +            attrs['full-width'] = True +        kwargs['widget'] = Select2Multiple( +            model=self.model, available=self.available, remote=self.remote, +            attrs=attrs +        )          super(Select2MultipleField, self).__init__(*args, **kwargs)      def get_q(self): @@ -394,10 +402,12 @@ class JQueryAutoComplete(forms.TextInput):          self.dynamic_limit = dynamic_limit or []      def value_from_datadict(self, data, files, name): -        if self.multiple: -            return data.getlist(name, None) -        else: +        v = data.get(name, None) +        if not self.multiple:              return data.get(name, None) +        if type(v) == unicode and "," in v: +            return [item.strip() for item in v.split(',') if item.strip()] +        return data.getlist(name, None)      def render_js(self, field_id):          if isinstance(self.source, list): diff --git a/ishtar_common/wizards.py b/ishtar_common/wizards.py index 7556f5194..a6844b674 100644 --- a/ishtar_common/wizards.py +++ b/ishtar_common/wizards.py @@ -525,7 +525,7 @@ class Wizard(NamedUrlWizardView):                          frm.cleaned_data.pop('DELETE')                      for key in frm.cleaned_data:                          value = frm.cleaned_data[key] -                        if value is None or value in ['', []]: +                        if value is None or value in ['']:                              continue                          if key in associated_models:                              if type(value) in (tuple, list): @@ -745,7 +745,8 @@ class Wizard(NamedUrlWizardView):              related_data = {}  # used for intermediary models              # an intermediary model is used -            if not related_model.through._meta.auto_created: +            if hasattr(related_model, 'through') and \ +                    not related_model.through._meta.auto_created:                  for field in related_model.through._meta.get_fields():                      # is used for the obj or target                      if getattr(field, 'related_model', None) and \ @@ -765,7 +766,6 @@ class Wizard(NamedUrlWizardView):                      m2m_items[key] = vals                  else:                      m2m_items[key] = related_model.all() -              if value not in m2m_items[key]:                  if type(value) == dict:                      model = related_model.model @@ -839,6 +839,12 @@ class Wizard(NamedUrlWizardView):                              if k in value:                                  related_data[k] = value.pop(k) +                        # extract m2m values - not suitable for creation +                        m2m_values = {} +                        for k in value.keys(): +                            if type(value[k]) in (list, tuple): +                                m2m_values[k] = value.pop(k) +                          if get_or_create:                              value, created = model.objects.get_or_create(                                  **value) @@ -854,6 +860,9 @@ class Wizard(NamedUrlWizardView):                                  value = instance                              else:                                  value = model.objects.create(**value) + +                        for k in m2m_values: +                            setattr(value, k, m2m_values[k])                          value.save()  # force post_save                  # check that an item is not add multiple times (forged forms)                  if value not in related_model.all() and \ @@ -862,7 +871,8 @@ class Wizard(NamedUrlWizardView):                      # many to many and the value have been already managed                      # an intermediary model is used -                    if not related_model.through._meta.auto_created: +                    if hasattr(related_model, 'through') and \ +                            not related_model.through._meta.auto_created:                          for field in related_model.through._meta.get_fields():                              if hasattr(field, 'related_model') \                                      and field.related_model: @@ -1280,6 +1290,12 @@ class Wizard(NamedUrlWizardView):              value = getattr(child_obj, field)              if hasattr(value, 'pk'):                  value = value.pk +            elif hasattr(value, 'all'): +                vals.setlist(field, [ +                    unicode(v.pk) +                    for v in getattr(child_obj, field).all() +                ]) +                return vals              if value is not None:                  vals[field] = unicode(value)          elif hasattr(child_obj, field + "s"):  | 
