77 lines
2.0 KiB
Python
77 lines
2.0 KiB
Python
from datetime import timedelta
|
|
from typing import Optional
|
|
|
|
import humanize
|
|
from flask import Request, current_app
|
|
|
|
from .responses import (
|
|
HttpResponse,
|
|
InvalidPayloadErrorResponse,
|
|
PayloadTooLargeErrorResponse,
|
|
)
|
|
|
|
|
|
def verify_extension_and_size(
|
|
file_type: str, req: Request
|
|
) -> Optional[HttpResponse]:
|
|
"""
|
|
Return error Response if file is invalid
|
|
"""
|
|
if 'file' not in req.files:
|
|
return InvalidPayloadErrorResponse('No file part.', 'fail')
|
|
|
|
file = req.files['file']
|
|
if not file.filename or file.filename == '':
|
|
return InvalidPayloadErrorResponse('No selected file.', 'fail')
|
|
|
|
allowed_extensions = (
|
|
'WORKOUT_ALLOWED_EXTENSIONS'
|
|
if file_type == 'workout'
|
|
else 'PICTURE_ALLOWED_EXTENSIONS'
|
|
)
|
|
|
|
file_extension = (
|
|
file.filename.rsplit('.', 1)[1].lower()
|
|
if '.' in file.filename
|
|
else None
|
|
)
|
|
max_file_size = current_app.config['max_single_file_size']
|
|
|
|
if not (
|
|
file_extension
|
|
and file_extension in current_app.config[allowed_extensions]
|
|
):
|
|
return InvalidPayloadErrorResponse(
|
|
'File extension not allowed.', 'fail'
|
|
)
|
|
|
|
if (
|
|
file_extension != 'zip'
|
|
and req.content_length is not None
|
|
and req.content_length > max_file_size
|
|
):
|
|
return PayloadTooLargeErrorResponse(
|
|
file_type=file_type,
|
|
file_size=req.content_length,
|
|
max_size=max_file_size,
|
|
)
|
|
|
|
return None
|
|
|
|
|
|
def get_readable_duration(duration: int, locale: Optional[str] = None) -> str:
|
|
"""
|
|
Return readable and localized duration from duration in seconds
|
|
"""
|
|
if locale is None:
|
|
locale = 'en'
|
|
if locale != 'en':
|
|
try:
|
|
_t = humanize.i18n.activate(locale) # noqa
|
|
except FileNotFoundError:
|
|
locale = 'en'
|
|
readable_duration = humanize.naturaldelta(timedelta(seconds=duration))
|
|
if locale != 'en':
|
|
humanize.i18n.deactivate()
|
|
return readable_duration
|