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 | 8b3347dd635eef93e7af1a71c4183630277a7f5f (patch) | |
| tree | 68d54bb40b2006fc2a3d5ae938108e9b950eca59 /ishtar_common/forms_common.py | |
| parent | 07f24f648504004adbb57b16bd18fbd23a3c3998 (diff) | |
| download | Ishtar-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.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): | 
