diff options
Diffstat (limited to 'ishtar_common/forms_common.py')
-rw-r--r-- | ishtar_common/forms_common.py | 41 |
1 files changed, 38 insertions, 3 deletions
diff --git a/ishtar_common/forms_common.py b/ishtar_common/forms_common.py index 061ae49b0..0a654ef8b 100644 --- a/ishtar_common/forms_common.py +++ b/ishtar_common/forms_common.py @@ -21,12 +21,16 @@ Administrative forms definitions: manage accounts and persons """ +import requests +import tempfile + from django import forms from django.conf import settings from django.contrib.auth.models import User from django.core import validators from django.core.cache import cache from django.core.exceptions import ObjectDoesNotExist +from django.core.files import File from django.forms.formsets import formset_factory from django.forms.models import BaseModelFormSet, BaseFormSet from django.utils.safestring import mark_safe @@ -39,6 +43,7 @@ from ishtar_common.templatetags.link_to_window import link_to_window from forms import FinalForm, FormSet, reverse_lazy, name_validator, \ TableSelect, ManageOldType, CustomForm, FieldType, \ FormSetWithDeleteSwitches, IshtarForm, get_data_from_formset +from ishtar_common.utils import is_downloadable def get_town_field(label=_(u"Town"), required=True): @@ -108,12 +113,17 @@ class NewItemForm(forms.Form): class NewImportForm(forms.ModelForm): error_css_class = 'error' required_css_class = 'required' + imported_images_link = forms.URLField( + label=_(u"Associated images (web link to a zip file)"), + required=False + ) class Meta: model = models.Import fields = ( - 'name', 'importer_type', 'imported_file', 'imported_images', - 'associated_group', 'conservative_import', 'encoding', 'skip_lines' + 'name', 'importer_type', 'imported_file', 'encoding', + 'imported_images', 'imported_images_link', + 'associated_group', 'conservative_import', 'skip_lines' ) def __init__(self, *args, **kwargs): @@ -141,11 +151,36 @@ class NewImportForm(forms.ModelForm): raise forms.ValidationError( _(u"This import type have no unicity type defined. " u"Conservative import is not possible.")) + if data.get('imported_images_link', None) \ + and data.get('imported_images', None): + raise forms.ValidationError( + _(u"You put either a file or a download link for images " + u"but not both.")) return data + def clean_imported_images_link(self): + value = self.cleaned_data.get('imported_images_link', None) + if not is_downloadable(value): + raise forms.ValidationError( + _(u"No file is available for this link.")) + return value + def save(self, user, commit=True): self.instance.user = user - return super(NewImportForm, self).save(commit) + imported_images_link = self.cleaned_data.pop('imported_images_link') \ + if 'imported_images_link' in self.cleaned_data else None + item = super(NewImportForm, self).save(commit) + if not imported_images_link: + return item + request = requests.get(imported_images_link, stream=True) + ntf = tempfile.NamedTemporaryFile() + for block in request.iter_content(1024 * 8): + if not block: + break + ntf.write(block) + file_name = imported_images_link.split('/')[-1] + item.imported_images.save(file_name, File(ntf)) + return item class TargetKeyForm(forms.ModelForm): |