Fix filter parameter and force parameter on /api/files/<origin>

This commit is contained in:
Gina Häußge 2017-03-21 13:15:43 +01:00
parent 880b99faaf
commit 675a54aa05

View file

@ -63,7 +63,7 @@ def _create_lastmodified(path, recursive):
return None
def _create_etag(path, recursive, lm=None):
def _create_etag(path, filter, recursive, lm=None):
if lm is None:
lm = _create_lastmodified(path, recursive)
@ -72,6 +72,7 @@ def _create_etag(path, recursive, lm=None):
hash = hashlib.sha1()
hash.update(str(lm))
hash.update(str(filter))
hash.update(str(recursive))
if path.endswith("/files") or path.endswith("/files/sdcard"):
@ -83,20 +84,18 @@ def _create_etag(path, recursive, lm=None):
@api.route("/files", methods=["GET"])
@with_revalidation_checking(etag_factory=lambda lm=None: _create_etag(request.path,
request.values.get("filter", False),
request.values.get("recursive", False),
lm=lm),
lastmodified_factory=lambda: _create_lastmodified(request.path,
request.values.get("recursive", False)),
unless=lambda: request.values.get("force", False) or request.values.get("_refresh", False))
def readGcodeFiles():
filter = request.values.get("filter", "false") in valid_boolean_trues
filter = request.values.get("filter", False)
recursive = request.values.get("recursive", "false") in valid_boolean_trues
force = request.values.get("force", "false") in valid_boolean_trues
if force:
_clear_file_cache()
files = _getFileList(FileDestinations.LOCAL, filter=filter, recursive=recursive)
files = _getFileList(FileDestinations.LOCAL, filter=filter, recursive=recursive, allow_from_cache=not force)
files.extend(_getFileList(FileDestinations.SDCARD))
usage = psutil.disk_usage(settings().getBaseFolder("uploads"))
@ -105,6 +104,7 @@ def readGcodeFiles():
@api.route("/files/<string:origin>", methods=["GET"])
@with_revalidation_checking(etag_factory=lambda lm=None: _create_etag(request.path,
request.values.get("filter", False),
request.values.get("recursive", False),
lm=lm),
lastmodified_factory=lambda: _create_lastmodified(request.path,
@ -114,17 +114,11 @@ def readGcodeFilesForOrigin(origin):
if origin not in [FileDestinations.LOCAL, FileDestinations.SDCARD]:
return make_response("Unknown origin: %s" % origin, 404)
filter = request.values.get("filter", False)
recursive = request.values.get("recursive", "false") in valid_boolean_trues
force = request.values.get("force", "false") in valid_boolean_trues
if force:
with _file_cache_mutex:
try:
del _file_cache[origin]
except KeyError:
pass
files = _getFileList(origin, recursive=recursive)
files = _getFileList(origin, filter=filter, recursive=recursive, allow_from_cache=not force)
if origin == FileDestinations.LOCAL:
usage = psutil.disk_usage(settings().getBaseFolder("uploads"))
@ -144,7 +138,7 @@ def _getFileDetails(origin, path, recursive=True):
return None
def _getFileList(origin, path=None, filter=None, recursive=False):
def _getFileList(origin, path=None, filter=None, recursive=False, allow_from_cache=True):
if origin == FileDestinations.SDCARD:
sdFileList = printer.get_sd_files()
@ -169,11 +163,12 @@ def _getFileList(origin, path=None, filter=None, recursive=False):
filter_func = lambda entry, entry_data: octoprint.filemanager.valid_file_type(entry, type=filter)
with _file_cache_mutex:
files, lastmodified = _file_cache.get("{}:{}:{}:{}".format(origin, path, recursive, filter), ([], None))
if lastmodified is None or lastmodified < fileManager.last_modified(origin, path=path, recursive=recursive):
cache_key = "{}:{}:{}:{}".format(origin, path, recursive, filter)
files, lastmodified = _file_cache.get(cache_key, ([], None))
if not allow_from_cache or lastmodified is None or lastmodified < fileManager.last_modified(origin, path=path, recursive=recursive):
files = fileManager.list_files(origin, path=path, filter=filter_func, recursive=recursive)[origin].values()
lastmodified = fileManager.last_modified(origin, path=path, recursive=recursive)
_file_cache["{}:{}:{}:{}".format(origin, path, recursive, filter)] = (files, lastmodified)
_file_cache[cache_key] = (files, lastmodified)
def analyse_recursively(files, path=None):
if path is None: