summaryrefslogtreecommitdiff
path: root/ishtar_common/forms_common.py
diff options
context:
space:
mode:
authorÉtienne Loks <etienne.loks@iggdrasil.net>2018-06-07 16:52:02 +0200
committerÉtienne Loks <etienne.loks@iggdrasil.net>2018-06-12 10:46:13 +0200
commit8b3347dd635eef93e7af1a71c4183630277a7f5f (patch)
tree68d54bb40b2006fc2a3d5ae938108e9b950eca59 /ishtar_common/forms_common.py
parent07f24f648504004adbb57b16bd18fbd23a3c3998 (diff)
downloadIshtar-8b3347dd635eef93e7af1a71c4183630277a7f5f.tar.bz2
Ishtar-8b3347dd635eef93e7af1a71c4183630277a7f5f.zip
Document form: add related fields (refs #4107)
Diffstat (limited to 'ishtar_common/forms_common.py')
-rw-r--r--ishtar_common/forms_common.py53
1 files changed, 47 insertions, 6 deletions
diff --git a/ishtar_common/forms_common.py b/ishtar_common/forms_common.py
index 9abc6551a..0cfc2a609 100644
--- a/ishtar_common/forms_common.py
+++ b/ishtar_common/forms_common.py
@@ -41,7 +41,7 @@ import widgets
from bootstrap_datepicker.widgets import DatePicker
from ishtar_common.templatetags.link_to_window import link_to_window
from forms import FinalForm, FormSet, reverse_lazy, name_validator, \
- TableSelect, ManageOldType, CustomForm, FieldType, \
+ TableSelect, ManageOldType, CustomForm, FieldType, FormHeader, \
FormSetWithDeleteSwitches, IshtarForm, get_data_from_formset
from ishtar_common.utils import is_downloadable, clean_session_cache
@@ -1079,7 +1079,7 @@ class DocumentForm(forms.ModelForm, CustomForm, ManageOldType):
label=_(u"Image"), help_text=mark_safe(get_image_help()),
max_length=255, required=False, widget=widgets.ImageFileInput())
associated_file = forms.FileField(
- label=pgettext(u"File", u"Not directory"), max_length=255,
+ label=pgettext(u"Not directory", u"File"), max_length=255,
required=False)
reference = forms.CharField(
label=_(u"Reference"),
@@ -1111,12 +1111,31 @@ class DocumentForm(forms.ModelForm, CustomForm, ManageOldType):
class Meta:
model = models.Document
fields = [
- 'title', 'source_type', 'authors', 'associated_url', 'image',
- 'associated_file', 'reference', 'internal_reference',
- 'receipt_date', 'creation_date', 'receipt_date_in_documentation',
+ 'title', 'source_type', 'reference', 'internal_reference',
+ 'image', 'associated_file', 'associated_url',
+ 'authors', 'receipt_date',
+ 'receipt_date_in_documentation', 'creation_date',
'comment', 'description', 'additional_information', 'duplicate'
]
+ HEADERS = {
+ 'title': FormHeader(_(u"Identification")),
+ 'image': FormHeader(_(u"Content")),
+ 'authors': FormHeader(_(u"Authors")),
+ 'receipt_date': FormHeader(_(u"Dates")),
+ 'comment': FormHeader(_(u"Advanced"), collapse=True),
+ 'finds': FormHeader(_(u"Related items")),
+ }
+
+ def __init__(self, *args, **kwargs):
+ super(DocumentForm, self).__init__(*args, **kwargs)
+ for related_key in models.Document.RELATED_MODELS_ALT:
+ model = models.Document._meta.get_field(related_key).related_model
+ self.fields[related_key] = widgets.Select2MultipleField(
+ model=model, remote=True, label=model._meta.verbose_name_plural,
+ required=False, long_widget=True
+ )
+
def clean(self):
cleaned_data = self.cleaned_data
if not cleaned_data.get('title', None) and \
@@ -1126,7 +1145,29 @@ class DocumentForm(forms.ModelForm, CustomForm, ManageOldType):
raise forms.ValidationError(_(u"You should at least fill one of "
u"this field: title, url, image or "
u"file."))
- return cleaned_data
+ for rel in models.Document.RELATED_MODELS:
+ if cleaned_data.get(rel, None):
+ return cleaned_data
+ raise forms.ValidationError(_(u"A document have to attached at least "
+ u"to one item"))
+
+ def save(self, commit=True):
+ item = super(DocumentForm, self).save(commit=commit)
+ for related_key in models.Document.RELATED_MODELS:
+ related = getattr(item, related_key)
+ initial = dict([(item.pk, item)
+ for item in related.all()])
+ new = [int(pk)
+ for pk in sorted(self.cleaned_data.get(related_key, []))]
+ for pk in initial.keys():
+ if pk in new:
+ continue
+ related.remove(initial[pk])
+ for new_pk in new:
+ if new_pk in initial.keys():
+ continue
+ related.add(related.model.objects.get(pk=new_pk))
+ return item
class DocumentSelect(TableSelect):