summaryrefslogtreecommitdiff
path: root/ishtar_common/forms_common.py
diff options
context:
space:
mode:
authorÉtienne Loks <etienne.loks@iggdrasil.net>2024-04-18 18:42:42 +0200
committerÉtienne Loks <etienne.loks@iggdrasil.net>2024-04-19 10:16:28 +0200
commit45769bc5b440183dd5e46b40ec2cdd364a3a01db (patch)
treeb5975ad978b4e9ef62b712aa5d2962b0c876db4e /ishtar_common/forms_common.py
parent7e631d9a322a8bb530652e7adac073d18baf326b (diff)
downloadIshtar-45769bc5b440183dd5e46b40ec2cdd364a3a01db.tar.bz2
Ishtar-45769bc5b440183dd5e46b40ec2cdd364a3a01db.zip
✨ imports: allow media import from a web location
Diffstat (limited to 'ishtar_common/forms_common.py')
-rw-r--r--ishtar_common/forms_common.py60
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 = {