1from pathlib import Path
2import urllib.parse
3from django.http import Http404
4from django.utils.module_loading import import_string
5from django.utils.translation import ugettext_lazy as _
6from django.http import JsonResponse
7from django.conf import settings
8from .forms import UploadFileForm
9from PIL import Image
10
11
12class NoImageException(Exception):
13    pass
14
15
16def get_storage_class():
17    if hasattr(settings, 'CKEDITOR5_FILE_STORAGE'):
18        return import_string(settings.CKEDITOR5_FILE_STORAGE)
19    return import_string(settings.DEFAULT_FILE_STORAGE)
20
21
22storage = get_storage_class()
23
24
25def image_verify(f):
26    try:
27        Image.open(f).verify()
28    except IOError:
29        raise NoImageException
30
31
32def handle_uploaded_file(f):
33    folder = getattr(settings, 'CKEDITOR_5_UPLOADS_FOLDER', 'django_ckeditor_5')
34    uploads_path = Path(settings.MEDIA_ROOT, folder)
35    fs = storage(location=uploads_path)
36    filename = fs.save(f.name, f)
37    return '/'.join([urllib.parse.urljoin(fs.base_url, folder), filename])
38
39
40def upload_file(request):
41    if request.method == 'POST' and request.user.is_staff:
42        form = UploadFileForm(request.POST, request.FILES)
43        try:
44            image_verify(request.FILES['upload'])
45        except NoImageException as ex:
46            return JsonResponse({
47                "error": {
48                    "message": "{}".format(str(ex))
49                }
50            })
51        if form.is_valid():
52            url = handle_uploaded_file(request.FILES['upload'])
53            return JsonResponse({'url': url})
54    raise Http404(_('Page not found.'))
55