Server IP : 85.214.239.14 / Your IP : 3.21.46.129 Web Server : Apache/2.4.62 (Debian) System : Linux h2886529.stratoserver.net 4.9.0 #1 SMP Tue Jan 9 19:45:01 MSK 2024 x86_64 User : www-data ( 33) PHP Version : 7.4.18 Disable Function : pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,pcntl_unshare, MySQL : OFF | cURL : OFF | WGET : ON | Perl : ON | Python : ON | Sudo : ON | Pkexec : OFF Directory : /proc/3/task/3/cwd/srv/modoboa/env/lib/python3.5/site-packages/ckeditor_uploader/ |
Upload File : |
from __future__ import absolute_import, unicode_literals import os from datetime import datetime from django.conf import settings from django.http import HttpResponse, JsonResponse from django.shortcuts import render from django.utils.html import escape from django.utils.module_loading import import_string from django.views import generic from django.views.decorators.csrf import csrf_exempt from ckeditor_uploader import utils from ckeditor_uploader.backends import registry from ckeditor_uploader.forms import SearchForm from ckeditor_uploader.utils import storage from .utils import is_valid_image_extension def _get_user_path(user): user_path = '' # If CKEDITOR_RESTRICT_BY_USER is True upload file to user specific path. RESTRICT_BY_USER = getattr(settings, 'CKEDITOR_RESTRICT_BY_USER', False) if RESTRICT_BY_USER: try: user_prop = getattr(user, RESTRICT_BY_USER) except (AttributeError, TypeError): user_prop = getattr(user, 'get_username') if callable(user_prop): user_path = user_prop() else: user_path = user_prop return str(user_path) def get_upload_filename(upload_name, user): user_path = _get_user_path(user) # Generate date based path to put uploaded file. # If CKEDITOR_RESTRICT_BY_DATE is True upload file to date specific path. if getattr(settings, 'CKEDITOR_RESTRICT_BY_DATE', True): date_path = datetime.now().strftime('%Y/%m/%d') else: date_path = '' # Complete upload path (upload_path + date_path). upload_path = os.path.join( settings.CKEDITOR_UPLOAD_PATH, user_path, date_path ) if (getattr(settings, 'CKEDITOR_UPLOAD_SLUGIFY_FILENAME', True) and not hasattr(settings, 'CKEDITOR_FILENAME_GENERATOR')): upload_name = utils.slugify_filename(upload_name) if hasattr(settings, 'CKEDITOR_FILENAME_GENERATOR'): generator = import_string(settings.CKEDITOR_FILENAME_GENERATOR) upload_name = generator(upload_name) return storage.get_available_name( os.path.join(upload_path, upload_name) ) class ImageUploadView(generic.View): http_method_names = ['post'] def post(self, request, **kwargs): """ Uploads a file and send back its URL to CKEditor. """ uploaded_file = request.FILES['upload'] backend = registry.get_backend() ck_func_num = request.GET.get('CKEditorFuncNum') if ck_func_num: ck_func_num = escape(ck_func_num) filewrapper = backend(storage, uploaded_file) allow_nonimages = getattr(settings, 'CKEDITOR_ALLOW_NONIMAGE_FILES', True) # Throws an error when an non-image file are uploaded. if not filewrapper.is_image and not allow_nonimages: return HttpResponse(""" <script type='text/javascript'> window.parent.CKEDITOR.tools.callFunction({0}, '', 'Invalid file type.'); </script>""".format(ck_func_num)) filepath = get_upload_filename(uploaded_file.name, request.user) saved_path = filewrapper.save_as(filepath) url = utils.get_media_url(saved_path) if ck_func_num: # Respond with Javascript sending ckeditor upload url. return HttpResponse(""" <script type='text/javascript'> window.parent.CKEDITOR.tools.callFunction({0}, '{1}'); </script>""".format(ck_func_num, url)) else: _, filename = os.path.split(saved_path) retdata = {'url': url, 'uploaded': '1', 'fileName': filename} return JsonResponse(retdata) upload = csrf_exempt(ImageUploadView.as_view()) def get_image_files(user=None, path=''): """ Recursively walks all dirs under upload dir and generates a list of full paths for each file found. """ # If a user is provided and CKEDITOR_RESTRICT_BY_USER is True, # limit images to user specific path, but not for superusers. STORAGE_DIRECTORIES = 0 STORAGE_FILES = 1 # allow browsing from anywhere if user is superuser # otherwise use the user path if user and not user.is_superuser: user_path = _get_user_path(user) else: user_path = '' browse_path = os.path.join(settings.CKEDITOR_UPLOAD_PATH, user_path, path) try: storage_list = storage.listdir(browse_path) except NotImplementedError: return except OSError: return for filename in storage_list[STORAGE_FILES]: if os.path.splitext(filename)[0].endswith('_thumb') or os.path.basename(filename).startswith('.'): continue filename = os.path.join(browse_path, filename) yield filename for directory in storage_list[STORAGE_DIRECTORIES]: if directory.startswith('.'): continue directory_path = os.path.join(path, directory) for element in get_image_files(user=user, path=directory_path): yield element def get_files_browse_urls(user=None): """ Recursively walks all dirs under upload dir and generates a list of thumbnail and full image URL's for each file found. """ files = [] for filename in get_image_files(user=user): src = utils.get_media_url(filename) if getattr(settings, 'CKEDITOR_IMAGE_BACKEND', None): if is_valid_image_extension(src): thumb = utils.get_media_url(utils.get_thumb_filename(filename)) else: thumb = utils.get_icon_filename(filename) visible_filename = os.path.split(filename)[1] if len(visible_filename) > 20: visible_filename = visible_filename[0:19] + '...' else: thumb = src visible_filename = os.path.split(filename)[1] files.append({ 'thumb': thumb, 'src': src, 'is_image': is_valid_image_extension(src), 'visible_filename': visible_filename, }) return files def browse(request): files = get_files_browse_urls(request.user) if request.method == 'POST': form = SearchForm(request.POST) if form.is_valid(): query = form.cleaned_data.get('q', '').lower() files = list(filter(lambda d: query in d[ 'visible_filename'].lower(), files)) else: form = SearchForm() show_dirs = getattr(settings, 'CKEDITOR_BROWSE_SHOW_DIRS', False) dir_list = sorted(set(os.path.dirname(f['src']) for f in files), reverse=True) # Ensures there are no objects created from Thumbs.db files - ran across # this problem while developing on Windows if os.name == 'nt': files = [f for f in files if os.path.basename(f['src']) != 'Thumbs.db'] context = { 'show_dirs': show_dirs, 'dirs': dir_list, 'files': files, 'form': form } return render(request, 'ckeditor/browse.html', context)