diff options
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 |
commit | 875462381bc57b13a8ca6b68a52ad1ca065ef95e (patch) | |
tree | 68d54bb40b2006fc2a3d5ae938108e9b950eca59 /ishtar_common/forms_common.py | |
parent | fdd0231543be132b846e3bf12127cd01860f55bf (diff) | |
download | Ishtar-875462381bc57b13a8ca6b68a52ad1ca065ef95e.tar.bz2 Ishtar-875462381bc57b13a8ca6b68a52ad1ca065ef95e.zip |
Document form: add related fields (refs #4107)
Diffstat (limited to 'ishtar_common/forms_common.py')
-rw-r--r-- | ishtar_common/forms_common.py | 53 |
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): |