159 lines
4.0 KiB
Python
159 lines
4.0 KiB
Python
from __future__ import absolute_import
|
|
from __future__ import division
|
|
from __future__ import print_function
|
|
from __future__ import unicode_literals
|
|
|
|
import time
|
|
import gzip
|
|
import shutil
|
|
import hashlib
|
|
|
|
|
|
import uuid
|
|
|
|
|
|
from django.core.exceptions import ValidationError
|
|
|
|
|
|
def format_pace_tick(x, pos=None): # pragma: no cover
|
|
minu = int(x/60)
|
|
sec = int(x-minu*60.)
|
|
sec_str = str(sec).zfill(2)
|
|
template = '%d:%s'
|
|
return template % (minu, sec_str)
|
|
|
|
|
|
def format_time_tick(x, pos=None): # pragma: no cover
|
|
hour = int(x/3600)
|
|
min = int((x-hour*3600.)/60)
|
|
min_str = str(min).zfill(2)
|
|
template = '%d:%s'
|
|
return template % (hour, min_str)
|
|
|
|
|
|
def format_pace(x, pos=None): # pragma: no cover
|
|
if isinf(x) or isnan(x):
|
|
x = 0
|
|
|
|
min = int(x/60)
|
|
sec = (x-min*60.)
|
|
|
|
str1 = "{min:0>2}:{sec:0>4.1f}".format(
|
|
min=min,
|
|
sec=sec
|
|
)
|
|
|
|
return str1
|
|
|
|
|
|
def format_time(x, pos=None): # pragma: no cover
|
|
|
|
min = int(x/60.)
|
|
sec = int(x-min*60)
|
|
|
|
str1 = "{min:0>2}:{sec:0>4.1f}".format(
|
|
min=min,
|
|
sec=sec,
|
|
)
|
|
|
|
return str1
|
|
|
|
|
|
def validate_image_extension(value):
|
|
import os
|
|
ext = os.path.splitext(value.name)[1].lower()
|
|
valid_extension = ['.jpg', '.jpeg', '.png', '.gif']
|
|
|
|
if not ext in valid_extension: # pragma: no cover
|
|
raise ValidationError(u'File not supported')
|
|
|
|
|
|
def validate_file_extension(value):
|
|
import os
|
|
ext = os.path.splitext(value.name)[1]
|
|
valid_extensions = ['.tcx', '.csv', '.TCX', '.gpx', '.GPX',
|
|
'.CSV', '.fit', '.FIT', '.zip', '.ZIP',
|
|
'.gz', '.GZ', '.xls',
|
|
'.jpg', '.jpeg', '.tiff', '.png', '.gif', '.bmp']
|
|
if not ext in valid_extensions: # pragma: no cover
|
|
raise ValidationError(u'File not supported!')
|
|
|
|
|
|
def must_be_csv(value):
|
|
import os
|
|
ext = os.path.splitext(value.name)[1]
|
|
valid_extensions = ['.csv', '.CSV']
|
|
if not ext in valid_extensions: # pragma: no cover
|
|
raise ValidationError(u'File not supported!')
|
|
|
|
|
|
def validate_kml(value):
|
|
import os
|
|
ext = os.path.splitext(value.name)[1]
|
|
valid_extensions = ['.kml', '.KML']
|
|
if not ext in valid_extensions: # pragma: no cover
|
|
raise ValidationError(u'File not supported!')
|
|
|
|
|
|
def handle_uploaded_image(i): # pragma: no cover
|
|
from io import StringIO, BytesIO
|
|
from PIL import Image, ImageOps, ExifTags
|
|
import os
|
|
from django.core.files import File
|
|
image_str = b''
|
|
for chunk in i.chunks():
|
|
image_str += chunk
|
|
|
|
imagefile = BytesIO(image_str)
|
|
|
|
image = Image.open(i)
|
|
|
|
try:
|
|
for orientation in ExifTags.TAGS.keys():
|
|
if ExifTags.TAGS[orientation] == 'Orientation':
|
|
break
|
|
exif = dict(image._getexif().items())
|
|
|
|
except (AttributeError, KeyError, IndexError):
|
|
# cases: image don't have getexif
|
|
exif = {'orientation': 0}
|
|
|
|
if image.mode not in ("L", "RGB"):
|
|
image = image.convert("RGB")
|
|
|
|
basewidth = 600
|
|
wpercent = (basewidth/float(image.size[0]))
|
|
hsize = int((float(image.size[1])*float(wpercent)))
|
|
image = image.resize((basewidth, hsize), Image.ANTIALIAS)
|
|
|
|
try:
|
|
if exif[orientation] == 3:
|
|
image = image.rotate(180, expand=True)
|
|
elif exif[orientation] == 6:
|
|
image = image.rotate(270, expand=True)
|
|
elif exif[orientation] == 8:
|
|
image = image.rotate(90, expand=True)
|
|
except KeyError:
|
|
pass
|
|
|
|
filename = hashlib.md5(imagefile.getvalue()).hexdigest()+'.jpg'
|
|
|
|
filename2 = os.path.join('static/plots/', filename)
|
|
image.save(filename2, 'JPEG')
|
|
|
|
return filename, filename2
|
|
|
|
|
|
def handle_uploaded_file(f):
|
|
fname = f.name
|
|
ext = fname.split('.')[-1]
|
|
fname = '%s.%s' % (uuid.uuid4(), ext)
|
|
#timestr = uuid.uuid4().hex[:10]+'-'+time.strftime("%Y%m%d-%H%M%S")
|
|
#fname = timestr+'-'+fname
|
|
fname2 = 'media/'+fname
|
|
with open(fname2, 'wb+') as destination:
|
|
for chunk in f.chunks():
|
|
destination.write(chunk)
|
|
|
|
return fname, fname2
|