summaryrefslogtreecommitdiff
path: root/ishtar_common
diff options
context:
space:
mode:
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
commit882cf2378f7b1af9d8f08a287c2f9fc96dd3742e (patch)
tree63fe35990e2ebbd07ed3bd229da15ef2b39e7211 /ishtar_common
parent1d271b86456cd182efb4646ce84c213c13b912ff (diff)
downloadIshtar-882cf2378f7b1af9d8f08a287c2f9fc96dd3742e.tar.bz2
Ishtar-882cf2378f7b1af9d8f08a287c2f9fc96dd3742e.zip
Imports: a web link can be put for images
Diffstat (limited to 'ishtar_common')
-rw-r--r--ishtar_common/forms_common.py41
-rw-r--r--ishtar_common/utils.py15
2 files changed, 53 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):
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