summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
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
commit083985d6f383157b84e528701ba4be7cbd898fe3 (patch)
tree3d7c3e2f3217849df3cfe2f8e461792c08473fa4
parent7c9a9d586e5255b60179807934e780b3d38cd30e (diff)
downloadIshtar-083985d6f383157b84e528701ba4be7cbd898fe3.tar.bz2
Ishtar-083985d6f383157b84e528701ba4be7cbd898fe3.zip
Authors for M2M images (refs #4076)
-rw-r--r--ishtar_common/forms_common.py7
-rw-r--r--ishtar_common/widgets.py22
-rw-r--r--ishtar_common/wizards.py24
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"):