mirror of
https://github.com/inventree/InvenTree.git
synced 2025-04-30 04:26:44 +00:00
Some tweaks
- Add (unused) function to download an external file - JS tweaks
This commit is contained in:
parent
e0b4a59258
commit
0969edc431
@ -7,6 +7,7 @@ import json
|
|||||||
import os.path
|
import os.path
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
from PIL import Image
|
from PIL import Image
|
||||||
|
import requests
|
||||||
|
|
||||||
from wsgiref.util import FileWrapper
|
from wsgiref.util import FileWrapper
|
||||||
from django.http import StreamingHttpResponse
|
from django.http import StreamingHttpResponse
|
||||||
@ -34,6 +35,68 @@ def TestIfImageURL(url):
|
|||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
|
def DownloadExternalFile(url, **kwargs):
|
||||||
|
""" Attempt to download an external file
|
||||||
|
|
||||||
|
Args:
|
||||||
|
url - External URL
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
result = {
|
||||||
|
'status': False,
|
||||||
|
'url': url,
|
||||||
|
'file': None,
|
||||||
|
'status_code': 200,
|
||||||
|
}
|
||||||
|
|
||||||
|
headers = {'User-Agent': 'Mozilla/5.0'}
|
||||||
|
max_size = kwargs.get('max_size', 1048576) # 1MB default limit
|
||||||
|
|
||||||
|
# Get the HEAD for the file
|
||||||
|
try:
|
||||||
|
head = requests.head(url, stream=True, headers=headers)
|
||||||
|
except:
|
||||||
|
result['error'] = 'Error retrieving HEAD data'
|
||||||
|
return result
|
||||||
|
|
||||||
|
if not head.status_code == 200:
|
||||||
|
result['error'] = 'Incorrect HEAD status code'
|
||||||
|
result['status_code'] = head.status_code
|
||||||
|
return result
|
||||||
|
|
||||||
|
try:
|
||||||
|
filesize = int(head.headers['Content-Length'])
|
||||||
|
except ValueError:
|
||||||
|
result['error'] = 'Could not decode filesize'
|
||||||
|
result['extra'] = head.headers['Content-Length']
|
||||||
|
return result
|
||||||
|
|
||||||
|
if filesize > max_size:
|
||||||
|
result['error'] = 'File size too large ({s})'.format(s=filesize)
|
||||||
|
return result
|
||||||
|
|
||||||
|
# All checks have passed - download the file
|
||||||
|
|
||||||
|
try:
|
||||||
|
request = requests.get(url, stream=True, headers=headers)
|
||||||
|
except:
|
||||||
|
result['error'] = 'Error retriving GET data'
|
||||||
|
return result
|
||||||
|
|
||||||
|
try:
|
||||||
|
dl_file = io.StringIO(request.text)
|
||||||
|
result['status'] = True
|
||||||
|
result['file'] = dl_file
|
||||||
|
return result
|
||||||
|
except:
|
||||||
|
result['error'] = 'Could not convert downloaded data to file'
|
||||||
|
return result
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def str2bool(text, test=True):
|
def str2bool(text, test=True):
|
||||||
""" Test if a string 'looks' like a boolean value.
|
""" Test if a string 'looks' like a boolean value.
|
||||||
|
|
||||||
|
@ -319,7 +319,7 @@ class UploadPartImage(AjaxView):
|
|||||||
return JsonResponse(response, status=status)
|
return JsonResponse(response, status=status)
|
||||||
|
|
||||||
elif 'image_url' in request.POST:
|
elif 'image_url' in request.POST:
|
||||||
image_url = request.POST['image_url']
|
image_url = str(request.POST['image_url']).split('?')[0]
|
||||||
|
|
||||||
validator = URLValidator()
|
validator = URLValidator()
|
||||||
|
|
||||||
@ -334,6 +334,7 @@ class UploadPartImage(AjaxView):
|
|||||||
# Test the the URL at least looks like an image
|
# Test the the URL at least looks like an image
|
||||||
if not TestIfImageURL(image_url):
|
if not TestIfImageURL(image_url):
|
||||||
response['error'] = 'Invalid image URL'
|
response['error'] = 'Invalid image URL'
|
||||||
|
response['url'] = image_url
|
||||||
return JsonResponse(response, status=400)
|
return JsonResponse(response, status=400)
|
||||||
|
|
||||||
response['error'] = 'Cannot download cross-site images (yet)'
|
response['error'] = 'Cannot download cross-site images (yet)'
|
||||||
|
@ -16,11 +16,17 @@ function inventreeDocReady() {
|
|||||||
/* Add drag-n-drop functionality to any element
|
/* Add drag-n-drop functionality to any element
|
||||||
* marked with the class 'dropzone'
|
* marked with the class 'dropzone'
|
||||||
*/
|
*/
|
||||||
$('.dropzone').on('dragenter', function() {
|
$('.dropzone').on('dragenter', function(event) {
|
||||||
|
|
||||||
|
// TODO - Only indicate that a drop event will occur if a file is being dragged
|
||||||
|
var transfer = event.originalEvent.dataTransfer;
|
||||||
|
|
||||||
|
if (true || isFileTransfer(transfer)) {
|
||||||
$(this).addClass('dragover');
|
$(this).addClass('dragover');
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
$('.dropzone').on('dragleave drop', function() {
|
$('.dropzone').on('dragleave drop', function(event) {
|
||||||
$(this).removeClass('dragover');
|
$(this).removeClass('dragover');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user