diff options
author | Étienne Loks <etienne.loks@iggdrasil.net> | 2018-05-16 19:53:11 +0200 |
---|---|---|
committer | Étienne Loks <etienne.loks@iggdrasil.net> | 2018-06-12 08:44:34 +0200 |
commit | 87c7271b298dced2423ba4e7daba8f9db4af91d0 (patch) | |
tree | 63fe35990e2ebbd07ed3bd229da15ef2b39e7211 | |
parent | 7f8e3f3f5d6c287fa826f62abd28edb5c48132ba (diff) | |
download | Ishtar-87c7271b298dced2423ba4e7daba8f9db4af91d0.tar.bz2 Ishtar-87c7271b298dced2423ba4e7daba8f9db4af91d0.zip |
Imports: a web link can be put for images
-rwxr-xr-x | install/ishtar-install | 2 | ||||
-rw-r--r-- | ishtar_common/forms_common.py | 41 | ||||
-rw-r--r-- | ishtar_common/utils.py | 15 | ||||
-rw-r--r-- | requirements.txt | 2 |
4 files changed, 56 insertions, 4 deletions
diff --git a/install/ishtar-install b/install/ishtar-install index 0c3300361..39680bab5 100755 --- a/install/ishtar-install +++ b/install/ishtar-install @@ -407,7 +407,7 @@ EOF echo ""; ( set -x; $sh_c 'sleep 3; apt-get install -t stretch-backports -y -q python-django' ) ( set -x; $sh_c 'sleep 3; apt-get install -y -q \ - python-django-registration libpangocairo-1.0-0 \ + python-django-registration libpangocairo-1.0-0 python-requests \ python-bs4 python-cffi python-django-compressor \ python-tidylib python-lxml python-imaging python-html5lib \ python-psycopg2 python-gdal gettext python-unicodecsv memcached \ 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): diff --git a/ishtar_common/utils.py b/ishtar_common/utils.py index 7c77fc3d1..b2ba2bc24 100644 --- a/ishtar_common/utils.py +++ b/ishtar_common/utils.py @@ -23,6 +23,7 @@ from itertools import chain import hashlib import os import random +import requests import shutil import subprocess import tempfile @@ -73,6 +74,20 @@ class MultiValueDict(BaseMultiValueDict): return lst +def is_downloadable(url): + """ + Does the url contain a downloadable resource + """ + h = requests.head(url, allow_redirects=True) + header = h.headers + content_type = header.get('content-type') + if 'text' in content_type.lower(): + return False + if 'html' in content_type.lower(): + return False + return True + + def get_current_year(): return datetime.datetime.now().year diff --git a/requirements.txt b/requirements.txt index 4ec0797fb..1d31390e6 100644 --- a/requirements.txt +++ b/requirements.txt @@ -6,6 +6,8 @@ Pillow==3.4.2 WeasyPrint==0.41 html5lib==0.999999999 +requests==2.12 + dbf==0.96.003 python-memcached==1.57 unicodecsv==0.14.1 |