Skip to content

Instantly share code, notes, and snippets.

@merwok
Last active October 24, 2023 18:13
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save merwok/3365ed649500baf0aae3a5f3263fa7b5 to your computer and use it in GitHub Desktop.
Save merwok/3365ed649500baf0aae3a5f3263fa7b5 to your computer and use it in GitHub Desktop.
Example code to reconcile django-storages and django-filebrowser-no-grappelli https://github.com/smacker/django-filebrowser-no-grappelli/issues/47
import posixpath
from filebrowser.storage import StorageMixin
from storages.backends.s3boto3 import S3Boto3Storage
class S3Storage(StorageMixin, S3Boto3Storage):
"""Integration between filebrowser and S3 storage."""
def isdir(self, name):
if not name:
# empty name is root dir
return True
return name.endswith("/")
def isfile(self, name):
return self.exists(name)
def move(self, old_file_name, new_file_name, allow_overwrite=False):
raise NotImplementedError()
def makedirs(self, name):
raise NotImplementedError("can't create directories")
def rmtree(self, name):
raise NotImplementedError("can't remote directory")
def setpermission(self, name):
pass
def path(self, name):
# needed for upload view
return posixpath.join("/", name)
@edumats
Copy link

edumats commented Dec 28, 2020

Hi, I am trying to make django-filebrowser-no-grappelli work with with s3 and I found your code, but it is giving me the following error:

TypeError at /admin/filebrowser/browse/

'<' not supported between instances of 'NoneType' and 'NoneType'

It seems that something breaks in filebrowser, but I can't understand why this happens. Here is the traceback for your reference:

Environment:

Request Method: GET
Request URL: http://127.0.0.1:8000/admin/filebrowser/browse/?pop=4&type=image

Django Version: 3.1.4
Python Version: 3.7.2
Installed Applications:
['filebrowser',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'posts.apps.PostsConfig',
'marketing.apps.MarketingConfig',
'users',
'django.contrib.sites',
'django.contrib.sitemaps',
'tinymce',
'crispy_forms',
'storages']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware']

Traceback (most recent call last):
File "/home/edumats/Projects/blog/venv/lib/python3.7/site-packages/django/core/handlers/exception.py", line 47, in inner
response = get_response(request)
File "/home/edumats/Projects/blog/venv/lib/python3.7/site-packages/django/core/handlers/base.py", line 179, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/home/edumats/Projects/blog/venv/lib/python3.7/site-packages/filebrowser/decorators.py", line 46, in decorator
return function(request, *args, **kwargs)
File "/home/edumats/Projects/blog/venv/lib/python3.7/site-packages/django/contrib/auth/decorators.py", line 21, in _wrapped_view
return view_func(request, *args, **kwargs)
File "/home/edumats/Projects/blog/venv/lib/python3.7/site-packages/django/views/decorators/cache.py", line 44, in _wrapped_view_func
response = view_func(request, *args, **kwargs)
File "/home/edumats/Projects/blog/venv/lib/python3.7/site-packages/django/views/decorators/clickjacking.py", line 33, in wrapped_view
resp = view_func(*args, **kwargs)
File "/home/edumats/Projects/blog/venv/lib/python3.7/site-packages/filebrowser/sites.py", line 310, in browse
listing = filelisting.files_listing_filtered()
File "/home/edumats/Projects/blog/venv/lib/python3.7/site-packages/filebrowser/base.py", line 160, in files_listing_filtered
listing = list(filter(self.filter_func, self.files_listing_total()))
File "/home/edumats/Projects/blog/venv/lib/python3.7/site-packages/filebrowser/base.py", line 137, in files_listing_total
files = self.sort_by_attr(files, self.sorting_by)
File "/home/edumats/Projects/blog/venv/lib/python3.7/site-packages/filebrowser/base.py", line 84, in sort_by_attr
return sorted(seq, key=attrgetter(*attr))

Exception Type: TypeError at /admin/filebrowser/browse/
Exception Value: '<' not supported between instances of 'NoneType' and 'NoneType'

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment