diff options
Diffstat (limited to 'ishtar_common')
| -rw-r--r-- | ishtar_common/forms_common.py | 41 | ||||
| -rw-r--r-- | ishtar_common/utils.py | 15 | 
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 | 
