diff options
author | Étienne Loks <etienne.loks@iggdrasil.net> | 2018-05-14 21:08:44 +0200 |
---|---|---|
committer | Étienne Loks <etienne.loks@iggdrasil.net> | 2018-06-12 08:44:34 +0200 |
commit | 083985d6f383157b84e528701ba4be7cbd898fe3 (patch) | |
tree | 3d7c3e2f3217849df3cfe2f8e461792c08473fa4 /ishtar_common | |
parent | 7c9a9d586e5255b60179807934e780b3d38cd30e (diff) | |
download | Ishtar-083985d6f383157b84e528701ba4be7cbd898fe3.tar.bz2 Ishtar-083985d6f383157b84e528701ba4be7cbd898fe3.zip |
Authors for M2M images (refs #4076)
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"): |