Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Remote speed #133

Open
wants to merge 27 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
5653ea8
[SGP-remote_speed] disable thumbnails (for now)
abendig Aug 17, 2016
ce66285
[remote_speed] cleanup
abendig Aug 17, 2016
f6c1154
[remote_speed] wip
abendig Aug 17, 2016
0c77134
[remote_speed] wip
abendig Aug 18, 2016
93e16da
[remote_speed]
abendig Aug 18, 2016
6b2cf61
[remote_speed] revert
abendig Aug 18, 2016
dcf004c
[remote_speed] wit pp
abendig Aug 18, 2016
42cc3f5
[remote_speed] wip
abendig Aug 18, 2016
c995bb5
[remote_speed] wip
abendig Aug 18, 2016
2de20d3
[remote_speed] wip
abendig Aug 18, 2016
37428ba
[remote_speed] wip
abendig Aug 18, 2016
f054991
[remote_speed] wip
abendig Aug 18, 2016
197ee09
[remote_speed] avoid duplicate call to get_path, if possible
abendig Aug 18, 2016
b970673
[remote_speed] remove unnecessary calls to is_dir/modified date
abendig Aug 18, 2016
012064e
[remote_speed] skip directory check
abendig Aug 18, 2016
badfc8c
[remote_speed] cleanup
abendig Aug 18, 2016
e0d090e
[remote_speed] cleanup
abendig Aug 18, 2016
454c94c
[remote_speed] set _is_folder_stored on init
abendig Aug 18, 2016
88ec471
[remote_speed] wip
abendig Aug 18, 2016
bbed320
[remote_speed] use cloudinary urls
abendig Aug 23, 2016
420ed3b
[remote_speed] Pretend to be version 0.5.0+.
rbevers Feb 22, 2019
fca96c0
[SGP-6170] Fixes missing `size` attribute error. (#2)
rbevers Feb 26, 2019
2b48c1a
Update views to support Django 1.10
stephenmcd Jun 22, 2016
39504d2
because we don't install as egg, this is needed
caffodian Mar 19, 2019
d521860
Merge pull request #3 from startupgrind/SGP-6346
caffodian Mar 20, 2019
9e0ba64
Django 1.11 fix for FileBrowseWidget.render
stephenmcd May 31, 2017
ddda9c6
bumped version and cherrypicked again
caffodian Mar 25, 2019
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 29 additions & 0 deletions .circleci/config.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
version: 2

jobs:
python-unit-tests:
docker:
- image: circleci/python:2.7
auth:
username: $DOCKER_USER
password: $DOCKER_PASSWORD
steps:
- checkout
- run:
name: Run Mezzanine tests with this filebrowser
command: |
pip install virtualenv
virtualenv ~/venv
source ~/venv/bin/activate
./test.sh
- run:
name: Run filebrowser-safe unit tests
command: |
source ~/venv/bin/activate
python setup.py test

workflows:
version: 2
build-and-tests:
jobs:
- python-unit-tests
29 changes: 23 additions & 6 deletions filebrowser_safe/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,13 +35,25 @@ class FileObject():
where path is a relative path to a storage location.
"""

def __init__(self, path):
def __init__(self, path, **kwargs):
self.path = path
self.head = os.path.dirname(path)
self.filename = os.path.basename(path)
self.filename_lower = self.filename.lower()
self.filename_root, self.extension = os.path.splitext(self.filename)
self.mimetype = mimetypes.guess_type(self.filename)
is_dir = kwargs.pop("is_dir", None)
if is_dir:
self._filetype_stored = "Folder"
self._is_folder_stored = True
elif is_dir is not None:
self._is_folder_stored = False
self._filesize_stored = kwargs.pop("size", None)
self._exists_stored = kwargs.pop("exists", None)
modified_time = kwargs.pop("last_modified", None)
if modified_time:
self._date_stored = time.mktime(modified_time.timetuple())
self._url_stored = kwargs.pop("url", None)

def __str__(self):
return smart_str(self.path)
Expand Down Expand Up @@ -75,18 +87,19 @@ def _filetype(self):
_filesize_stored = None

def _filesize(self):
if self._filesize_stored != None:
if self._filesize_stored is not None:
return self._filesize_stored
if self.exists():
self._filesize_stored = default_storage.size(self.path)
return self._filesize_stored
return None
filesize = property(_filesize)
size = filesize

_date_stored = None

def _date(self):
if self._date_stored != None:
if self._date_stored is not None:
return self._date_stored
if self.exists():
self._date_stored = time.mktime(default_storage.modified_time(self.path).timetuple())
Expand All @@ -103,7 +116,7 @@ def _datetime(self):
_exists_stored = None

def exists(self):
if self._exists_stored == None:
if self._exists_stored is None:
self._exists_stored = default_storage.exists(self.path)
return self._exists_stored

Expand All @@ -114,8 +127,12 @@ def _path_relative_directory(self):
return path_strip(self.path, get_directory()).lstrip("/")
path_relative_directory = property(_path_relative_directory)

_url_stored = None

def _url(self):
return default_storage.url(self.path)
if self._url_stored is None:
self._url_stored = default_storage.url(self.path)
return self._url_stored
url = property(_url)

# FOLDER ATTRIBUTES
Expand Down Expand Up @@ -167,4 +184,4 @@ def delete_admin_versions(self):
try:
default_storage.delete(version)
except:
pass
pass
2 changes: 1 addition & 1 deletion filebrowser_safe/fields.py
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ def render(self, name, value, attrs=None):
fullpath = os.path.join(get_directory(), directory)
if not default_storage.isdir(fullpath):
default_storage.makedirs(fullpath)
final_attrs = self.build_attrs(attrs, type=self.input_type, name=name)
final_attrs = dict(type=self.input_type, name=name, **attrs)
final_attrs['search_icon'] = URL_FILEBROWSER_MEDIA + 'img/filebrowser_icon_show.gif'
final_attrs['directory'] = directory
final_attrs['extensions'] = self.extensions
Expand Down
12 changes: 7 additions & 5 deletions filebrowser_safe/functions.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,11 +25,13 @@ def get_directory():
from mezzanine.conf import settings as mezz_settings
from mezzanine.utils.sites import current_site_id
dirname = DIRECTORY
if getattr(mezz_settings, "MEDIA_LIBRARY_PER_SITE", False):
dirname = os.path.join(dirname, "site-%s" % current_site_id())
fullpath = os.path.join(mezz_settings.MEDIA_ROOT, dirname)
if not default_storage.isdir(fullpath):
default_storage.makedirs(fullpath)

#if getattr(mezz_settings, "MEDIA_LIBRARY_PER_SITE", False):
# dirname = os.path.join(dirname, "site-%s" % current_site_id())
#fullpath = os.path.join(mezz_settings.MEDIA_ROOT, dirname)
#if not default_storage.isdir(fullpath):
# default_storage.makedirs(fullpath)

return dirname


Expand Down
4 changes: 2 additions & 2 deletions filebrowser_safe/templates/filebrowser/custom_field.html
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
{% load mezzanine_tags i18n %}
{% load mezzanine_tags i18n image_tags %}
<style>
.mezz-fb-thumbnail {display:inline; margin-left:5px !important;}
.mezz-fb-thumbnail img {width:20px; height:20px; margin-top:0 !important;}
Expand All @@ -11,7 +11,7 @@
{% ifequal value.filetype "Image" %}
<p class="help mezz-fb-thumbnail" id="help_{{ final_attrs.id }}">
<a href="{{ value.url }}" target="_blank" id="link_{{ final_attrs.id }}">
<img id="image_{{ final_attrs.id }}" src="{{ MEDIA_URL }}{% thumbnail value.path 60 60 %}" class="preview" />
<img id="image_{{ final_attrs.id }}" src="{{ value|image_url:'width=60 height=60' }}" class="preview" />
</a>
</p>
{% else %}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
{% load i18n static fb_tags mezzanine_tags %}
{% load i18n static fb_tags mezzanine_tags image_tags %}

{% if query.pop %}
<style>
Expand All @@ -15,7 +15,7 @@
<td class="fb_icon">
{% selectable file.filetype query.type %}
{% if selectable %}
<a href="javascript://" onclick="FileSubmit('{{ file.path }}', '{{ file.url }}', '{{ MEDIA_URL }}{% ifequal file.filetype 'Image' %}{% thumbnail file.path 60 60 %}{% else %}{{ file.path }}{% endifequal %}', '{{ file.filetype }}');" class="fb_selectlink" title="{% trans 'Select' %}"></a>
<a href="javascript://" onclick="FileSubmit('{{ file.path }}', '{{ file.url }}', '{{ file|image_url:"width=60 height=60" }}', '{{ file.filetype }}');" class="fb_selectlink" title="{% trans 'Select' %}"></a>
{% else %}
<img src="{{ settings_var.URL_FILEBROWSER_MEDIA }}img/filebrowser_icon_select_disabled.gif" width="23" height="17" />
{% endif %}
Expand Down Expand Up @@ -72,7 +72,7 @@
{% if results_var.images_total %}
<td class="fb_icon">
{% ifequal file.filetype 'Image' %}
<a href="{{ file.url }}" target="_blank"><img src="{{ MEDIA_URL }}{% thumbnail file.path 60 60 %}" title="{% trans 'View Image' %}" /></a>
<a href="{{ file.url }}" target="_blank"><img src="{{ file|image_url:'width=60 height=60' }}" title="{% trans 'View Image' %}" /></a>
{% endifequal %}
</td>
{% endif %}
Expand Down Expand Up @@ -120,7 +120,7 @@
<strong>Relative URL</strong> {{ file.url_relative }}<br />
<strong>Full URL</strong> {{ file.url }}<br /><br />
<strong>URL for FileBrowseField</strong> {{ file.url }}<br />
<strong>Thumbnail URL</strong> {{ file.url_thumbnail }}
{# <strong>Thumbnail URL</strong> {{ file.url_thumbnail }} #}
{% ifequal file.filetype 'Image' %}<br /><br />
<strong>Dimensions</strong> {{ file.dimensions }}<br />
<strong>Width</strong> {{ file.width }}<br />
Expand Down
14 changes: 14 additions & 0 deletions filebrowser_safe/test_base.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
#!/usr/bin/env python
from __future__ import unicode_literals

import unittest


class FileObjectTests(unittest.TestCase):
"""Verify `FileObject` features."""

def test_size_is_filesize(self):
from filebrowser_safe.base import FileObject
fileobj = FileObject('foo/bar.jpg', size=17834)
self.assertEqual(fileobj.size, 17834)
self.assertEqual(fileobj.filesize, 17834)
52 changes: 34 additions & 18 deletions filebrowser_safe/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
from django.dispatch import Signal
from django import forms
from django.http import HttpResponseRedirect, HttpResponseBadRequest
from django.shortcuts import render_to_response, HttpResponse
from django.shortcuts import render, HttpResponse
from django.template import RequestContext as Context
from django.utils.translation import ugettext as _
from django.views.decorators.cache import never_cache
Expand Down Expand Up @@ -87,8 +87,14 @@ def browse(request):

# QUERY / PATH CHECK
query = request.GET.copy()
path = get_path(query.get('dir', ''))
directory = get_path('')
query_dir = query.get('dir', '')
path = get_path(query_dir)

# avoid duplicate call to get_path(), is possible
if query_dir:
directory = get_path('')
else:
directory = path

if path is None:
msg = _('The requested Folder does not exist.')
Expand All @@ -106,10 +112,12 @@ def browse(request):
for k, v in EXTENSIONS.items():
counter[k] = 0

dir_list, file_list = default_storage.listdir(abs_path)
file_records = default_storage.get_directory_entries_records(abs_path)
files = []
for file in dir_list + file_list:

request_filter_date = request.GET.get('filter_date', '')
request_filter_type = request.GET.get('filter_type', '')
for file_record in file_records:
file = file_record["name"]
# EXCLUDE FILES MATCHING VERSIONS_PREFIX OR ANY OF THE EXCLUDE PATTERNS
filtered = not file or file.startswith('.')
for re_prefix in filter_re:
Expand All @@ -122,11 +130,18 @@ def browse(request):
# CREATE FILEOBJECT
url_path = "/".join([s.strip("/") for s in
[get_directory(), path, file] if s.strip("/")])
fileobject = FileObject(url_path)
fileobject = FileObject(
url_path,
is_dir=file_record["is_dir"],
size=file_record["size"],
exists=file_record["exists"],
last_modified=file_record["last_modified"],
url=file_record["url"]
)

# FILTER / SEARCH
append = False
if fileobject.filetype == request.GET.get('filter_type', fileobject.filetype) and get_filterdate(request.GET.get('filter_date', ''), fileobject.date):
if (not request_filter_type or (fileobject.filetype == request.GET.get('filter_type', fileobject.filetype))) and (not request_filter_date or (request_filter_date and get_filterdate(request_filter_date, fileobject.date))):
append = True
if request.GET.get('q') and not re.compile(request.GET.get('q').lower(), re.M).search(file.lower()):
append = False
Expand All @@ -139,8 +154,9 @@ def browse(request):
results_var['images_total'] += 1
if fileobject.filetype != 'Folder':
results_var['delete_total'] += 1
elif fileobject.filetype == 'Folder' and fileobject.is_empty:
results_var['delete_total'] += 1
# Ignore for now.
#elif fileobject.filetype == 'Folder' and fileobject.is_empty:
# results_var['delete_total'] += 1
if query.get('type') and query.get('type') in SELECT_FORMATS and fileobject.filetype in SELECT_FORMATS[query.get('type')]:
results_var['select_total'] += 1
elif not query.get('type'):
Expand Down Expand Up @@ -176,7 +192,7 @@ def browse(request):
except (EmptyPage, InvalidPage):
page = p.page(p.num_pages)

return render_to_response('filebrowser/index.html', {
return render(request, 'filebrowser/index.html', {
'dir': path,
'p': p,
'page': page,
Expand All @@ -187,7 +203,7 @@ def browse(request):
'settings_var': get_settings_var(),
'breadcrumbs': get_breadcrumbs(query, path),
'breadcrumbs_title': ""
}, context_instance=Context(request))
})
browse = staff_member_required(never_cache(browse))


Expand Down Expand Up @@ -241,14 +257,14 @@ def mkdir(request):
else:
form = MakeDirForm(abs_path)

return render_to_response('filebrowser/makedir.html', {
return render(request, 'filebrowser/makedir.html', {
'form': form,
'query': query,
'title': _(u'New Folder'),
'settings_var': get_settings_var(),
'breadcrumbs': get_breadcrumbs(query, path),
'breadcrumbs_title': _(u'New Folder')
}, context_instance=Context(request))
})
mkdir = staff_member_required(never_cache(mkdir))


Expand All @@ -273,14 +289,14 @@ def upload(request):
engine = __import__(settings.SESSION_ENGINE, {}, {}, [''])
session_key = cookie_dict.get(settings.SESSION_COOKIE_NAME, None)

return render_to_response('filebrowser/upload.html', {
return render(request, 'filebrowser/upload.html', {
'query': query,
'title': _(u'Select files to upload'),
'settings_var': get_settings_var(),
'session_key': session_key,
'breadcrumbs': get_breadcrumbs(query, path),
'breadcrumbs_title': _(u'Upload')
}, context_instance=Context(request))
})
upload = staff_member_required(never_cache(upload))


Expand Down Expand Up @@ -476,13 +492,13 @@ def rename(request):
else:
form = RenameForm(abs_path, file_extension)

return render_to_response('filebrowser/rename.html', {
return render(request, 'filebrowser/rename.html', {
'form': form,
'query': query,
'file_extension': file_extension,
'title': _(u'Rename "%s"') % filename,
'settings_var': get_settings_var(),
'breadcrumbs': get_breadcrumbs(query, path),
'breadcrumbs_title': _(u'Rename')
}, context_instance=Context(request))
})
rename = staff_member_required(never_cache(rename))
19 changes: 19 additions & 0 deletions runtests.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
#!/usr/bin/env python
from __future__ import unicode_literals

import unittest

from django.conf import settings


settings.configure(
STATIC_URL = 'https://example.com/static',
DEBUG=True,
)


from filebrowser_safe.test_base import FileObjectTests


if __name__ == "__main__":
unittest.main()
3 changes: 2 additions & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@

setup(
name="filebrowser_safe",
version="0.4.3",
version="0.5.0.post5",
description="A snapshot of the filebrowser_3 branch of django-filebrowser, "
"packaged as a dependency for the Mezzanine CMS for Django.",
long_description=open("README.rst").read(),
Expand All @@ -15,4 +15,5 @@
packages=find_packages(),
include_package_data=True,
zip_safe=False,
test_suite="runtests",
)