diff options
Diffstat (limited to 'ishtar_common/forms_common.py')
-rw-r--r-- | ishtar_common/forms_common.py | 60 |
1 files changed, 29 insertions, 31 deletions
diff --git a/ishtar_common/forms_common.py b/ishtar_common/forms_common.py index 6e0c23188..5b2c83f93 100644 --- a/ishtar_common/forms_common.py +++ b/ishtar_common/forms_common.py @@ -77,8 +77,9 @@ from .forms import ( ) from ishtar_common.data_importer import ImporterError from ishtar_common.utils import ( - is_downloadable, clean_session_cache, + get_file_from_link, + is_downloadable, max_size_help, max_value_current_year, reverse_coordinates, @@ -215,8 +216,8 @@ class BaseImportForm(IshtarForm, forms.ModelForm): error_css_class = "error" required_css_class = "required" importer_type = "tab" - imported_images_link = forms.URLField( - label=_("Associated images (web link to a zip file)"), required=False + imported_media_link = forms.URLField( + label=_("Associated media (web link to a zip file or a path)"), required=False ) class Meta: @@ -230,7 +231,7 @@ class BaseImportForm(IshtarForm, forms.ModelForm): "encoding", "csv_sep", "imported_images", - "imported_images_link", + "imported_media_link", ) widgets = { "imported_file": widgets.BSClearableFileInput, @@ -337,20 +338,9 @@ class BaseImportForm(IshtarForm, forms.ModelForm): return data -def get_archive_from_link(archive_link): - request = requests.get(archive_link, stream=True) - ntf = tempfile.NamedTemporaryFile() - for block in request.iter_content(1024 * 8): - if not block: - break - ntf.write(block) - file_name = archive_link.split("/")[-1] - return file_name, ntf - - class NewImportForm(BaseImportForm): - imported_images_link = forms.URLField( - label=_("Associated documents (web link to a zip file)"), required=False + imported_media_link = forms.URLField( + label=_("Associated media (web link to a zip file or a path)"), required=False ) class Meta: @@ -364,7 +354,7 @@ class NewImportForm(BaseImportForm): "encoding", "csv_sep", "imported_images", - "imported_images_link", + "imported_media_link", ) HEADERS = { @@ -373,16 +363,20 @@ class NewImportForm(BaseImportForm): "imported_images": FormHeader(_("Documents/Images")), } + def __init__(self, *args, **kwargs): + self.media_link_is_zip = False + super().__init__(*args, **kwargs) + def _need_archive(self, data): tpe = data["importer_type"] return tpe.archive_required def clean(self): data = super().clean() - if data.get("imported_images_link", None) and data.get("imported_images", None): + if data.get("imported_media_link", None) and data.get("imported_images", None): raise forms.ValidationError( _( - "You put either a file or a download link for images " + "You put either a file or a download link for media " "but not both." ) ) @@ -400,14 +394,14 @@ class NewImportForm(BaseImportForm): archive_required = self._need_archive(data) if archive_required and ( not data.get("imported_images", None) - and not data.get("imported_images_link", None) + and not data.get("imported_media_link", None) ): raise forms.ValidationError(_("This importer need a document archive.")) return data def clean_imported_images_link(self): - value = self.cleaned_data.get("imported_images_link", None) - if value: + value = self.cleaned_data.get("imported_media_link", None) + if value and value.lower().endswith(".zip"): try: if not is_downloadable(value): raise forms.ValidationError("") @@ -415,20 +409,24 @@ class NewImportForm(BaseImportForm): raise forms.ValidationError( _("Invalid link or no file is available for this link.") ) + self.media_link_is_zip = True return value def save(self, user, commit=True): self.instance.user = user - imported_images_link = ( - self.cleaned_data.pop("imported_images_link") - if "imported_images_link" in self.cleaned_data - else None - ) item = super().save(commit) - if not imported_images_link: + if not self.media_link_is_zip: return item - file_name, temp_file = get_archive_from_link(imported_images_link) + try: + file_name, temp_file = get_file_from_link(item.imported_media_link) + except ValueError: + raise forms.ValidationError( + _("Bad link for the archive.") + ) item.imported_images.save(file_name, File(temp_file)) + # media is downloaded - clean the link + item.imported_media_link = None + item.save() return item @@ -511,7 +509,7 @@ class NewImportGroupForm(NewImportForm): "encoding", "csv_sep", "imported_images", - "imported_images_link", + "imported_media_link", ) HEADERS = { |