From 4c1a86d67cd7424df57b0e6880152b309823f009 Mon Sep 17 00:00:00 2001 From: Patrick Kranzlmueller Date: Mon, 6 Jan 2020 16:12:31 +0100 Subject: [PATCH] support for django 3.0, see #380 --- .editorconfig | 5 ++ filebrowser/base.py | 14 ++++-- filebrowser/decorators.py | 9 ++-- .../commands/fb_version_generate.py | 7 ++- .../management/commands/fb_version_remove.py | 4 +- filebrowser/namers.py | 11 ++-- filebrowser/sites.py | 50 ++++++++++--------- filebrowser/storage.py | 5 +- filebrowser/utils.py | 12 ++--- tests/test_base.py | 10 ++-- tests/test_commands.py | 6 +-- 11 files changed, 73 insertions(+), 60 deletions(-) create mode 100644 .editorconfig diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 000000000..9fd6e22ea --- /dev/null +++ b/.editorconfig @@ -0,0 +1,5 @@ +[*.py] +known_django=django +known_filebrowser=filebrowser +known_grappelli=grappelli +sections=FUTURE,STDLIB,DJANGO,FILEBROWSER,GRAPPELLI,THIRDPARTY,FIRSTPARTY,LOCALFOLDER diff --git a/filebrowser/base.py b/filebrowser/base.py index 5b5d9fef0..a33799629 100644 --- a/filebrowser/base.py +++ b/filebrowser/base.py @@ -7,13 +7,17 @@ import tempfile import time +from six import python_2_unicode_compatible, string_types + from django.core.files import File -from django.utils.encoding import python_2_unicode_compatible, force_text -from django.utils.six import string_types +from django.utils.encoding import force_str from django.utils.functional import cached_property +from filebrowser.settings import (ADMIN_VERSIONS, DEFAULT_PERMISSIONS, + EXTENSIONS, IMAGE_MAXBLOCK, SELECT_FORMATS, + STRICT_PIL, VERSION_QUALITY, VERSIONS, + VERSIONS_BASEDIR) +from filebrowser.utils import get_modified_time, path_strip, process_image -from filebrowser.settings import EXTENSIONS, SELECT_FORMATS, VERSIONS, ADMIN_VERSIONS, VERSIONS_BASEDIR, VERSION_QUALITY, STRICT_PIL, IMAGE_MAXBLOCK, DEFAULT_PERMISSIONS -from filebrowser.utils import path_strip, process_image, get_modified_time from .namers import get_namer if STRICT_PIL: @@ -225,7 +229,7 @@ def __init__(self, path, site=None): self.mimetype = mimetypes.guess_type(self.filename) def __str__(self): - return force_text(self.path) + return force_str(self.path) @property def name(self): diff --git a/filebrowser/decorators.py b/filebrowser/decorators.py index 7ad840f27..5c9973338 100644 --- a/filebrowser/decorators.py +++ b/filebrowser/decorators.py @@ -4,16 +4,15 @@ from django.contrib import messages from django.core.exceptions import ImproperlyConfigured -from django.urls import reverse from django.http import HttpResponseRedirect -from django.utils.encoding import smart_text +from django.urls import reverse +from django.utils.encoding import smart_str from django.utils.translation import ugettext as _ - from filebrowser.templatetags.fb_tags import query_helper def get_path(path, site): - converted_path = smart_text(os.path.join(site.directory, path)) + converted_path = smart_str(os.path.join(site.directory, path)) if not path.startswith('.') and not os.path.isabs(converted_path): if site.storage.isdir(converted_path): return path @@ -21,7 +20,7 @@ def get_path(path, site): def get_file(path, filename, site): # Files and directories are valid - converted_path = smart_text(os.path.join(site.directory, path, filename)) + converted_path = smart_str(os.path.join(site.directory, path, filename)) if not path.startswith('.') and not filename.startswith('.') and not os.path.isabs(converted_path): if site.storage.isfile(converted_path) or site.storage.isdir(converted_path): return filename diff --git a/filebrowser/management/commands/fb_version_generate.py b/filebrowser/management/commands/fb_version_generate.py index 9138e769d..419240166 100644 --- a/filebrowser/management/commands/fb_version_generate.py +++ b/filebrowser/management/commands/fb_version_generate.py @@ -3,13 +3,12 @@ import os import re +from six.moves import input + from django.conf import settings from django.core.management.base import BaseCommand, CommandError -from django.utils.six.moves import input - from filebrowser.base import FileListing -from filebrowser.settings import EXTENSION_LIST, EXCLUDE, DIRECTORY, VERSIONS - +from filebrowser.settings import DIRECTORY, EXCLUDE, EXTENSION_LIST, VERSIONS filter_re = [] for exp in EXCLUDE: diff --git a/filebrowser/management/commands/fb_version_remove.py b/filebrowser/management/commands/fb_version_remove.py index 8d65d4901..ab378a273 100644 --- a/filebrowser/management/commands/fb_version_remove.py +++ b/filebrowser/management/commands/fb_version_remove.py @@ -3,10 +3,10 @@ import re import sys +from six.moves import input + from django.conf import settings from django.core.management.base import BaseCommand, CommandError -from django.utils.six.moves import input - from filebrowser.settings import EXCLUDE, EXTENSIONS diff --git a/filebrowser/namers.py b/filebrowser/namers.py index 902ac4981..d0342420d 100644 --- a/filebrowser/namers.py +++ b/filebrowser/namers.py @@ -1,10 +1,13 @@ from __future__ import unicode_literals + import re -from django.utils import six + +import six + +from django.utils.encoding import force_str from django.utils.module_loading import import_string -from django.utils.encoding import force_text -from .settings import VERSIONS, VERSION_NAMER +from .settings import VERSION_NAMER, VERSIONS def get_namer(**kwargs): @@ -35,7 +38,7 @@ class OptionsNamer(VersionNamer): def get_version_name(self): name = "{root}_{options}{extension}".format( - root=force_text(self.file_object.filename_root), + root=force_str(self.file_object.filename_root), options=self.options_as_string, extension=self.file_object.extension, ) diff --git a/filebrowser/sites.py b/filebrowser/sites.py index 14a372a58..8b1ef1fbe 100644 --- a/filebrowser/sites.py +++ b/filebrowser/sites.py @@ -2,34 +2,40 @@ import os import re -from time import gmtime, strftime, localtime, time +from time import gmtime, localtime, strftime, time from django import forms from django.contrib import messages from django.contrib.admin.views.decorators import staff_member_required -from django.core.files.storage import DefaultStorage, default_storage, FileSystemStorage -from django.core.paginator import Paginator, InvalidPage, EmptyPage -from django.urls import reverse, get_urlconf, get_resolver -from django.http import HttpResponseRedirect, HttpResponseBadRequest -from django.shortcuts import render, HttpResponse +from django.core.files.storage import (DefaultStorage, FileSystemStorage, + default_storage) +from django.core.paginator import EmptyPage, InvalidPage, Paginator +from django.http import HttpResponseBadRequest, HttpResponseRedirect +from django.shortcuts import HttpResponse, render from django.template import RequestContext as Context +from django.urls import get_resolver, get_urlconf, reverse +from django.utils.encoding import smart_str from django.utils.translation import ugettext as _ from django.views.decorators.cache import never_cache from django.views.decorators.csrf import csrf_exempt -try: - from django.utils.encoding import smart_text -except ImportError: - from django.utils.encoding import smart_unicode as smart_text - from filebrowser import signals +# Default actions +from filebrowser.actions import (flip_horizontal, flip_vertical, + rotate_90_clockwise, + rotate_90_counterclockwise, rotate_180) from filebrowser.base import FileListing, FileObject -from filebrowser.decorators import path_exists, file_exists +from filebrowser.decorators import file_exists, path_exists +from filebrowser.settings import (ADMIN_THUMBNAIL, ADMIN_VERSIONS, + CONVERT_FILENAME, DEFAULT_PERMISSIONS, + DEFAULT_SORTING_BY, DEFAULT_SORTING_ORDER, + DIRECTORY, EXCLUDE, EXTENSION_LIST, + EXTENSIONS, LIST_PER_PAGE, MAX_UPLOAD_SIZE, + NORMALIZE_FILENAME, OVERWRITE_EXISTING, + SEARCH_TRAVERSE, SELECT_FORMATS, + UPLOAD_TEMPDIR, VERSIONS, VERSIONS_BASEDIR) from filebrowser.storage import FileSystemStorageMixin from filebrowser.templatetags.fb_tags import query_helper from filebrowser.utils import convert_filename -from filebrowser.settings import (DIRECTORY, EXTENSIONS, SELECT_FORMATS, ADMIN_VERSIONS, ADMIN_THUMBNAIL, MAX_UPLOAD_SIZE, NORMALIZE_FILENAME, - CONVERT_FILENAME, SEARCH_TRAVERSE, EXCLUDE, VERSIONS, VERSIONS_BASEDIR, EXTENSION_LIST, DEFAULT_SORTING_BY, DEFAULT_SORTING_ORDER, - LIST_PER_PAGE, OVERWRITE_EXISTING, DEFAULT_PERMISSIONS, UPLOAD_TEMPDIR) try: import json @@ -576,20 +582,20 @@ def _upload_file(self, request): uploadedfile = handle_file_upload(path, filedata, site=self) if file_already_exists and OVERWRITE_EXISTING: - old_file = smart_text(file_path) - new_file = smart_text(uploadedfile) + old_file = smart_str(file_path) + new_file = smart_str(uploadedfile) self.storage.move(new_file, old_file, allow_overwrite=True) - full_path = FileObject(smart_text(old_file), site=self).path_full + full_path = FileObject(smart_str(old_file), site=self).path_full else: - file_name = smart_text(uploadedfile) + file_name = smart_str(uploadedfile) filedata.name = os.path.relpath(file_name, path) - full_path = FileObject(smart_text(file_name), site=self).path_full + full_path = FileObject(smart_str(file_name), site=self).path_full # set permissions if DEFAULT_PERMISSIONS is not None: os.chmod(full_path, DEFAULT_PERMISSIONS) - f = FileObject(smart_text(file_name), site=self) + f = FileObject(smart_str(file_name), site=self) signals.filebrowser_post_upload.send(sender=request, path=folder, file=f, site=self) # let Ajax Upload know whether we saved it or not @@ -600,8 +606,6 @@ def _upload_file(self, request): # Default FileBrowser site site = FileBrowserSite(name='filebrowser', storage=storage) -# Default actions -from filebrowser.actions import flip_horizontal, flip_vertical, rotate_90_clockwise, rotate_90_counterclockwise, rotate_180 site.add_action(flip_horizontal) site.add_action(flip_vertical) site.add_action(rotate_90_clockwise) diff --git a/filebrowser/storage.py b/filebrowser/storage.py index 5314238dd..8c03fec3d 100644 --- a/filebrowser/storage.py +++ b/filebrowser/storage.py @@ -4,8 +4,7 @@ import shutil from django.core.files.move import file_move_safe -from django.utils.encoding import smart_text - +from django.utils.encoding import smart_str from filebrowser.base import FileObject from filebrowser.settings import DEFAULT_PERMISSIONS @@ -72,7 +71,7 @@ def rmtree(self, name): shutil.rmtree(self.path(name)) def setpermission(self, name): - full_path = FileObject(smart_text(name), site=self).path_full + full_path = FileObject(smart_str(name), site=self).path_full os.chmod(full_path, DEFAULT_PERMISSIONS) diff --git a/filebrowser/utils.py b/filebrowser/utils.py index 583d1a218..4ebb5a5b7 100644 --- a/filebrowser/utils.py +++ b/filebrowser/utils.py @@ -1,15 +1,15 @@ # coding: utf-8 -import re +import math import os +import re import unicodedata -import math -from django.utils import six -from django.utils.module_loading import import_string +import six -from filebrowser.settings import STRICT_PIL, NORMALIZE_FILENAME, CONVERT_FILENAME -from filebrowser.settings import VERSION_PROCESSORS +from django.utils.module_loading import import_string +from filebrowser.settings import (CONVERT_FILENAME, NORMALIZE_FILENAME, + STRICT_PIL, VERSION_PROCESSORS) if STRICT_PIL: from PIL import Image diff --git a/tests/test_base.py b/tests/test_base.py index e99b800bc..04fd8da13 100644 --- a/tests/test_base.py +++ b/tests/test_base.py @@ -1,15 +1,15 @@ # coding: utf-8 -import os import ntpath +import os import posixpath import shutil -from mock import patch - -from filebrowser.base import FileObject, FileListing -from filebrowser.sites import site +from filebrowser.base import FileListing, FileObject from filebrowser.settings import VERSIONS +from filebrowser.sites import site + +from mock import patch from tests import FilebrowserTestCase as TestCase diff --git a/tests/test_commands.py b/tests/test_commands.py index e228806ec..fef0f37e9 100644 --- a/tests/test_commands.py +++ b/tests/test_commands.py @@ -1,13 +1,13 @@ # coding: utf-8 import os -import sys import shutil +import sys + +from six import StringIO from django.conf import settings from django.core.management import call_command -from django.utils.six import StringIO - from filebrowser.settings import DIRECTORY from tests import FilebrowserTestCase as TestCase