From 675a54aa05af42c29ae79a16ee25dfaa8a259230 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gina=20H=C3=A4u=C3=9Fge?= Date: Tue, 21 Mar 2017 13:15:43 +0100 Subject: [PATCH] Fix filter parameter and force parameter on /api/files/ --- src/octoprint/server/api/files.py | 31 +++++++++++++------------------ 1 file changed, 13 insertions(+), 18 deletions(-) diff --git a/src/octoprint/server/api/files.py b/src/octoprint/server/api/files.py index 87e4c047..4895760e 100644 --- a/src/octoprint/server/api/files.py +++ b/src/octoprint/server/api/files.py @@ -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/", 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: